
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
æÈ[Þ'  ã               @   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j| ƒtd� t| ƒ} t |tƒsLtjdj|ƒtd� t|ƒ}t | tƒr`| jdƒ} t |tƒrt|jdƒ}dtt	dj
| |fƒƒjƒ ƒ }|S )zReturns a Basic Auth string.z·Non-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.)Úcategoryz·Non-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   Úencoder   r   ÚjoinÚstrip)ÚusernameÚpasswordZauthstr© r   ú/usr/lib/python3.6/auth.pyÚ_basic_auth_str   s&    






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 )Nr   )r   r'   r   r   r   Ú__ne__\   s    zHTTPBasicAuth.__ne__c             C   s   t | j| jƒ|jd< |S )NÚAuthorization)r   r   r   Úheaders)r   r   r   r   r   r   _   s    zHTTPBasicAuth.__call__N)r   r    r!   r"   r$   r(   r)   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-Authorization)r   r   r   r+   )r   r   r   r   r   r   g   s    zHTTPProxyAuth.__call__N)r   r    r!   r"   r   r   r   r   r   r,   d   s   r,   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jƒ | _d S )N)r   r   Ú	threadingZlocalÚ_thread_local)r   r   r   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   )Úhasattrr/   r0   Ú
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jdƒ}| j jjdƒ}| j jjdƒ}d‰ |dkrTd}n|jƒ }|dksl|dkrzd	d
„ }	|	‰ n@|dkr�dd„ }
|
‰ n*|dkr¦dd„ }|‰ n|dkrºdd„ }|‰ ‡ fdd„}ˆ dkrÒdS d}t|ƒ}|jpæd}|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
ƒjdƒ}||jdƒ7 }|tjƒ jdƒ7 }|tjdƒ7 }tj|ƒjƒ dd… }|dk�rÐˆ d|||f ƒ}|�sê||d||f ƒ}n<|dk�sd|jd ƒk�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| jdƒ} tj| ƒjƒ S )Nz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| jdƒ} tj| ƒjƒ S )Nzutf-8)r   r   r   r>   Úsha1r?   )r@   r   r   r   Úsha_utf8—   s    

z4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8zSHA-256c             S   s"   t | tƒr| jdƒ} tj| ƒjƒ S )Nzutf-8)r   r   r   r>   Zsha256r?   )r@   r   r   r   Úsha256_utf8�   s    

z7HTTPDigestAuth.build_digest_header.<locals>.sha256_utf8zSHA-512c             S   s"   t | tƒr| jdƒ} tj| ƒjƒ S )Nzutf-8)r   r   r   r>   Zsha512r?   )r@   r   r   r   Úsha512_utf8£   s    

z7HTTPDigestAuth.build_digest_header.<locals>.sha512_utf8c                s   ˆ d| |f ƒS )Nz%s:%sr   )ÚsÚd)Ú	hash_utf8r   r   Ú<lambda>©   s    z4HTTPDigestAuth.build_digest_header.<locals>.<lambda>ú/ú?z%s:%s:%sz%s:%sr   z%08xzutf-8é   é   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)r/   r5   ÚgetÚupperr   ÚpathZqueryr   r   r3   r4   r   r   ÚtimeZctimeÚosÚurandomr>   rB   r?   Úsplit)r   ÚmethodÚurlr9   r:   r;   r<   r=   Z
_algorithmrA   rC   rD   rE   ZKDZentdigZp_parsedrQ   ZA1ZA2ZHA1ZHA2ZncvaluerF   ZcnonceZrespdigZnoncebitÚbaser   )rH   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_redirectr/   r7   )r   r   Úkwargsr   r   r   Úhandle_redirectå   s    zHTTPDigestAuth.handle_redirectc             K   s"  d|j   kodk n  s&d| j_|S | jjdk	rD|jjj| jjƒ |jjddƒ}d|j	ƒ koh| jjdk �r| j jd7  _t
jd	t
jd
�}t|jd|dd�ƒ| j_|j |jƒ  |jjƒ }t|j|j|jƒ |j|jƒ | j|j|jƒ|jd< |jj|f|Ž}|jj|ƒ ||_|S d| j_|S )zo
        Takes the given response and tries digest-auth, if needed.

        :rtype: requests.Response
        i�  iô  r   Nzwww-authenticater1   Zdigesté   zdigest )Úflags)Úcountr*   )Zstatus_coder/   r7   r6   ZrequestÚbodyÚseekr+   rO   ÚlowerÚreÚcompileÚ
IGNORECASEr	   Úsubr5   ZcontentÚcloseÚcopyr   Z_cookiesÚrawZprepare_cookiesrY   rV   rW   Z
connectionÚsendÚhistoryÚappend)r   r   rZ   Zs_authZpatZprepZ_rr   r   r   Ú
handle_401ê   s.    	
zHTTPDigestAuth.handle_401c             C   s~   | j ƒ  | jjr&| j|j|jƒ|jd< y|jjƒ | j_	W n t
k
rT   d | j_	Y nX |jd| jƒ |jd| jƒ d| j_|S )Nr*   Zresponser   )r8   r/   r3   rY   rV   rW   r+   r_   Útellr6   ÚAttributeErrorZregister_hookrl   r[   r7   )r   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 )Nr   r   )r%   r   r&   r   )r   r'   r   r   r   r(   *  s    zHTTPDigestAuth.__eq__c             C   s
   | |k S )Nr   )r   r'   r   r   r   r)   0  s    zHTTPDigestAuth.__ne__N)r   r    r!   r"   r$   r8   rY   r[   rl   r   r(   r)   r   r   r   r   r-   l   s   
f,r-   )r"   rS   rb   rR   r>   r.   r   Úbase64r   Úcompatr   r   r   Zcookiesr   Z_internal_utilsr   Zutilsr	   ZCONTENT_TYPE_FORM_URLENCODEDZCONTENT_TYPE_MULTI_PARTr   Úobjectr   r#   r,   r-   r   r   r   r   Ú<module>   s$   ,