
    wBf)                       d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ ddl
mZmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,  ee-      Z.dZ/ e0d      Z1 G d de      Z2d&dZ3 ed      d'd       Z4d(dZ5 G d d e6      Z7 G d! d"e e7#      Z8 G d$ d%e      Z9y))z>Requests session configured with all accepted scheme adapters.    )annotations)fnmatch)	lru_cache)	getLogger)local   )
CondaError)dals)CONDA_HOMEPAGE_URL)context)add_username_and_passwordget_proxy_username_and_passsplit_anaconda_tokenurlparse)
ProxyErrorChannel   )read_binstar_tokens   )AuthBaseBaseAdapterRetrySession_basic_auth_strextract_cookies_to_jarget_auth_from_urlget_netrc_auth)
FTPAdapter)HTTPAdapter)LocalFSAdapter)	S3Adapter)httphttpsftps3filec                      e Zd Zd Zd Zy)EnforceUnusedAdapterc                H    t        d|j                  z        }t        |      )Nz|
        EnforceUnusedAdapter called with url %s
        This command is using a remote connection in offline mode.
        )r
   urlRuntimeError)selfrequestargskwargsmessages        Alib/python3.12/site-packages/conda/gateways/connection/session.pysendzEnforceUnusedAdapter.send8   s,     kk	
 7##    c                    t               N)NotImplementedError)r-   s    r2   closezEnforceUnusedAdapter.closeB   s    !##r4   N)__name__
__module____qualname__r3   r8    r4   r2   r)   r)   7   s    $$r4   r)   c                @    t        j                  |       j                  S )zO
    Given a URL, determine the channel it belongs to and return its name.
    )r   from_urlcanonical_name)r+   s    r2   get_channel_name_from_urlr@   F   s     C ///r4   N)maxsizec                N   t        |       }|
t               S i }t        j                  D ]  }|j	                  dd      }||k(  r|}t        |       }t        |      }|j                  |j                  k7  rM|j                  |j                  z   }|j                  |j                  z   }t        ||      s|} |j	                  dd      j                         xs d}	|	
t               S t        j                  j                  |	      }
|
s
t               S t         |
|            S )zt
    Function that determines the correct Session object to be returned
    based on the URL that is passed in.
    Nchannel auth)rE   )r@   CondaSessionr   channel_settingsgetr   schemenetlocpathr   stripplugin_managerget_auth_handler)r+   channel_namerG   settingsrC   
parsed_urlparsed_settingurl_without_schemapatternauth_handlerauth_handler_clss              r2   get_sessionrW   M   s+    -S1L ~ ,, (,,y"-l"' c]
!'*   J$5$55'..@ ''.*=*==%w/''(* $''399;CtL ~-->>|L~-l;<<r4   c                    | yt        | t              rt        |       S t        |       }|j                   d|j
                   d| j                   S )z_
    Function that determines which storage key to use for our CondaSession object caching
    default.z::)
isinstancetuplehashtyper:   r;   rO   )rE   	auth_types     r2   get_session_storage_keyr`      sU     |$DzT
I""#1Y%;%;$<Bt?P?P>QRRr4   c                  ,     e Zd ZdZ fdZ fdZ xZS )CondaSessionTypez
    Takes advice from https://github.com/requests/requests/issues/1871#issuecomment-33327847
    and creates one Session instance per thread.
    c                B    t               |d<   t        | 	  | |||      S )N_thread_local)r   super__new__)mcsnamebasesdct	__class__s       r2   rf   zCondaSessionType.__new__   s$    $wOwsD%55r4   c                6   t        |j                  d            }	 | j                  j                  |   S # t        $ r& t        |   di |}||i| j                  _        Y |S t        $ r, t        |   di |x}| j                  j                  |<   Y |S w xY w)NrE   r<   )r`   rH   rd   sessionsAttributeErrorre   __call__KeyError)clsr0   storage_keysessionrk   s       r2   ro   zCondaSessionType.__call__   s    -fjj.@A	$$--k:: 	@g&00G*5w)?C&   	@E@P AA Gc''00= 	s   6 +B$0BB)r9   r:   r;   __doc__rf   ro   __classcell__rk   s   @r2   rb   rb      s    
6 r4   rb   c                  2     e Zd Zdd fdZed        Z xZS )rF   c                   t         |           |xs
 t               | _        | j                  j                  t        j                         d}t        j                  dk(  r,	 ddl	}ddl
}|j                  |j                        }d| _        nt        j                  | _        t        j                   rSt#               }| j%                  d|       | j%                  d|       | j%                  d|       | j%                  d	|       nt'        t        j(                  t        j*                  g d
dd      }t-        ||      }| j%                  d|       | j%                  d|       | j%                  dt/                      | j%                  d	t1                      | j%                  dt3                      t        j4                  | j6                  d<   t        j8                  r&t        j:                  t        j8                  f| _        yt        j:                  rt        j:                  | _        yy# t        $ r t        d      w xY w)zY
        :param auth: Optionally provide ``requests.AuthBase`` compliant objects
        N
truststorer   zNThe `ssl_verify: truststore` setting is only supported onPython 3.10 or later.Tzhttp://zhttps://zftp://zs3://)i  i  i  i  F)totalbackoff_factorstatus_forcelistraise_on_statusrespect_retry_after_header)max_retriesssl_contextzfile://z
User-Agent)re   __init__CondaHttpAuthrE   proxiesupdater   proxy_servers
ssl_verifysslry   
SSLContextPROTOCOL_TLS_CLIENTImportErrorr	   verifyoffliner)   mountr   remote_max_retriesremote_backoff_factorr    r   r"   r!   
user_agentheadersclient_ssl_cert_keyclient_ssl_certcert)	r-   rE   r   r   ry   unused_adapterretryhttp_adapterrk   s	           r2   r   zCondaSession.__init__   s    	+MO	G112-
!(33C4K4KL DK!,,DK??13NJJy.1JJz>2JJx0JJw/ 00&<<!5 %+0E '5kRLJJy,/JJz<0JJx.JJw	,

9n./%,%7%7\"&& 00'2M2MNDI$$//DI %K   , s   "#H, ,Ic                l    	 | j                   j                  j                          y # t        $ r Y y w xY wr6   )rd   rm   clearrn   )rq   s    r2   cache_clearzCondaSession.cache_clear   s1    	&&,,. 		s   $' 	33r6   )rE   z!AuthBase | tuple[str, str] | None)r9   r:   r;   r   classmethodr   ru   rv   s   @r2   rF   rF      s    80t  r4   rF   )	metaclassc                  B    e Zd Zd Zed        Zed        Zed        Zy)r   c                    t         j                  |j                        |_        | j                  |       |j	                  d| j
                         |S )Nresponse)r   add_binstar_tokenr+   _apply_basic_authregister_hook
handle_407)r-   r.   s     r2   ro   zCondaHttpAuth.__call__   s?    #55gkkBw'j$//:r4   c                    t        | j                        }t        |      r|nd }|t        | j                        }t	        |t
              r#t        |      dk(  rt        | | j                  d<   | S )Nr   Authorization)	r   r+   anyr   r[   r\   lenr   r   )r.   url_authrE   s      r2   r   zCondaHttpAuth._apply_basic_auth   s^     %W[[1x=xd<!'++.DdE"s4yA~/>/EGOOO,r4   c                &   t        |       \  }}|st        j                  rpt               j	                         D ]U  \  }}|j                  |      st        j                  d|       ddlm	}  ||      }||_
        |j                  d      c S  | S )Nz"Adding anaconda token for url <%s>r   r   T)with_credentials)r   r   add_anaconda_tokenr   items
startswithlogdebugmodels.channelr   tokenr+   )r+   	clean_urlr   binstar_urlr   rC   s         r2   r   zCondaHttpAuth.add_binstar_token  s    /4	533&9&;&A&A&C >"U''4IIBIN9%i0G$)GM";;;==> 
r4   c           	        | j                   dk7  r| S | j                   | j                          |j                  d      }t	        | j
                        j                  }||vrt        t        d|dt         d            ||   }t        |      \  }}t        |||      }t        ||      }|||<   ||d<   | j                  j                         }t        |j                   | j                  | j"                         |j%                  |j                          ||j&                  d<    | j(                  j*                  |fi |}	|	j,                  j/                  |        ||	_        |	S )a  
        Prompts the user for the proxy username and password and modifies the
        proxy in the session object to include it.

        This method is modeled after
          * requests.auth.HTTPDigestAuth.handle_401()
          * requests.auth.HTTPProxyAuth
          * the previous conda.fetch.handle_proxy_407()

        It both adds 'username:password' to the proxy URL, as well as adding a
        'Proxy-Authorization' header.  If any of this is incorrect, please file an issue.

        i  r   z(
            Could not find a proxy for z. See
            z/docs/html#configure-conda-for-use-behind-a-proxy-server
            for more information on how to configure proxies.
            zProxy-Authorization)status_codecontentr8   popr   r+   rI   r   r
   r   r   r   r   r.   copyr   _cookiesrawprepare_cookiesr   
connectionr3   historyappend)
r   r0   r   proxy_scheme	proxy_urlusernamepasswordproxy_authorization_headerprep	_responses
             r2   r   zCondaHttpAuth.handle_407  sc   $ 3&O 	**Y'-44w&((4'7 8  !  L)	8F(-i8L	%4Xx%H" )#y$$&t}}h.>.>MT]]+.H*+,H'',,T<V<	  * 	r4   N)r9   r:   r;   ro   staticmethodr   r   r   r<   r4   r2   r   r      sC         8 8r4   r   )r+   strreturnz
str | None)r+   r   )r   r   ):rt   
__future__r   r   	functoolsr   loggingr   	threadingr   rD   r	   
auxlib.ishr
   base.constantsr   base.contextr   
common.urlr   r   r   r   
exceptionsr   r   r   anaconda_clientr   r   r   r   r   r   r   r   r   adapters.ftpr   adapters.httpr    adapters.localfsr!   adapters.s3r"   r9   r   RETRIES	frozensetCONDA_SESSION_SCHEMESr)   r@   rW   r`   r^   rb   rF   r   r<   r4   r2   <module>r      s    E "       0 #  % % 1	 	 	 % & , "
 " $; $0 4.= .=bSt 4A7&6 AH_H _r4   