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 )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)		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   {