o
    h}                     @   s   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
mZmZ ddlmZmZmZ ddlmZ G d	d
 d
eZG dd dZdS )    N)parse_http_list   )ProtocolError)AsyncRequestAsyncResponse
StatusCode)to_bytesto_strunquote   )BaseMiddlewarec                	   @   s   e Zd ZU ejejejejejejejejdZe	j
ee	jf ed< de	jeef de	jeef ddfddZd	ed
e	jdefddZd	edddefddZdededefddZde	j
eef defddZde	je de	je fddZdS )
DigestAuth)MD5zMD5-SESSSHAzSHA-SESSzSHA-256zSHA-256-SESSzSHA-512zSHA-512-SESSALGORITHM_TO_HASH_FUNCTIONusernamepasswordreturnNc                 C   s   t || _t || _d S N)r   r   r   )selfr   r    r   d/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/httpx/middleware/digest_auth.py__init__   s   
zDigestAuth.__init__requestget_responsec                    sz   ||I d H }t |jrd|jv s|S |jd }zt|}W n ty,   tdw | |||jd< ||I d H S )Nzwww-authenticatez&Malformed Digest authentication headerAuthorization)	r   Zis_client_errorstatus_codeheadersDigestAuthChallengefrom_header
ValueErrorr   _build_auth_header)r   r   r   responseheader	challenger   r   r   __call__    s   


zDigestAuth.__call__r$   r   c              	      sL  | j |j  dtdtf fdd}d| j|j| jf}|jj	d}d|j
	 |f}||}d}d| }	| ||j}
||}|j d	rU|d||j|
f}| |j}|d u rf||j|g}n|j|	|
||g}d|}| j|j|j||d||f|j	 d
}|jr|j|d< |rd|d< |	|d< |
|d< d| | S )Ndatar   c                    s    |    S r   )	hexdigestencode)r&   Z	hash_funcr   r   digest8   s   z-DigestAuth._build_auth_header.<locals>.digest   :zutf-8r   s   %08xz-sess)r   realmnonceurir"   	algorithmopaque   authqopnccnoncezDigest )r   r/   bytesjoinr   r,   r   url	full_pathr(   method_get_client_noncer-   lowerendswith_resolve_qopr2   r0   _get_header_value)r   r   r$   r*   A1pathA2HA2nonce_countZnc_valuer4   HA1r2   Zdigest_dataZ
key_digestZformat_argsr   r)   r   r!   3   s>   

zDigestAuth._build_auth_headerrC   r-   c                 C   sL   t | }||7 }|t  7 }|td7 }t| d d  S )N      )	strr(   timectimeosurandomhashlibsha1r'   )r   rC   r-   sr   r   r   r:   b   s
   zDigestAuth._get_client_nonceheader_fieldsc           
      C   sb   d}d}d}d}t | D ] \}\}}|dkr|d7 }||vr"|n|}	||	|t|7 }q|S )N)r/   r2   r3   z{}="{}"z{}={} r   z, )	enumerateitemsformatr	   )
r   rO   ZNON_QUOTED_FIELDSZQUOTED_TEMPLATEZNON_QUOTED_TEMPLATEheader_valueifieldvaluetemplater   r   r   r>   j   s   zDigestAuth._get_header_valuer2   c                 C   sF   |d u rd S t d|}d|v rdS |dgkrtdtd|d)Ns   , ?r1   s   auth-intz.Digest auth-int support is not yet implementedzUnexpected qop value "z" in digest auth)resplitNotImplementedErrorr   )r   r2   Zqopsr   r   r   r=   |   s   
zDigestAuth._resolve_qop)__name__
__module____qualname__rL   md5rM   sha256sha512r   typingDictrG   Callable__annotations__Unionr5   r   r   r   r%   r!   intr:   r>   Optionalr=   r   r   r   r   r      sD   
 


/"r   c                   @   sn   e Zd Z			ddedededeje deje ddfdd	Zed
edd fddZ	ede
dd fddZdS )r   Nr,   r-   r/   r0   r2   r   c                 C   s&   || _ || _|p	d| _|| _|| _d S )Nr   )r,   r-   r/   r0   r2   )r   r,   r-   r/   r0   r2   r   r   r   r      s
   

zDigestAuthChallenge.__init__r#   c           
   
   C   s   | d\}}}| dkrtdi }t|D ]}| dd\}}t|||< qz| |W S  tyB }	 ztd|	d}	~	ww )zReturns 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"`
         r*   z#Header does not start with 'Digest'=r   z(Malformed Digest WWW-Authenticate headerN)		partitionr;   r    r   striprZ   r
   from_header_dictKeyError)
clsr#   scheme_fieldsheader_dictrV   keyrW   excr   r   r   r      s   
zDigestAuthChallenge.from_headerrs   c                 C   sd   |d   }|d   }d|v r|d   nd }d|v r"|d   nd }|d}| |||||dS )Nr,   r-   r2   r0   r/   )r,   r-   r2   r0   r/   )r(   get)ro   rs   r,   r-   r2   r0   r/   r   r   r   rm      s   

z$DigestAuthChallenge.from_header_dict)NNN)r\   r]   r^   r5   rG   rb   rh   r   classmethodr   dictrm   r   r   r   r   r      s*    
r   )rL   rJ   rY   rH   rb   urllib.requestr   
exceptionsr   modelsr   r   r   utilsr   r	   r
   baser   r   r   r   r   r   r   <module>   s    {