
~V~                 @   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 m Z d d l m	 Z	 m
 Z
 d d l m Z d d l m Z m Z d d l m Z d	 Z d
 Z d d   Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d S)z]
requests.auth
~~~~~~~~~~~~~

This module contains the authentication handlers for Requests.
    N)	b64encode   )urlparsestr)extract_cookies_to_jar)parse_dict_headerto_native_string)codesz!application/x-www-form-urlencodedzmultipart/form-datac             C   s3   d t  t d |  | f j d   j    } | S)zReturns a Basic Auth string.zBasic z%s:%slatin1)r   r   encodestrip)usernamepasswordZauthstr r   //usr/lib/python3/dist-packages/requests/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__(   s    zAuthBase.__call__N)__name__
__module____qualname____doc__r   r   r   r   r   r   %   s   r   c               @   s.   e  Z d  Z 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__.   s    	zHTTPBasicAuth.__init__c             C   s    t  |  j |  j  | j d <| S)NAuthorization)r   r   r   headers)r   r   r   r   r   r   2   s    zHTTPBasicAuth.__call__N)r   r   r   r   r   r   r   r   r   r   r   ,   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   9   s    zHTTPProxyAuth.__call__N)r   r   r   r   r   r   r   r   r   r   7   s   r   c               @   s^   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 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   @   s    		zHTTPDigestAuth.__init__c             C   s^   t  |  j d  sZ d |  j _ d |  j _ d |  j _ i  |  j _ d  |  j _ d  |  j _ d  S)NinitT r   )hasattrr"   r#   
last_noncenonce_countchalposnum_401_calls)r   r   r   r   init_per_thread_stateF   s    z$HTTPDigestAuth.init_per_thread_statec                sB  |  j  j d } |  j  j d } |  j  j j d  } |  j  j j d  } |  j  j j d  } | d  k rt d } n | j   } | d k s | d k r d d	   }	 |	   n | d
 k r d d   }
 |
     f d d   }   d  k r d  Sd  } t |  } | j pd } | j r(| d | j 7} d |  j | |  j f } d | | f }   |  }   |  } | |  j  j	 k r|  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 rJ  d | | | f  } | sl| | d | | f  } nP | d k sd | j d  k rd | | | d | f } | | |  } n d  S| |  j  _	 d |  j | | | | f } | r| d | 7} | r| d | 7} | r | d | 7} | r:| d | | f 7} d  | S)!Nrealmnonceqop	algorithmopaqueZMD5zMD5-SESSc             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)
isinstancer   r   hashlibZmd5	hexdigest)xr   r   r   md5_utf8^   s    z4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8ZSHAc             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)r1   r   r   r2   sha1r3   )r4   r   r   r   sha_utf8d   s    z4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8c                s     d |  | f  S)Nz%s:%sr   )sd)	hash_utf8r   r   <lambda>j   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"   r(   getupperr   pathZqueryr   r   r&   r'   r   r   timeZctimeosurandomr2   r6   r3   split)r   methodurlr,   r-   r.   r/   r0   Z
_algorithmr5   r7   ZKDZentdigZp_parsedrC   ZA1ZA2ZHA1ZHA2Zncvaluer8   ZcnonceZrespdigZnoncebitbaser   )r:   r   build_digest_headerP   sp    			!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"   r*   )r   r   kwargsr   r   r   handle_redirect   s    	zHTTPDigestAuth.handle_redirectc             K   s\  |  j  j d k	 r+ | j j j |  j  j  | j j d d  } d | j   k rL|  j  j d k  rL|  j  j d 7_ t	 j
 d d t	 j } t | j d | d	 d  |  j  _ | j | j   | j j   } t | j | j | j  | j | j  |  j | j | j  | j d
 <| j j | |  } | j j |  | | _ | Sd |  j  _ | S)z:Takes the given response and tries digest-auth, if needed.Nzwww-authenticater$   Zdigest   r   zdigest flagscountr   )r"   r)   Zrequestbodyseekr   rA   lowerr*   recompile
IGNORECASEr   subr(   Zcontentclosecopyr   Z_cookiesrawZprepare_cookiesrK   rH   rI   Z
connectionsendhistoryappend)r   r   rL   Zs_authZpatZprepZ_rr   r   r   
handle_401   s(    $$
	zHTTPDigestAuth.handle_401c             C   s   |  j    |  j j r5 |  j | j | j  | j d <y | j j   |  j _	 Wn t
 k
 rn d  |  j _	 Yn X| j d |  j  | j d |  j  d |  j _ | S)Nr   Zresponser   )r+   r"   r&   rK   rH   rI   r   rQ   tellr)   AttributeErrorZregister_hookr^   rM   r*   )r   r   r   r   r   r      s    
zHTTPDigestAuth.__call__N)
r   r   r   r   r   r+   rK   rM   r^   r   r   r   r   r   r    >   s   
V"r    )r   rE   rT   rD   r2   r!   base64r   compatr   r   Zcookiesr   Zutilsr   r   Zstatus_codesr	   ZCONTENT_TYPE_FORM_URLENCODEDZCONTENT_TYPE_MULTI_PARTr   objectr   r   r   r    r   r   r   r   <module>   s"   
