
0c@_'                 @   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 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
basestring)extract_cookies_to_jar)to_native_string)parse_dict_headerz!application/x-www-form-urlencodedzmultipart/form-datac             C   s   t  |  t  s7 t j d j |   d t t |   }  t  | t  st t j d j t |   d t t |  } t  |  t  r |  j d  }  t  | t  r | j d  } d t	 t
 d j |  | f   j    } | 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passwordauthstr r   8/tmp/pip-build-jynh7p1z/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__K   s    zAuthBase.__call__N)__name__
__module____qualname____doc__r    r   r   r   r   r   H   s   r   c               @   sF   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               @   sv   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   	threadinglocal_thread_local)r   r   r   r   r   r   r&   o   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   )hasattrr2   r3   
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 rz d } n | j   } | d k s | d k r d	 d
   }	 |	   n` | d k r d d   }
 |
   n? | d k r d d   } |   n | d k rd d   } |     f d d   }   d k r5d Sd } t |  } | j pSd } | j rp| 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 r  d | | | f  } | s| | d | | f  } nP | d k sd | j d   k r d! | | | d | f } | | |  } n d S| |  j  _	 d" |  j | | | | f } | r@| d# | 7} | rT| d$ | 7} | rh| d% | 7} | r| d& | | f 7} d' | S)(z
        :rtype: str
        realmnonceqop	algorithmopaqueNMD5zMD5-SESSc             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)r   r   r   hashlibmd5	hexdigest)xr   r   r   md5_utf8   s    z4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8SHAc             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)r   r   r   rB   sha1rD   )rE   r   r   r   sha_utf8   s    z4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8zSHA-256c             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)r   r   r   rB   sha256rD   )rE   r   r   r   sha256_utf8   s    z7HTTPDigestAuth.build_digest_header.<locals>.sha256_utf8zSHA-512c             S   s1   t  |  t  r |  j d  }  t j |   j   S)Nzutf-8)r   r   r   rB   sha512rD   )rE   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      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)r2   r8   getupperr   pathqueryr   r   r6   r7   r   r   timectimeosurandomrB   rH   rD   split)r   methodurlr<   r=   r>   r?   r@   
_algorithmrF   rI   rK   rM   KDentdigp_parsedrZ   A1A2HA1HA2ncvaluerN   cnoncerespdignoncebitbaser   )rP   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)is_redirectr2   r:   )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	 rZ | j j j |  j j  | j j d d  } d | j	   k r{|  j j d k  r{|  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)zo
        Takes the given response and tries digest-auth, if needed.

        :rtype: requests.Response
        i  i  r   Nzwww-authenticater4   digest   zdigest flagscountr,   )status_coder2   r:   r9   requestbodyseekr-   rX   lowerrecompile
IGNORECASEr	   subr8   contentclosecopyr   _cookiesrawprepare_cookiesrp   ra   rb   
connectionsendhistoryappend)r   r   rr   s_authpatprep_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,   responser   )r;   r2   r6   rp   ra   rb   r-   rz   tellr9   AttributeErrorregister_hookr   rs   r:   )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&   r;   rp   rs   r   r    r*   r+   r   r   r   r   r/   l   s   
f,r/   )r$   r^   r}   r\   rB   r0   r   base64r   compatr   r   r   cookiesr   Z_internal_utilsr   utilsr	   CONTENT_TYPE_FORM_URLENCODEDCONTENT_TYPE_MULTI_PARTr   objectr   r%   r.   r/   r   r   r   r   <module>   s$   ,