o
    Þ­js.  ã                   @  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mZ ejrId 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Úunquote)Ú_Hash)ÚAuthÚ	BasicAuthÚ
DigestAuthÚ	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   úH/var/www/html/CropPilot/venv/lib/python3.10/site-packages/httpx/_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_flowW   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 )ÚFunctionAuthz‘
    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__w   s   
zFunctionAuth.__init__r   r   r   c                 c  s   � |   |¡V  d S r0   r1   r   r   r   r   r   z   s   €zFunctionAuth.auth_flowN)r-   r.   r   r/   r'   )r(   r)   r*   r+   r3   r   r   r   r   r   r,   q   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 r0   )Ú_build_auth_headerÚ_auth_header©r   r4   r6   r   r   r   r3   „   s   zBasicAuth.__init__r   r   r   c                 c  s   � | j |jd< |V  d S )NÚAuthorization)r8   Ú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   r4   r6   ÚuserpassÚtokenr   r   r   r7   ‹   ó   
zBasicAuth._build_auth_headerN©r4   r5   r6   r5   r   r/   r'   ©r4   r5   r6   r5   r   r<   ©r(   r)   r*   r+   r3   r   r7   r   r   r   r   r   ~   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   rJ   rL   r   r   r   r3   –   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   )r4   r6   r:   )rM   ÚauthenticatorsÚurlÚhostr7   r;   )r   r   Ú	auth_infor   r   r   r   �   s   €
ÿ
zNetRCAuth.auth_flowr4   r5   r6   r<   c                 C  r=   r>   r@   rC   r   r   r   r7   ©   rF   zNetRCAuth._build_auth_headerr0   )rJ   rK   r   r/   r'   rH   rI   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_FUNCTIONr4   r5   r6   r   r/   c                 C  s$   t |ƒ| _t |ƒ| _d | _d| _d S )Nr   )r
   Ú	_usernameÚ	_passwordÚ_last_challengeÚ_nonce_countr9   r   r   r   r3   »   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 )Nr:   i‘  zwww-authenticatezdigest r   ©r   )rX   r7   r;   Ústatus_codeÚget_listÚlowerÚ
startswithÚ_parse_challengerY   Úcookiesr   Úset_cookie_header)r   r   r"   Úauth_headerr   r   r   r   Á   s*   €
ÿÿ
ÿ
zDigestAuth.auth_flowr"   r	   rb   r<   Ú_DigestAuthChallengec              
   C  sæ   |  d¡\}}}| ¡ dksJ ‚i }t|ƒD ]}| ¡  dd¡\}	}
t|
ƒ||	< qz4|d  ¡ }|d  ¡ }| dd¡}d	|v rF|d	  ¡ nd
}d|v rR|d  ¡ nd
}t|||||d�W S  t	yr } 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Ú	algorithmrS   ÚopaqueNÚqop)rg   rh   ri   rj   rk   z(Malformed Digest WWW-Authenticate headerrZ   )Ú	partitionr]   r   ÚstripÚsplitr   ÚencodeÚgetrc   ÚKeyErrorr   )r   r   r"   rb   Ú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 r0   )Ú	hexdigestro   )r|   ©Ú	hash_funcr   r   re     s   z-DigestAuth._build_auth_header.<locals>.digestr?   s   %08xr   z-sessrZ   )r4   rg   rh   Úurir"   ri   rj   ó   authrk   ÚncÚcnoncezDigest )r|   r}   r   r}   )rU   ri   ÚupperrA   rV   rg   rW   rP   Úraw_pathÚmethodro   rY   Ú_get_client_noncerh   r]   ÚendswithÚ_resolve_qoprk   rj   Ú_get_header_value)r   r   r{   re   ÚA1ÚpathÚA2ÚHA2Únc_valuer„   ÚHA1rk   Údigest_dataÚformat_argsr   r   r   r7   ÿ   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‹   7  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 authrZ   )Úrern   ÚNotImplementedErrorr   )r   rk   r   Úqopsrz   r   r   r   rŠ   I  s   
zDigestAuth._resolve_qopNrG   r'   )r   r   r"   r	   rb   r<   r   rc   )r   r   r{   rc   r   r<   )r”   r•   rh   r}   r   r}   )rŸ   r    r   r<   )rk   r«   r   r   r   r«   )r(   r)   r*   rœ   Úmd5r�   Úsha256Úsha512rU   Ú__annotations__r3   r   r_   r7   rˆ   r‹   rŠ   r   r   r   r   r   ¯   s"   
 ø




0
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 )
rc   r}   rg   rh   r<   ri   r«   rj   rk   N)r(   r)   r*   r²   r   r   r   r   rc   W  s   
 rc   )Ú
__future__r   rœ   rš   r¬   r˜   ÚtypingÚbase64r   Úurllib.requestr   Ú_exceptionsr   Ú_modelsr   r   r	   Ú_utilsr
   r   r   ÚTYPE_CHECKINGr   Ú__all__r   r,   r   r   r   Ú
NamedTuplerc   r   r   r   r   Ú<module>   s*    [ )