
    DIeK&                       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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. e/d          Z0 G d de          Z1d)dZ2 ed          d*d             Z3d+d!Z4 G d" d#e5          Z6 G d$ d%ee6&          Z7 G d' d(e          Z8dS ),z>Requests session configured with all accepted scheme adapters.    )annotations)	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dS )EnforceUnusedAdapterc                N    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.11/site-packages/conda/gateways/connection/session.pysendzEnforceUnusedAdapter.send6   s2     k	
 
 7###    c                    t                      N)NotImplementedError)r,   s    r1   closezEnforceUnusedAdapter.close@   s    !###r3   N)__name__
__module____qualname__r2   r7    r3   r1   r(   r(   5   s2        $ $ $$ $ $ $ $r3   r(   r*   strreturn
str | Nonec                4    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    r1   get_channel_name_from_urlrB   D   s     C  //r3   N)maxsizec                   t          |           }|t                      S i }t          j        D ]}|                    d          |k    r|}|                    dd                                          pd}|t                      S t          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 )rF   )rB   CondaSessionr   channel_settingsgetstripplugin_managerget_auth_handler)r*   channel_namerI   settingsauth_handlerauth_handler_clss         r1   get_sessionrR   K   s     -S11L ~~ , ( (<<	""l22'#''3399;;CtL ~~->>|LL ~~--l;;<<<<r3   c                    | dS 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
    Ndefault.z::)
isinstancetuplehashtyper9   r:   rN   )rF   	auth_types     r1   get_session_storage_keyr[   l   s\     |y$ DzzT

I"RRY%;RRt?PRRRr3   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                n    t                      |d<   t                                          | |||          S )N_thread_local)r   super__new__)mcsnamebasesdct	__class__s       r1   ra   zCondaSessionType.__new__   s-    $wwOwwsD%555r3   c                F   t          |                    d                    }	 | j        j        |         S # t          $ r*  t                      j        di |}||i| j        _        Y n7t          $ r+  t                      j        di |x}| j        j        |<   Y nw xY w|S )NrF   r;   )r[   rJ   r_   sessionsAttributeErrorr`   __call__KeyError)clsr/   storage_keysessionrf   s       r1   rj   zCondaSessionType.__call__   s    -fjj.@.@AA	$-k:: 	@ 	@ 	@&egg&0000G*5w)?C&&& 	 	 	@P@P A AA A Gc'0===	
 s   7 1B*1BB)r8   r9   r:   __doc__ra   rj   __classcell__rf   s   @r1   r]   r]   {   s[         
6 6 6 6 6        r3   r]   c                  "     e Zd Zdd fdZ xZS )rH   NrF   !AuthBase | tuple[str, str] | Nonec                   t                                                       |pt                      | _        | j                            t          j                   d}t          j        dk    rI	 ddl	}ddl
}|                    |j                  }n# t          $ r t          d          w xY wd| _        nt          j        | _        t          j        rgt#                      }|                     d|           |                     d|           |                     d|           |                     d	|           nt'          t          j        t          j        g d
dd          }t-          ||          }|                     d|           |                     d|           |                     dt/                                 |                     d	t1                                 |                     dt3                                 t          j        | j        d<   t          j        rt          j        t          j        f| _        dS t          j        rt          j        | _        dS dS )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)r`   __init__CondaHttpAuthrF   proxiesupdater   proxy_servers
ssl_verifysslru   
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,   rF   r|   r   ru   unused_adapterretryhttp_adapterrf   s	           r1   r}   zCondaSession.__init__   sB    	+MOO	G1222--



!!!!(33C4KLL    .  
 DKK!,DK? 	-133NJJy.111JJz>222JJx000JJw//// 0&<!5!5!5 %+0  E '5kRRRLJJy,///JJz<000JJx...JJw	,,,

9n..///%,%7\"& 	0 0'2MNDIII$ 	0/DIII	0 	0s   ."B B+r5   )rF   rs   )r8   r9   r:   r}   rp   rq   s   @r1   rH   rH      sB        80 80 80 80 80 80 80 80 80 80 80r3   rH   )	metaclassc                  V    e Zd Zd Zed             Zed             Zed             ZdS )r~   c                    t                               |j                  |_        |                     |           |                    d| j                   |S )Nresponse)r~   add_binstar_tokenr*   _apply_basic_authregister_hook
handle_407)r,   r-   s     r1   rj   zCondaHttpAuth.__call__   sJ    #55gkBBw'''j$/:::r3   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   rV   rW   lenr   r   )r-   url_authrF   s      r1   r   zCondaHttpAuth._apply_basic_auth   sr     %W[11x==2xxd<!'+..DdE"" 	Fs4yyA~~/>/EGOO,r3   c                R   t          |           \  }}|st          j        rt                                                      D ]e\  }}|                    |          rKt                              d|           ddlm	}  ||          }||_
        |                    d          c S f| 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   rE   s         r1   r   zCondaHttpAuth.add_binstar_token   s    /44	5 	>3 	>&9&;&;&A&A&C&C > >"U''44 >IIBINNN999999%gi00G$)GM";;;=====> 
r3   c                   | j         dk    r| S | j         |                                  |                    d          }t	          | j                  j        }||vr5t          t          d	                    |t                                        ||         }t          |          \  }}t          |||          }t          ||          }|||<   ||d<   | j                                        }t!          |j        | j        | j                   |                    |j                   ||j        d<    | j        j        |fi |}	|	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 {!r}. See
            {}/docs/html#configure-conda-for-use-behind-a-proxy-server
            for more information on how to configure proxies.
            zProxy-Authorization)status_codecontentr7   popr   r*   schemer   r	   formatr
   r   r   r   r-   copyr   _cookiesrawprepare_cookiesr   
connectionr2   historyappend)
r   r/   r   proxy_scheme	proxy_urlusernamepasswordproxy_authorization_headerprep	_responses
             r1   r   zCondaHttpAuth.handle_407   s   $ 3&&O 	**Y''--4w&& $&8  
 
 
 L)	8FF(-i8LL	%4Xx%H%H" )#y$$&&t}h.>MMMT]+++.H*+,H',T<<V<<	  *** 	r3   N)r8   r9   r:   rj   staticmethodr   r   r   r;   r3   r1   r~   r~      st             \   \ : : \: : :r3   r~   )r*   r<   r=   r>   )r*   r<   )r=   r<   )9ro   
__future__r   	functoolsr   loggingr   	threadingr   rG   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!   r8   r   RETRIES	frozensetCONDA_SESSION_SCHEMESr(   rB   rR   r[   rY   r]   rH   r~   r;   r3   r1   <module>r      s   E D " " " " " "                               0 0 0 0 0 0 # # # # # #            % $ $ $ $ $ % % % % % % 1 1 1 1 1 1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 % $ $ $ $ $ & & & & & & , , , , , , " " " " " "i
 "	  $ $ $ $ $; $ $ $0 0 0 0 4= = = =@S S S S    t   490 90 90 90 907&6 90 90 90 90xa a a a aH a a a a ar3   