a
    _Aa'                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ d	Zd
Zdd ZG dd deZG dd deZG dd deZG dd deZdS )z]
requests.auth
~~~~~~~~~~~~~

This module contains the authentication handlers for Requests.
    N)	b64encode   )urlparsestr
basestring)extract_cookies_to_jar)to_native_string)parse_dict_headerz!application/x-www-form-urlencodedzmultipart/form-datac                 C   s   t | ts&tjd| td t| } t |tsPtjdt|td t|}t | trd| d} t |trx|d}dt	t
d| |f  }|S )zReturns a Basic Auth string.zNon-string usernames will no longer be supported in Requests 3.0.0. Please convert the object you've passed in ({!r}) to a string or bytes object in the near future to avoid problems.)categoryzNon-string passwords will no longer be supported in Requests 3.0.0. Please convert the object you've passed in ({!r}) to a string or bytes object in the near future to avoid problems.latin1zBasic    :)
isinstancer   warningswarnformatDeprecationWarningr   typeencoder   r   joinstrip)usernamepasswordZauthstr r   ,lib/python3.9/site-packages/requests/auth.py_basic_auth_str   s0    






r   c                   @   s   e Zd ZdZdd ZdS )AuthBasez4Base class that all auth implementations derive fromc                 C   s   t dd S )NzAuth hooks must be callable.)NotImplementedErrorselfrr   r   r   __call__K   s    zAuthBase.__call__N__name__
__module____qualname____doc__r    r   r   r   r   r   H   s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )HTTPBasicAuthz?Attaches HTTP Basic Authentication to the given Request object.c                 C   s   || _ || _d S N)r   r   r   r   r   r   r   r   __init__R   s    zHTTPBasicAuth.__init__c                 C   s(   t | jt|dd k| jt|dd kgS Nr   r   allr   getattrr   r   otherr   r   r   __eq__V   s    zHTTPBasicAuth.__eq__c                 C   s
   | |k S r'   r   r.   r   r   r   __ne__\   s    zHTTPBasicAuth.__ne__c                 C   s   t | j| j|jd< |S )NAuthorizationr   r   r   headersr   r   r   r   r    _   s    zHTTPBasicAuth.__call__N)r"   r#   r$   r%   r)   r0   r1   r    r   r   r   r   r&   O   s
   r&   c                   @   s   e Zd ZdZdd ZdS )HTTPProxyAuthz=Attaches HTTP Proxy Authentication to a given Request object.c                 C   s   t | j| j|jd< |S )NzProxy-Authorizationr3   r   r   r   r   r    g   s    zHTTPProxyAuth.__call__Nr!   r   r   r   r   r5   d   s   r5   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )HTTPDigestAuthz@Attaches HTTP Digest Authentication to the given Request object.c                 C   s   || _ || _t | _d S r'   )r   r   	threadinglocal_thread_localr(   r   r   r   r)   o   s    zHTTPDigestAuth.__init__c                 C   s@   t | jds<d| j_d| j_d| j_i | j_d | j_d | j_d S )NinitT r   )hasattrr9   r:   
last_noncenonce_countchalposnum_401_calls)r   r   r   r   init_per_thread_stateu   s    z$HTTPDigestAuth.init_per_thread_statec                    s  | j jd }| j jd }| j jd}| j jd}| j jd}d |du rTd}n| }|dksl|dkrzd	d
 }	|	 n@|dkrdd }
|
 n*|dkrdd }| n|dkrdd }|  fdd} du rdS d}t|}|jpd}|jr|d|j 7 }d| j|| jf }d||f } |} |}|| j j	krJ| j  j
d7  _
nd| j _
d| j j
 }t| j j
d}||d7 }|t d7 }|td7 }t| dd }|dkrЈ d|||f }|s||d||f }n<|dksd|d v r"d!|||d|f }|||}ndS || j _	d"| j||||f }|rT|d#| 7 }|rf|d$| 7 }|rx|d%| 7 }|r|d&||f 7 }d'| S )(z
        :rtype: str
        realmnonceqop	algorithmopaqueNZMD5zMD5-SESSc                 S   s"   t | tr| d} t|  S Nutf-8)r   r   r   hashlibZmd5	hexdigestxr   r   r   md5_utf8   s    

z4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8ZSHAc                 S   s"   t | tr| d} t|  S rH   )r   r   r   rJ   sha1rK   rL   r   r   r   sha_utf8   s    

z4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8zSHA-256c                 S   s"   t | tr| d} t|  S rH   )r   r   r   rJ   Zsha256rK   rL   r   r   r   sha256_utf8   s    

z7HTTPDigestAuth.build_digest_header.<locals>.sha256_utf8zSHA-512c                 S   s"   t | tr| d} t|  S rH   )r   r   r   rJ   Zsha512rK   rL   r   r   r   sha512_utf8   s    

z7HTTPDigestAuth.build_digest_header.<locals>.sha512_utf8c                    s    d| |f S )N%s:%sr   )sdZ	hash_utf8r   r   <lambda>       z4HTTPDigestAuth.build_digest_header.<locals>.<lambda>/?z%s:%s:%srS   r   z%08xrI         Zauth,z%s:%s:%s:%s:%sz>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z, opaque="%s"z, algorithm="%s"z, digest="%s"z , qop="auth", nc=%s, cnonce="%s"z	Digest %s)r9   r?   getupperr   pathqueryr   r   r=   r>   r   r   timectimeosurandomrJ   rO   rK   split)r   methodurlrC   rD   rE   rF   rG   Z
_algorithmrN   rP   rQ   rR   ZKDZentdigZp_parsedr`   ZA1ZA2ZHA1ZHA2ZncvaluerT   ZcnonceZrespdigZnoncebitbaser   rV   r   build_digest_header   s    


z"HTTPDigestAuth.build_digest_headerc                 K   s   |j rd| j_dS )z)Reset num_401_calls counter on redirects.r   N)Zis_redirectr9   rA   )r   r   kwargsr   r   r   handle_redirect   s    zHTTPDigestAuth.handle_redirectc                 K   s&  d|j   krdk s$n d| j_|S | jjdurB|jj| jj |jdd}d|	 v r| jjdk r| j jd7  _t
jd	t
jd
}t|jd|dd| j_|j |  |j }t|j|j|j ||j | |j|j|jd< |jj|fi |}|j| ||_|S d| j_|S )zo
        Takes the given response and tries digest-auth, if needed.

        :rtype: requests.Response
        i  i  r   Nzwww-authenticater;   Zdigest   zdigest )flags)countr2   )Zstatus_coder9   rA   r@   Zrequestbodyseekr4   r^   lowerrecompile
IGNORECASEr	   subr?   Zcontentclosecopyr   Z_cookiesrawZprepare_cookiesrj   rg   rh   Z
connectionsendhistoryappend)r   r   rk   Zs_authpatZprepZ_rr   r   r   
handle_401   s0    	

zHTTPDigestAuth.handle_401c                 C   s|   |    | jjr&| |j|j|jd< z|j | j_	W n t
yR   d | j_	Y n0 |d| j |d| j d| j_|S )Nr2   Zresponser   )rB   r9   r=   rj   rg   rh   r4   rp   tellr@   AttributeErrorZregister_hookr~   rl   rA   r   r   r   r   r      s    zHTTPDigestAuth.__call__c                 C   s(   t | jt|dd k| jt|dd kgS r*   r+   r.   r   r   r   r0   *  s    zHTTPDigestAuth.__eq__c                 C   s
   | |k S r'   r   r.   r   r   r   r1   0  s    zHTTPDigestAuth.__ne__N)r"   r#   r$   r%   r)   rB   rj   rl   r~   r    r0   r1   r   r   r   r   r6   l   s   
f,r6   )r%   rd   rs   rb   rJ   r7   r   base64r   compatr   r   r   Zcookiesr   Z_internal_utilsr   Zutilsr	   ZCONTENT_TYPE_FORM_URLENCODEDZCONTENT_TYPE_MULTI_PARTr   objectr   r&   r5   r6   r   r   r   r   <module>   s$   ,