
    F2jM6                       U d Z ddlm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 ddlmZ ddlmZ dd	lmZ dd
lmZ ej        rddlmZ dZded<   dZded<   d&dZ G d d          Z G d d          Z G d de          Z G d de          Z  G d de           Z!e G d  d!                      Z" G d" d#e          Z# G d$ d%e#e          Z$dS )'z]
requests.auth
~~~~~~~~~~~~~

This module contains the authentication handlers for Requests.
    )annotationsN)	b64encode)	dataclassfield)urlparse   )iscoroutinefunction)extract_cookies_to_jar)parse_dict_header)PreparedRequestz!application/x-www-form-urlencodedstrCONTENT_TYPE_FORM_URLENCODEDzmultipart/form-dataCONTENT_TYPE_MULTI_PARTusernamestr | bytespasswordreturnc                D   t          | t                    r|                     d          } t          |t                    r|                    d          }dt          d                    | |f                                                                                    z   }|S )zReturns a Basic Auth string.utf-8zBasic    :)
isinstancer   encoder   joinstripdecode)r   r   authstrs      U/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/niquests/auth.py_basic_auth_strr      s     (C   ,??7++(C   ,??7++499h-A#B#BCCIIKKRRTTTGN    c                      e Zd ZdZddZdS )AsyncAuthBasezABase class that all asynchronous auth implementations derive fromrr   r   c                $   K   t          d          NzAuth hooks must be callable.NotImplementedErrorselfr"   s     r   __call__zAsyncAuthBase.__call__0   s      !"@AAAr   Nr"   r   r   r   __name__
__module____qualname____doc__r)    r   r   r!   r!   -   s4        KKB B B B B Br   r!   c                      e Zd ZdZddZdS )AuthBasez@Base class that all synchronous auth implementations derive fromr"   r   r   c                     t          d          r$   r%   r'   s     r   r)   zAuthBase.__call__7   s    !"@AAAr   Nr*   r+   r0   r   r   r2   r2   4   s4        JJB B B B B Br   r2   c                  0    e Zd ZdZddZddZddZd	 Zd
S )BearerTokenAuthz.Simple token injection in Authorization headertokenr   c                    || _         d S N)r6   )r(   r6   s     r   __init__zBearerTokenAuth.__init__>   s    


r   r   boolc                6    | j         t          |dd           k    S )Nr6   )r6   getattrr(   others     r   __eq__zBearerTokenAuth.__eq__A   s    zWUGT::::r   c                    | |k     S r8   r0   r=   s     r   __ne__zBearerTokenAuth.__ne__D       5=  r   c                    | j                             dd          }t          |          dk    rd| j          |j        d<   n| j         |j        d<   |S )N r   )maxsplitzBearer Authorization)r6   splitlenheaders)r(   r"   detect_token_types      r   r)   zBearerTokenAuth.__call__G   s]    '+z'7'7a'7'H'H !!Q&&)?4:)?)?AIo&&)-AIo&r   N)r6   r   r   r:   r,   r-   r.   r/   r9   r?   rA   r)   r0   r   r   r5   r5   ;   se        88   ; ; ; ;! ! ! !    r   r5   c                  0    e Zd ZdZddZddZdd	Zd
 ZdS )HTTPBasicAuthz?Attaches HTTP Basic Authentication to the given Request object.r   r   r   c                "    || _         || _        d S r8   )r   r   r(   r   r   s      r   r9   zHTTPBasicAuth.__init__U   s      r   r   r:   c           	         t          | j        t          |dd           k    | j        t          |dd           k    g          S Nr   r   allr   r<   r   r=   s     r   r?   zHTTPBasicAuth.__eq__Y   E    
D!A!AA
D!A!AA
 
 	
r   c                    | |k     S r8   r0   r=   s     r   rA   zHTTPBasicAuth.__ne__a   rB   r   c                J    t          | j        | j                  |j        d<   |S )NrF   r   r   r   rI   r'   s     r   r)   zHTTPBasicAuth.__call__d   s!    %4T]DM%R%R	/"r   N)r   r   r   r   rK   rL   r0   r   r   rN   rN   R   se        II! ! ! !
 
 
 
! ! ! !    r   rN   c                      e Zd ZdZd ZdS )HTTPProxyAuthz=Attaches HTTP Proxy Authentication to a given Request object.c                J    t          | j        | j                  |j        d<   |S )NzProxy-AuthorizationrX   r'   s     r   r)   zHTTPProxyAuth.__call__l   s"    +:4=$-+X+X	'(r   Nr+   r0   r   r   rZ   rZ   i   s)        GG    r   rZ   c                  |    e Zd ZU dZdZded<   dZded<   dZd	ed
<    ee	          Z
ded<   dZded<   dZded<   dS )DigestAuthStatez/Container for digest auth state per task/threadFr:   init r   
last_noncer   intnonce_count)default_factoryztyping.Mapping[str, str | None]chalNz
int | Noneposnum_401_calls)r,   r-   r.   r/   r^   __annotations__r`   rb   r   dictrd   re   rf   r0   r   r   r]   r]   q   s         99DJK,1E$,G,G,GDGGGGC $M$$$$$$r   r]   c                  T    e Zd ZdZddZddZddZddZd Zd Z	d Z
ddZddZdS )HTTPDigestAuthz@Attaches HTTP Digest Authentication to the given Request object.r   r   r   c                T    || _         || _        t          j        d          | _        d S )Ndigest_auth_state)r   r   contextvars
ContextVar_thread_localrP   s      r   r9   zHTTPDigestAuth.__init__   s*      FQF\]pFqFqr   r   Nonec                    | j                             d           }||j        s*| j                             t	          d                     d S d S )NT)r^   )ro   getr^   setr]   )r(   states     r   init_per_thread_statez$HTTPDigestAuth.init_per_thread_state   sR    "&&t,,=
=""?#=#=#=>>>>> =r   methodurl
str | Nonec                   | j                             d           }|J |j        d         }|j        d         }|j                            d          }|j                            d          }|j                            d          }d |d}	n|                                }	|	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}|nt	          d|	 d          fd}d S d }t          |          }|j        pd}|j        r|d|j         z  }| j         d| d| j	         }| d| } |          } |          }||j
        k    r|xj        dz  c_        nd|_        |j        d}t          |j                                      d          }|J ||                    d          z  }|t          j                                        d          z  }|t!          j        d          z  }t%          j        |                                          d d         }|	dk    r | d| d|           }|s ||| d|           }n9|dk    sd|                    d          v r| d| d| d | } |||          }nd S ||_
        d!| j         d"| d#| d$| d%| d&}|r	|d'| d&z  }|r	|d(| d&z  }|r	|d)| d&z  }|r|d*| d+| d&z  }d,| S ).Nrealmnonceqop	algorithmopaqueMD5zMD5-SESSxr   r   r   c                    t          | t                    r|                     d          } t          j        |                                           S Nr   )r   r   r   hashlibmd5	hexdigestr   s    r   md5_utf8z4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8   s?    a%% *))A{1~~//111r   SHAc                    t          | t                    r|                     d          } t          j        |                                           S r   )r   r   r   r   sha1r   r   s    r   sha_utf8z4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8   s?    a%% *))A|A00222r   zSHA-256c                    t          | t                    r|                     d          } t          j        |                                           S r   )r   r   r   r   sha256r   r   s    r   sha256_utf8z7HTTPDigestAuth.build_digest_header.<locals>.sha256_utf8   A    a%% *))A~a((22444r   zSHA-512c                    t          | t                    r|                     d          } t          j        |                                           S r   )r   r   r   r   sha512r   r   s    r   sha512_utf8z7HTTPDigestAuth.build_digest_header.<locals>.sha512_utf8   r   r   'z$' hashing algorithm is not supportedc                $     |  d|           S )N:r0   )sd	hash_utf8s     r   <lambda>z4HTTPDigestAuth.build_digest_header.<locals>.<lambda>   s    ))qJJ1JJ// r   /?r   r   08xr         auth,z:auth:z
username="z
", realm="z
", nonce="z", uri="z", response=""z
, opaque="z, algorithm="z
, digest="z, qop="auth", nc=z
, cnonce="zDigest )r   r   r   r   )ro   rr   rd   upper
ValueErrorr   pathqueryr   r   r`   rb   r   r   timectimeosurandomr   r   r   rG   )r(   rv   rw   rt   rz   r{   r|   r}   r~   
_algorithmr   r   r   r   KDentdigp_parsedr   A1A2HA1HA2ncvaluer   cnoncerespdignoncebitbaser   s                               @r   build_digest_headerz"HTTPDigestAuth.build_digest_header   sK   "&&t,,   
7#
7#jnnU##JNN;//	))@D	JJ"**J*
":":2 2 2 2
 !II5  3 3 3 3
 !II9$$5 5 5 5
 $II9$$5 5 5 5
 $IIQQQQRRR////4 C==}#> 	)((((D777777immimmE$$$" !E&,,!""))'22   	U\\'"""	TZ\\  )))	RZ]]a**,,SbS1##)s55U55V5566C 	b....//GGF]]f		#66??'??F??#??Hbh''GG 4  sDMrrUrrerrUYrrhorrr 	+*****D 	10I0000D 	+*****D 	EDDD6DDDDDr   c                b    | j                             d          }|J |j        r	d|_        dS dS )z)Reset num_401_calls counter on redirects.Nr   )ro   rr   is_redirectrf   )r(   r"   kwargsrt   s       r   handle_redirectzHTTPDigestAuth.handle_redirect   sF    "&&t,,   = 	$"#E	$ 	$r   c                  K   | j                             d          }|J d|j        cxk    rdk     sn d|_        |S |j        $|j        j                            |j                   |j                            dd          }d|	                                v rD|j        dk     r8|xj        dz  c_        t          j        d	t          j        
          }t          |                    d|d                    |_        |j         d{V  |                                 d{V  |j                                        }t'          |j        |j        |j                   |                    |j                   |                     |j        |j                  |j        d<    |j        j        |fi | d{V }|j                            |           ||_        |S d|_        |S )z
        Takes the given response and tries digest-auth, if needed (async version).

        :rtype: requests.Response
        N    r   www-authenticater_   digest   digest flagscountrF   ro   rr   status_coderf   re   requestbodyseekrI   lowerrecompile
IGNORECASEr   subrd   contentclosecopyr
   _cookiesrawprepare_cookiesr   rv   rw   
connectionsendhistoryappendr(   r"   r   rt   s_authpatprep_rs           r   async_handle_401zHTTPDigestAuth.async_handle_401  s      "&&t,,    am))))c))))"#EH9  IN	***1266v||~~%%%*=*A*A1$*Zr}===C*3772vQ7+G+GHHEJ )OOOOOOO''))OOOOOOO9>>##D"4=!)QUCCC  ///,0,D,DT[RVRZ,[,[DL)(q|(8888888888BJa   BJIr   c                   | j                             d          }|J d|j        cxk    rdk     sn d|_        |S |j        $|j        j                            |j                   |j                            dd          }d|	                                v r2|j        dk     r&|xj        dz  c_        t          j        d	t          j        
          }t          |                    d|d                    |_        |j         |                                 |j                                        }t'          |j        |j        |j                   |                    |j                   |                     |j        |j                  |j        d<    |j        j        |fi |}|j                            |           ||_        |S d|_        |S )zo
        Takes the given response and tries digest-auth, if needed.

        :rtype: requests.Response
        Nr   r   r   r   r_   r   r   r   r   r   rF   r   r   s           r   
handle_401zHTTPDigestAuth.handle_4014  s    "&&t,,    am))))c))))"#EH9  IN	***1266v||~~%%%*=*A*A1$*Zr}===C*3772vQ7+G+GHHEJ IIGGIII9>>##D"4=!)QUCCC  ///,0,D,DT[RVRZ,[,[DL)""422622BJa   BJIr   c                   |                                   | j                            d           }|J |j        r(|                     |j        |j                  |j        d<   	 |j        	                                |_
        n# t          $ r
 d |_
        Y nw xY w|                    d| j                   |                    d| j                   d|_        |S NrF   responser   )ru   ro   rr   r`   r   rv   rw   rI   r   tellre   AttributeErrorregister_hookr   r   rf   r(   r"   rt   s      r   r)   zHTTPDigestAuth.__call__a  s    ""$$$"&&t,,    	S)-)A)A!(AE)R)RAIo&	EII 	 	 	
 EIII	 	

DO444	
D$8999s   #B BBr:   c           	         t          | j        t          |dd           k    | j        t          |dd           k    g          S rR   rS   r=   s     r   r?   zHTTPDigestAuth.__eq__x  rU   r   c                    | |k     S r8   r0   r=   s     r   rA   zHTTPDigestAuth.__ne__  rB   r   N)r   r   r   r   )r   rp   )rv   r   rw   r   r   rx   rK   )r,   r-   r.   r/   r9   ru   r   r   r   r   r)   r?   rA   r0   r   r   rj   rj   }   s        JJr r r r? ? ? ?o  o  o  o b$ $ $ $+ + +Z+ + +Z  .
 
 
 
! ! ! ! ! !r   rj   c                      e Zd ZdZd ZdS )AsyncHTTPDigestAutha  Async version of HTTPDigestAuth for use with AsyncSession.

    Attaches HTTP Digest Authentication to the given Request object and handles
    401 responses asynchronously.

    Example usage::

        >>> import niquests
        >>> auth = niquests.auth.AsyncHTTPDigestAuth('user', 'pass')
        >>> async with niquests.AsyncSession() as session:
        ...     r = await session.get('https://httpbin.org/digest-auth/auth/user/pass', auth=auth)
        ...     print(r.status_code)
        200
    c                0  K   |                                   | j                            d           }|J |j        r(|                     |j        |j                  |j        d<   	 t          |j	        j
                  r%|j	        
                                 d {V |_        n|j	        
                                |_        n# t          $ r
 d |_        Y nw xY w|                    d| j                   |                    d| j                   d|_        |S r   )ru   ro   rr   r`   r   rv   rw   rI   r	   r   r   re   r   r   r   r   rf   r   s      r   r)   zAsyncHTTPDigestAuth.__call__  s     ""$$$"&&t,,    	S)-)A)A!(AE)R)RAIo&	"16;// *"#&++--//////		FKKMM	 	 	 	
 EIII	 	

D$9:::	
D$8999s   %AC CCNr+   r0   r   r   r   r     s-             r   r   )r   r   r   r   r   r   )%r/   
__future__r   rm   r   r   r   r   typingbase64r   dataclassesr   r   urllib.parser   _compatr	   cookiesr
   utilsr   TYPE_CHECKINGmodelsr   r   rg   r   r   r!   r2   r5   rN   rZ   r]   rj   r   r0   r   r   <module>r      s     # " " " " "      				 				         ( ( ( ( ( ( ( ( ! ! ! ! ! ! ( ( ( ( ( ( + + + + + + $ $ $ $ $ $	 (''''''$G  G G G G4  4 4 4 4   B B B B B B B BB B B B B B B B    h   .    H   .    M    % % % % % % % %D! D! D! D! D!X D! D! D!N) ) ) ) ).- ) ) ) ) )r   