� ��^c@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z ddl mZddlmZddlmZd Zd Zd �Zd efd ��YZdefd��YZdefd��YZdefd��YZdS(s] requests.auth ~~~~~~~~~~~~~ This module contains the authentication handlers for Requests. i����N(t b64encodei(turlparsetstrt basestring(textract_cookies_to_jar(tto_native_string(tparse_dict_headers!application/x-www-form-urlencodedsmultipart/form-datacCs�t|t�s:tjdj|�dt�t|�}nt|t�sztjdjt|��dt�t|�}nt|t�r�|jd�}nt|t�r�|jd�}ndt t dj ||f��j ��}|S(sReturns a Basic Auth string.s�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.tcategorys�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.tlatin1sBasic t:( t isinstanceRtwarningstwarntformattDeprecationWarningRttypetencodeRRtjointstrip(tusernametpasswordtauthstr((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt_basic_auth_strs&  %tAuthBasecBseZdZd�ZRS(s4Base class that all auth implementations derive fromcCstd��dS(NsAuth hooks must be callable.(tNotImplementedError(tselftr((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt__call__Ks(t__name__t __module__t__doc__R(((s//tmp/pip-build-1THPZW/requests/requests/auth.pyRHst HTTPBasicAuthcBs2eZdZd�Zd�Zd�Zd�ZRS(s?Attaches HTTP Basic Authentication to the given Request object.cCs||_||_dS(N(RR(RRR((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt__init__Rs cCs:t|jt|dd�k|jt|dd�kg�S(NRR(tallRtgetattrtNoneR(Rtother((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt__eq__VscCs ||k S(N((RR$((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt__ne__\scCs t|j|j�|jd<|S(Nt Authorization(RRRtheaders(RR((s//tmp/pip-build-1THPZW/requests/requests/auth.pyR_s(RRRR R%R&R(((s//tmp/pip-build-1THPZW/requests/requests/auth.pyROs    t HTTPProxyAuthcBseZdZd�ZRS(s=Attaches HTTP Proxy Authentication to a given Request object.cCs t|j|j�|jd<|S(NsProxy-Authorization(RRRR((RR((s//tmp/pip-build-1THPZW/requests/requests/auth.pyRgs(RRRR(((s//tmp/pip-build-1THPZW/requests/requests/auth.pyR)dstHTTPDigestAuthcBsVeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z RS( s@Attaches HTTP Digest Authentication to the given Request object.cCs%||_||_tj�|_dS(N(RRt threadingtlocalt _thread_local(RRR((s//tmp/pip-build-1THPZW/requests/requests/auth.pyR os  cCsat|jd�s]t|j_d|j_d|j_i|j_d|j_d|j_ ndS(Ntinitti( thasattrR-tTrueR.t last_noncet nonce_counttchalR#tpost num_401_calls(R((s//tmp/pip-build-1THPZW/requests/requests/auth.pytinit_per_thread_stateus     cs�|jjd}|jjd}|jjjd�}|jjjd�}|jjjd�}d"�|d"krzd}n |j�}|dks�|dkr�d�} | �nZ|d kr�d �} | �n<|d kr�d �} | �n|d kr d�} | �n�fd�} �d"kr)d"Sd"}t|�}|jpGd}|jrg|d|j7}nd|j||j f}d||f}�|�}�|�}||jj kr�|jj d7_ n d|j_ d|jj }t |jj �j d�}||j d�7}|tj�j d�7}|tjd�7}tj|�j�d }|dkr��d|||f�}n|s�| |d||f�}nP|dks�d|jd�kr�d|||d|f}| ||�}nd"S||j_ d|j||||f}|r7|d|7}n|rN|d|7}n|re|d|7}n|r�|d ||f7}nd!|S(#s :rtype: str trealmtnoncetqopt algorithmtopaquetMD5sMD5-SESScSs4t|t�r!|jd�}ntj|�j�S(Nsutf-8(R RRthashlibtmd5t hexdigest(tx((s//tmp/pip-build-1THPZW/requests/requests/auth.pytmd5_utf8�stSHAcSs4t|t�r!|jd�}ntj|�j�S(Nsutf-8(R RRR>tsha1R@(RA((s//tmp/pip-build-1THPZW/requests/requests/auth.pytsha_utf8�ssSHA-256cSs4t|t�r!|jd�}ntj|�j�S(Nsutf-8(R RRR>tsha256R@(RA((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt sha256_utf8�ssSHA-512cSs4t|t�r!|jd�}ntj|�j�S(Nsutf-8(R RRR>tsha512R@(RA((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt sha512_utf8�scs�d||f�S(Ns%s:%s((tstd(t hash_utf8(s//tmp/pip-build-1THPZW/requests/requests/auth.pyt�R/t/t?s%s:%s:%ss%s:%sis%08xsutf-8iitautht,s%s:%s:%s:%s:%ss>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"s , opaque="%s"s, algorithm="%s"s , digest="%s"s , qop="auth", nc=%s, cnonce="%s"s Digest %sN(R-R4tgetR#tupperRtpathtqueryRRR2R3RRttimetctimetosturandomR>RDR@tsplit(RtmethodturlR8R9R:R;R<t _algorithmRBRERGRItKDtentdigtp_parsedRTtA1tA2tHA1tHA2tncvalueRJtcnoncetrespdigtnoncebittbase((RLs//tmp/pip-build-1THPZW/requests/requests/auth.pytbuild_digest_headers~                     ! cKs|jrd|j_ndS(s)Reset num_401_calls counter on redirects.iN(t is_redirectR-R6(RRtkwargs((s//tmp/pip-build-1THPZW/requests/requests/auth.pythandle_redirect�s cKs�d|jkodkns/d|j_|S|jjd k r]|jjj|jj�n|jj dd�}d|j �kr~|jjdkr~|jjd7_t j dd 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( so Takes the given response and tries digest-auth, if needed. :rtype: requests.Response i�i�iswww-authenticateR/tdigestisdigest tflagstcountR'N(t status_codeR-R6R5R#trequesttbodytseekR(RRtlowertretcompilet IGNORECASERtsubR4tcontenttclosetcopyRt_cookiestrawtprepare_cookiesRjR[R\t connectiontsendthistorytappend(RRRlts_authtpattprept_r((s//tmp/pip-build-1THPZW/requests/requests/auth.pyt handle_401�s.  $$   cCs�|j�|jjr8|j|j|j�|jdR+R tbase64RtcompatRRRtcookiesRt_internal_utilsRtutilsRtCONTENT_TYPE_FORM_URLENCODEDtCONTENT_TYPE_MULTI_PARTRtobjectRRR)R*(((s//tmp/pip-build-1THPZW/requests/requests/auth.pyts$       ,