VY&@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z ddl mZddlmZddlmZd Zd Zd d ZGd ddeZGdddeZGdddeZGdddeZdS)z] requests.auth ~~~~~~~~~~~~~ This module contains the authentication handlers for Requests. N) b64encode)urlparsestr basestring)extract_cookies_to_jar)to_native_string)parse_dict_headerz!application/x-www-form-urlencodedzmultipart/form-datacCst|ts7tjdj|dtt|}t|tsntjdj|dtt|}t|tr|jd}t|tr|jd}dtt dj ||fj }|S)zReturns 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 ({0!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 ({0!r}) to a string or bytes object in the near future to avoid problems.latin1zBasic :) isinstancerwarningswarnformatDeprecationWarningrencoderrjoinstrip)usernamepasswordauthstrr1/tmp/pip-build-04bmskau/requests/requests/auth.py_basic_auth_strs&     %rc@s"eZdZdZddZdS)AuthBasez4Base class that all auth implementations derive fromcCstddS)NzAuth hooks must be callable.)NotImplementedError)selfrrrr__call__KszAuthBase.__call__N)__name__ __module__ __qualname____doc__rrrrrrHs rc@sFeZdZdZddZddZddZdd Zd S) HTTPBasicAuthz?Attaches HTTP Basic Authentication to the given Request object.cCs||_||_dS)N)rr)rrrrrr__init__Rs zHTTPBasicAuth.__init__cCs:t|jt|ddk|jt|ddkgS)Nrr)allrgetattrr)rotherrrr__eq__VszHTTPBasicAuth.__eq__cCs ||k S)Nr)rr(rrr__ne__\szHTTPBasicAuth.__ne__cCs t|j|j|jd<|S)N Authorization)rrrheaders)rrrrrr_szHTTPBasicAuth.__call__N)r r!r"r#r%r)r*rrrrrr$Os    r$c@s"eZdZdZddZdS) HTTPProxyAuthz=Attaches HTTP Proxy Authentication to a given Request object.cCs t|j|j|jd<|S)NzProxy-Authorization)rrrr,)rrrrrrgszHTTPProxyAuth.__call__N)r r!r"r#rrrrrr-ds r-c@sveZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)HTTPDigestAuthz@Attaches HTTP Digest Authentication to the given Request object.cCs%||_||_tj|_dS)N)rr threadinglocal _thread_local)rrrrrrr%os  zHTTPDigestAuth.__init__cCs^t|jdsZd|j_d|j_d|j_i|j_d|j_d|j_dS)NinitTr)hasattrr1r2 last_nonce nonce_countchalpos num_401_calls)rrrrinit_per_thread_stateus     z$HTTPDigestAuth.init_per_thread_statecsH|jjd}|jjd}|jjjd}|jjjd}|jjjd}d|dkrzd}n |j}|dks|dkrd d } | n|d krd d } | fdd} dkrdSd} t|} | jpd}| jr.|d| j7}d|j||jf}d||f}|}|}||jj kr|jj d7_ n d|j_ d|jj }t |jj j d}||j d7}|t jj d7}|tjd7}tj|jdd}|dkrPd|||f}|sr| |d||f}nP|dksd|jdkrd|||d|f}| ||}ndS||j_ d|j||||f}|r|d|7}|r|d|7}| r&|d| 7}|r@|d ||f7}d!|S)"z :rtype: str realmnonceqop algorithmopaqueNMD5zMD5-SESScSs1t|tr|jd}tj|jS)Nzutf-8)r rrhashlibmd5 hexdigest)xrrrmd5_utf8sz4HTTPDigestAuth.build_digest_header..md5_utf8SHAcSs1t|tr|jd}tj|jS)Nzutf-8)r rrrAsha1rC)rDrrrsha_utf8sz4HTTPDigestAuth.build_digest_header..sha_utf8csd||fS)Nz%s:%sr)sd) hash_utf8rrsz4HTTPDigestAuth.build_digest_header../?z%s:%s:%sz%s:%srz%08xzutf-8auth,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)r1r7getupperrpathqueryrrr5r6rrtimectimeosurandomrArGrCsplit)rmethodurlr;r<r=r>r? _algorithmrErHKDentdigp_parsedrUA1A2HA1HA2ncvaluerIcnoncerespdignoncebitbaser)rKrbuild_digest_headersr              ! z"HTTPDigestAuth.build_digest_headercKs|jrd|j_dS)z)Reset num_401_calls counter on redirects.rN) is_redirectr1r9)rrkwargsrrrhandle_redirects zHTTPDigestAuth.handle_redirectcKsd|jkodkns/d|j_|S|jjdk rZ|jjj|jj|jjdd}d|j kr{|jjdkr{|jjd7_t j d d t j }t |jd|d d|j_|j|j|jj}t|j|j|j|j|j|j|j|j|jd <|jj||}|jj|||_|Sd|j_|S) zo Takes the given response and tries digest-auth, if needed. :rtype: requests.Response iirNzwww-authenticater3digestzdigest flagscountr+) status_coder1r9r8requestbodyseekr,rSlowerrecompile IGNORECASEr subr7contentclosecopyr_cookiesrawprepare_cookiesrkr\r] connectionsendhistoryappend)rrrms_authpatprep_rrrr handle_401s.  $$   zHTTPDigestAuth.handle_401c Cs|j|jjr5|j|j|j|jds$       ,