U
    ÑŠ]}  ã                   @   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< e	jeef e	jeef ddœdd„Zee	jedœdd	„Zed
edœdd„Zeeedœdd„Ze	j
eef edœdd„Ze	je e	je dœdd„ZdS )Ú
DigestAuth)ÚMD5zMD5-SESSZSHAzSHA-SESSzSHA-256zSHA-256-SESSzSHA-512zSHA-512-SESSÚALGORITHM_TO_HASH_FUNCTIONN)ÚusernameÚpasswordÚreturnc                 C   s   t |ƒ| _t |ƒ| _d S ©N)r   r   r   )Úselfr   r   © r   ú|/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/middleware/digest_auth.pyÚ__init__   s    
zDigestAuth.__init__)ÚrequestÚget_responser   c                 Ã   s~   ||ƒI d H }t  |j¡r$d|jks(|S |jd }zt |¡}W n tk
r\   tdƒ‚Y nX |  ||¡|jd< ||ƒI d H S )Nzwww-authenticatez&Malformed Digest authentication headerZAuthorization)	r   Zis_client_errorZ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   r!   r   c              	      sN  | j |j ‰ ttdœ‡ fdd„}d | j|j| jf¡}|jj 	d¡}d |j
 	¡ |f¡}||ƒ}d}d| }	|  ||j¡}
||ƒ}|j ¡  d¡r¨|d ||j|
f¡ƒ}|  |j¡}|d krÊ||j|g}n|j|	|
||g}d |¡}| j|j|j||d ||f¡ƒ|j 	¡ d	œ}|j�r"|j|d
< |�r@d|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ÚnonceZurir   Ú	algorithmÚopaqueó   authÚqopÚncÚcnoncezDigest )r   r+   ÚbytesÚjoinr   r)   r   ÚurlÚ	full_pathr%   ÚmethodÚ_get_client_noncer*   ÚlowerÚendswithÚ_resolve_qopr.   r,   Ú_get_header_value)r   r   r!   r'   ZA1ÚpathZA2ZHA2Únonce_countZnc_valuer0   ZHA1r.   Zdigest_dataZ
key_digestZformat_argsr   r&   r   r   3   s>    
ú
zDigestAuth._build_auth_header)r<   r*   r   c                 C   sL   t |ƒ ¡ }||7 }|t ¡  ¡ 7 }|t d¡7 }t |¡ ¡ d d…  ¡ S )Né   é   )	Ústrr%   ÚtimeÚctimeÚosÚurandomÚhashlibÚsha1r$   )r   r<   r*   Úsr   r   r   r6   b   s
    zDigestAuth._get_client_nonce)Úheader_fieldsr   c           
      C   sb   d}d}d}d}t | ¡ ƒD ]@\}\}}|dkr8|d7 }||krD|n|}	||	 |t|ƒ¡7 }q|S )N)r+   r.   r/   z{}="{}"z{}={}Ú r   z, )Ú	enumerateÚitemsÚformatr	   )
r   rG   ZNON_QUOTED_FIELDSZQUOTED_TEMPLATEZNON_QUOTED_TEMPLATEZheader_valueÚiÚfieldÚvalueÚtemplater   r   r   r:   j   s    ÿýzDigestAuth._get_header_value)r.   r   c                 C   sJ   |d krd S t  d|¡}d|kr$dS |dgkr6tdƒ‚td|›d�ƒ‚d S )Ns   , ?r-   s   auth-intz.Digest auth-int support is not yet implementedzUnexpected qop value "z" in digest auth)ÚreÚsplitÚNotImplementedErrorr   )r   r.   Zqopsr   r   r   r9   |   s    
zDigestAuth._resolve_qop)Ú__name__Ú
__module__Ú__qualname__rD   Zmd5rE   Zsha256Úsha512r   ÚtypingÚDictr?   ÚCallableÚ__annotations__ÚUnionr1   r   r   r   r"   r   Úintr6   r:   ÚOptionalr9   r   r   r   r   r      s0   
ø þ þ þ/r   c                   @   sZ   e Zd Zdeeeeje eje ddœdd„Zeed dœdd„ƒZ	ee
d dœd	d
„ƒZdS )r   N)r)   r*   r+   r,   r.   r   c                 C   s&   || _ || _|pd| _|| _|| _d S )Nr   )r)   r*   r+   r,   r.   )r   r)   r*   r+   r,   r.   r   r   r   r   Š   s
    
zDigestAuthChallenge.__init__)r    r   c           
   
   C   s”   |  d¡\}}}| ¡ dkr$tdƒ‚i }t|ƒD ]$}| ¡  dd¡\}}t|ƒ||< q0z|  |¡W S  tk
rŽ }	 ztdƒ|	‚W 5 d}	~	X Y nX dS )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"`
        ú r'   z#Header does not start with 'Digest'ú=r   z(Malformed Digest WWW-Authenticate headerN)	Ú	partitionr7   r   r   ÚstriprQ   r
   Úfrom_header_dictÚKeyError)
Úclsr    ÚschemeÚ_ÚfieldsÚheader_dictrM   ÚkeyrN   Úexcr   r   r   r   ˜   s    zDigestAuthChallenge.from_header)rh   r   c                 C   sd   |d   ¡ }|d   ¡ }d|kr,|d   ¡ nd }d|krD|d   ¡ nd }| d¡}| |||||d�S )Nr)   r*   r.   r,   r+   )r)   r*   r.   r,   r+   )r%   Úget)rd   rh   r)   r*   r.   r,   r+   r   r   r   rb   ¬   s    
    ÿz$DigestAuthChallenge.from_header_dict)NNN)rS   rT   rU   r1   r?   rW   r]   r   Úclassmethodr   Údictrb   r   r   r   r   r   ‰   s      úùr   )rD   rB   rP   r@   rW   Zurllib.requestr   Ú
exceptionsr   Zmodelsr   r   r   Úutilsr   r	   r
   Úbaser   r   r   r   r   r   r   Ú<module>   s   {