
^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passwordauthstr r   8/tmp/pip-build-9m6vxulb/pip/pip/_vendor/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   	threadinglocal_thread_local)r   r   r   r   r   r   r   @   s    		zHTTPDigestAuth.__init__c             C   sa   t  |  j d  s] d |  j _ d |  j _ d |  j _ i  |  j _ d  |  j _ d  |  j _ n  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                sW  |  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   }
 |
   n    f d d   }   d  k r d  Sd  } t |  } | j pd } | j r.| d | j 7} n  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 rS  d | | | f  } n  | su| | d | | f  } nP | d k sd | j d  k rd | | | d | f } | | |  } n d  S| |  j  _	 d |  j | | | | f } | r| d | 7} n  | r| d | 7} n  | r2| d | 7} n  | rO| d | | f 7} n  d  | S)!Nrealmnonceqop	algorithmopaqueMD5zMD5-SESSc             S   s4   t  |  t  r! |  j d  }  n  t j |   j   S)Nzutf-8)
isinstancer   r   hashlibmd5	hexdigest)xr   r   r   md5_utf8^   s    z4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8SHAc             S   s4   t  |  t  r! |  j d  }  n  t j |   j   S)Nzutf-8)r4   r   r   r5   sha1r7   )r8   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      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   pathqueryr   r   r(   r)   r   r   timectimeosurandomr5   r;   r7   split)r   methodurlr.   r/   r0   r1   r2   
_algorithmr9   r<   KDentdigp_parsedrI   A1A2HA1HA2ncvaluer=   cnoncerespdignoncebitbaser   )r?   r   build_digest_headerP   sp    				!z"HTTPDigestAuth.build_digest_headerc             K   s   | j  r d |  j _ n  d S)z)Reset num_401_calls counter on redirects.r   N)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  n  | j j d d  } d | j   k rO|  j  j d k  rO|  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&   digest   r   zdigest flagscountr   )r$   r+   requestbodyseekr   rG   lowerr,   recompile
IGNORECASEr   subr*   contentclosecopyr   _cookiesrawprepare_cookiesr_   rP   rQ   
connectionsendhistoryappend)r   r   ra   s_authpatprep_rr   r   r   
handle_401   s(    $$
	zHTTPDigestAuth.handle_401c             C   s   |  j    |  j j r8 |  j | j | j  | j d <n  y | j j   |  j _	 Wn t
 k
 rq d  |  j _	 Yn X| j d |  j  | j d |  j  d |  j _ | S)Nr   responser   )r-   r$   r(   r_   rP   rQ   r   rh   tellr+   AttributeErrorregister_hookr}   rb   r,   )r   r   r   r   r   r      s    
"zHTTPDigestAuth.__call__N)
r   r   r   r   r   r-   r_   rb   r}   r   r   r   r   r   r!   >   s   
V"r!   )r   rM   rk   rK   r5   r"   base64r   compatr   r   cookiesr   utilsr   r   status_codesr	   CONTENT_TYPE_FORM_URLENCODEDCONTENT_TYPE_MULTI_PARTr   objectr   r   r    r!   r   r   r   r   <module>   s"   
