o
    ùT·j€-  ã                   @  sú   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mZ d dl	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZ ejrGd d	lmZ g d
¢ZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejƒZdS )é    )ÚannotationsN)Ú	b64encode)Úparse_http_listé   )ÚProtocolError)ÚCookiesÚRequestÚResponse)Úto_bytesÚto_str)Ú_Hash)ÚAuthÚ	BasicAuthÚ
DigestAuthÚFunctionAuthÚ	NetRCAuthc                   @  s6   e Zd ZdZdZdZddd„Zdd	d
„Zddd„ZdS )r   aô  
    Base class for all authentication schemes.

    To implement a custom authentication scheme, subclass `Auth` and override
    the `.auth_flow()` method.

    If the authentication scheme does I/O such as disk access or network calls, or uses
    synchronization primitives such as locks, you should override `.sync_auth_flow()`
    and/or `.async_auth_flow()` instead of `.auth_flow()` to provide specialized
    implementations that will be used by `Client` and `AsyncClient` respectively.
    FÚrequestr   Úreturnú)typing.Generator[Request, Response, None]c                 c  s   � |V  dS )a  
        Execute the authentication flow.

        To dispatch a request, `yield` it:

        ```
        yield request
        ```

        The client will `.send()` the response back into the flow generator. You can
        access it like so:

        ```
        response = yield request
        ```

        A `return` (or reaching the end of the generator) will result in the
        client returning the last response obtained from the server.

        You can dispatch as many requests as is necessary.
        N© ©Úselfr   r   r   úO/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpx2/_auth.pyÚ	auth_flow&   s   €
zAuth.auth_flowc                 c  s^   � | j r| ¡  |  |¡}t|ƒ}	 |V }| jr| ¡  z| |¡}W n
 ty-   Y dS w q)zè
        Execute the authentication flow synchronously.

        By default, this defers to `.auth_flow()`. You should override this method
        when the authentication scheme does I/O and/or uses concurrency primitives.
        TN)Úrequires_request_bodyÚreadr   ÚnextÚrequires_response_bodyÚsendÚStopIteration©r   r   ÚflowÚresponser   r   r   Úsync_auth_flow>   s   €
ÿùzAuth.sync_auth_flowú(typing.AsyncGenerator[Request, Response]c                 C sj   �| j r| ¡ I dH  |  |¡}t|ƒ}	 |V }| jr"| ¡ I dH  z| |¡}W n
 ty3   Y dS w q)zé
        Execute the authentication flow asynchronously.

        By default, this defers to `.auth_flow()`. You should override this method
        when the authentication scheme does I/O and/or uses concurrency primitives.
        N)r   Úareadr   r   r   r   r   r    r   r   r   Úasync_auth_flowU   s   €
ÿùzAuth.async_auth_flowN©r   r   r   r   )r   r   r   r$   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#   r&   r   r   r   r   r      s    

r   c                   @  s$   e Zd ZdZddd„Zddd„ZdS )r   z‘
    Allows the 'auth' argument to be passed as a simple callable function,
    that takes the request, and returns a new, modified request.
    Úfuncú#typing.Callable[[Request], Request]r   ÚNonec                 C  s
   || _ d S ©N©Ú_func)r   r,   r   r   r   Ú__init__s   s   
zFunctionAuth.__init__r   r   r   c                 c  s   � |   |¡V  d S r/   r0   r   r   r   r   r   v   s   €zFunctionAuth.auth_flowN)r,   r-   r   r.   r'   )r(   r)   r*   r+   r2   r   r   r   r   r   r   m   s    
r   c                   @  s.   e Zd ZdZddd„Zddd„Zddd„ZdS )r   zy
    Allows the 'auth' argument to be passed as a (username, password) pair,
    and uses HTTP Basic authentication.
    Úusernameústr | bytesÚpasswordr   r.   c                 C  s   |   ||¡| _d S r/   )Ú_build_auth_headerÚ_auth_header©r   r3   r5   r   r   r   r2   €   s   zBasicAuth.__init__r   r   r   c                 c  s   � | j |jd< |V  d S )NÚAuthorization)r7   Úheadersr   r   r   r   r   ƒ   s   €
zBasicAuth.auth_flowÚstrc                 C  ó,   d  t|ƒt|ƒf¡}t|ƒ ¡ }d|› �S ©Nó   :zBasic ©Újoinr
   r   Údecode©r   r3   r5   ÚuserpassÚtokenr   r   r   r6   ‡   ó   
zBasicAuth._build_auth_headerN©r3   r4   r5   r4   r   r.   r'   ©r3   r4   r5   r4   r   r;   ©r(   r)   r*   r+   r2   r   r6   r   r   r   r   r   z   s
    

r   c                   @  s0   e Zd ZdZdddd„Zddd„Zddd„ZdS )r   zT
    Use a 'netrc' file to lookup basic auth credentials based on the url host.
    NÚfileú
str | Noner   r.   c                 C  s   dd l }|  |¡| _d S )Nr   )ÚnetrcÚ_netrc_info)r   rI   rK   r   r   r   r2   ’   s   zNetRCAuth.__init__r   r   r   c                 c  sR   � | j  |jj¡}|d u s|d s|V  d S | j|d |d d�|jd< |V  d S )Né   r   )r3   r5   r9   )rL   ÚauthenticatorsÚurlÚhostr6   r:   )r   r   Ú	auth_infor   r   r   r   ™   s   €

zNetRCAuth.auth_flowr3   r4   r5   r;   c                 C  r<   r=   r?   rB   r   r   r   r6   £   rE   zNetRCAuth._build_auth_headerr/   )rI   rJ   r   r.   r'   rG   rH   r   r   r   r   r   �   s
    

r   c                	   @  s‚   e Zd ZU ejejejejejejejejdœZde	d< d)d	d
„Z
d*dd„Zd+dd„Zd,dd„Zd-dd„Zd.d"d#„Zd/d&d'„Zd(S )0r   )ÚMD5zMD5-SESSÚSHAzSHA-SESSzSHA-256zSHA-256-SESSzSHA-512zSHA-512-SESSz*dict[str, typing.Callable[[bytes], _Hash]]Ú_ALGORITHM_TO_HASH_FUNCTIONr3   r4   r5   r   r.   c                 C  s$   t |ƒ| _t |ƒ| _d | _d| _d S )Nr   )r
   Ú	_usernameÚ	_passwordÚ_last_challengeÚ_nonce_countr8   r   r   r   r2   µ   s   


zDigestAuth.__init__r   r   r   c                 c  s®   � | j r|  || j ¡|jd< |V }|jdksd|jvrd S |j d¡D ]}| ¡  d¡r. nq#d S |  |||¡| _ d| _|  || j ¡|jd< |j	rRt
|j	ƒj|d� |V  d S )Nr9   i‘  zwww-authenticatezdigest r   ©r   )rW   r6   r:   Ústatus_codeÚget_listÚlowerÚ
startswithÚ_parse_challengerX   Úcookiesr   Úset_cookie_header)r   r   r"   Úauth_headerr   r   r   r   »   s"   €ÿ
zDigestAuth.auth_flowr"   r	   ra   r;   Ú_DigestAuthChallengec              
   C  sè   |  d¡\}}}| ¡ dksJ ‚i }t|ƒD ]}| ¡  dd¡\}	}
|
 d¡||	< qz4|d  ¡ }|d  ¡ }| dd	¡}d
|v rG|d
  ¡ nd}d|v rS|d  ¡ nd}t|||||d�W S  tys } z	d}t	||d�|‚d}~ww )zÁ
        Returns a challenge from a Digest WWW-Authenticate header.
        These take the form of:
        `Digest realm="realm@host.com",qop="auth,auth-int",nonce="abc",opaque="xyz"`
        ú Údigestú=r   ú"ÚrealmÚnonceÚ	algorithmrR   ÚopaqueNÚqop)rg   rh   ri   rj   rk   z(Malformed Digest WWW-Authenticate headerrY   )
Ú	partitionr\   r   ÚstripÚsplitÚencodeÚgetrb   ÚKeyErrorr   )r   r   r"   ra   ÚschemeÚ_ÚfieldsÚheader_dictÚfieldÚkeyÚvaluerg   rh   ri   rj   rk   ÚexcÚmessager   r   r   r^   Ö   s$   €þzDigestAuth._parse_challengeÚ	challengec                   sH  | j |j ¡  ‰ d‡ fdd„}d | j|j| jf¡}|jj}d |j	 
¡ |f¡}||ƒ}d| j }|  | j|j¡}	|  jd7  _||ƒ}
|j ¡  d	¡rW|d |
|j|	f¡ƒ}
| j|j|d
�}|d u rj|
|j|g}n	|
|j||	||g}| j|j|j||d |¡ƒ|j 
¡ dœ}|jr�|j|d< |r�d|d< ||d< |	|d< d|  |¡ S )NÚdataÚbytesr   c                   s   ˆ | ƒ  ¡  ¡ S r/   )Ú	hexdigestro   )r|   ©Ú	hash_funcr   r   rd   ô   s   z-DigestAuth._build_auth_header.<locals>.digestr>   s   %08xr   z-sessrY   )r3   rg   rh   Úurir"   ri   rj   ó   authrk   ÚncÚcnoncezDigest )r|   r}   r   r}   )rT   ri   Úupperr@   rU   rg   rV   rO   Úraw_pathÚmethodro   rX   Ú_get_client_noncerh   r\   ÚendswithÚ_resolve_qoprk   rj   Ú_get_header_value)r   r   r{   rd   ÚA1ÚpathÚA2ÚHA2Únc_valuer„   ÚHA1rk   Údigest_dataÚformat_argsr   r   r   r6   ñ   s<   
ú
zDigestAuth._build_auth_headerÚnonce_countÚintrh   r}   c                 C  sL   t |ƒ ¡ }||7 }|t ¡  ¡ 7 }|t d¡7 }t |¡ ¡ d d…  ¡ S )Né   é   )	r;   ro   ÚtimeÚctimeÚosÚurandomÚhashlibÚsha1r~   )r   r”   rh   Úsr   r   r   rˆ     s
   zDigestAuth._get_client_nonceÚheader_fieldsúdict[str, bytes]c           
      C  sb   d}d}d}d}t | ¡ ƒD ] \}\}}|dkr|d7 }||vr"|n|}	||	 |t|ƒ¡7 }q|S )N)ri   rk   rƒ   z{}="{}"z{}={}Ú r   z, )Ú	enumerateÚitemsÚformatr   )
r   rŸ   ÚNON_QUOTED_FIELDSÚQUOTED_TEMPLATEÚNON_QUOTED_TEMPLATEÚheader_valueÚirv   rx   Útemplater   r   r   r‹   '  s   zDigestAuth._get_header_valuerk   úbytes | Nonec                 C  sN   |d u rd S t  d|¡}d|v rdS |dgkrtdƒ‚d|›d�}t||d�‚)Ns   , ?r‚   s   auth-intz.Digest auth-int support is not yet implementedzUnexpected qop value "z" in digest authrY   )Úrern   ÚNotImplementedErrorr   )r   rk   r   Úqopsrz   r   r   r   rŠ   5  s   
zDigestAuth._resolve_qopNrF   r'   )r   r   r"   r	   ra   r;   r   rb   )r   r   r{   rb   r   r;   )r”   r•   rh   r}   r   r}   )rŸ   r    r   r;   )rk   r«   r   r   r   r«   )r(   r)   r*   rœ   Úmd5r�   Úsha256Úsha512rT   Ú__annotations__r2   r   r^   r6   rˆ   r‹   rŠ   r   r   r   r   r   ©   s"   
 ø




.
r   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< d	S )
rb   r}   rg   rh   r;   ri   r«   rj   rk   N)r(   r)   r*   r²   r   r   r   r   rb   C  s   
 rb   )Ú
__future__r   rœ   rš   r¬   r˜   ÚtypingÚbase64r   Úurllib.requestr   Ú_exceptionsr   Ú_modelsr   r   r	   Ú_utilsr
   r   ÚTYPE_CHECKINGr   Ú__all__r   r   r   r   r   Ú
NamedTuplerb   r   r   r   r   Ú<module>   s*    W 