a
    ݌xdb                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 d dl
mZmZmZmZmZ d dlmZ d dlm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ZG dd deZG dd deZG dd deZeeeeeeedZdS )    N)BytesIO)SIGNED_HEADERS_BLACKLIST"STREAMING_UNSIGNED_PAYLOAD_TRAILERUNSIGNED_PAYLOAD
BaseSigner_get_body_as_dict_host_from_url)HTTPHeadersawscrtparse_qsurlsplit
urlunsplit)NoCredentialsError)percent_encode_sequencec                   @   sz   e Zd ZdZg dZejjjZ	dZ
dZdd Zdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )CrtSigV4AuthTAuthorizationz
X-Amz-DateX-Amz-Content-SHA256zX-Amz-Security-Tokenc                 C   s   || _ || _|| _d | _d S Ncredentials_service_name_region_name_expiration_in_secondsselfr   service_nameregion_name r   I/var/www/html/Ranjet/env/lib/python3.9/site-packages/botocore/crt/auth.py__init__*   s    zCrtSigV4Auth.__init__c                 C   s0   |j di }|d}t|to.|ddkS Nchecksumrequest_algorithmintrailercontextget
isinstancedictr   requestchecksum_context	algorithmr   r   r   _is_streaming_checksum_payload0   s    
z+CrtSigV4Auth._is_streaming_checksum_payloadc           
      C   s  | j d u rt tj jtjjd}| |}| | t	j
jj| j j| j j| j jd}| |rjt}n| |r|r~|}qd }nt}| |rt	j
jj}n
t	j
jj}t	j
jt	j
jj| j|| j| j|| j| j| j ||| j!d}| "|}t	j
#||}	|	$  | %|| d S N)tzinfo)Zaccess_key_idZsecret_access_keyZsession_token)r.   Zsignature_typecredentials_providerregionZservicedateZshould_sign_headerZuse_double_uri_encodeZshould_normalize_uri_pathZsigned_body_valueZsigned_body_header_typeZexpiration_in_seconds)&r   r   datetimeutcnowreplacetimezoneutc_get_existing_sha256_modify_request_before_signingr
   authAwsCredentialsProvider
new_static
access_key
secret_keytokenr/   r   _should_sha256_sign_payloadr   !_should_add_content_sha256_headerAwsSignedBodyHeaderTypeX_AMZ_CONTENT_SHA_256NONEAwsSigningConfigAwsSigningAlgorithmZV4_SIGNATURE_TYPEr   r   _should_sign_header_USE_DOUBLE_URI_ENCODE_SHOULD_NORMALIZE_URI_PATHr   _crt_request_from_aws_requestaws_sign_requestresult_apply_signing_changes
r   r,   Zdatetime_nowZexisting_sha256r2   explicit_payloadZbody_headerZsigning_configcrt_requestfuturer   r   r   add_auth5   sR    








zCrtSigV4Auth.add_authc           
      C   s   t |j}|jr|jnd}|jrhg }|j D ]$\}}t|}|| d|  q.|d d| }n|jr~| d|j }t	j
|j }d }|jrt|jdr|j}n
t|j}t	j
j|j|||d}	|	S N/=?&seek)methodpathheadersZbody_streamr   urlr]   paramsitemsstrappendjoinqueryr
   httpZHttpHeadersr^   bodyhasattrr   ZHttpRequestr\   
r   aws_request	url_partsZcrt_patharrayparamvalueZcrt_headersZcrt_body_streamrS   r   r   r   rM   n   s.    

z*CrtSigV4Auth._crt_request_from_aws_requestc                 C   s   t t|j|_d S r   r	   Z
from_pairslistr^   r   rk   signed_crt_requestr   r   r   rP      s    z#CrtSigV4Auth._apply_signing_changesc                 K   s   |  tvS r   lowerr   r   namekwargsr   r   r   rJ      s    z CrtSigV4Auth._should_sign_headerc                 C   s<   | j D ]}||jv r|j|= qd|jvr8t|j|jd< d S Nhost_PRESIGNED_HEADERS_BLOCKLISTr^   r   r`   r   r,   hr   r   r   r;      s
    



z+CrtSigV4Auth._modify_request_before_signingc                 C   s   |j dS Nr   r^   r(   r   r,   r   r   r   r:      s    z!CrtSigV4Auth._get_existing_sha256c                 C   s   |j dsdS |jddS NhttpsTpayload_signing_enabledr`   
startswithr'   r(   r   r   r   r   rB      s    z(CrtSigV4Auth._should_sha256_sign_payloadc                 C   s   |d uS r   r   r   rR   r   r   r   rC      s    z.CrtSigV4Auth._should_add_content_sha256_headerN)__name__
__module____qualname__REQUIRES_REGIONr|   r
   r<   AwsSignatureTypeHTTP_REQUEST_HEADERSrI   rK   rL   r    r/   rU   rM   rP   rJ   r;   r:   rB   rC   r   r   r   r   r      s   
9

r   c                       s4   e Zd ZdZdZdd Z fddZdd Z  ZS )CrtS3SigV4AuthFc                 C   s   d S r   r   r   r   r   r   r:      s    z#CrtS3SigV4Auth._get_existing_sha256c                    s   |j d}t|dd }|d u r$i }|dd }|d ur<|S d}|j di }|d}t|trx|ddkrx|d	 }|jd
r||jvrdS |j ddrdS t 	|S )Nclient_configs3r   Content-MD5r"   r#   r$   headerrw   r   Thas_streaming_inputF)
r'   r(   getattrr)   r*   r`   r   r^   superrB   )r   r,   r   	s3_configsign_payloadZchecksum_headerr-   r.   	__class__r   r   rB      s(    

z*CrtS3SigV4Auth._should_sha256_sign_payloadc                 C   s   dS NTr   r   r   r   r   rC      s    z0CrtS3SigV4Auth._should_add_content_sha256_header	r   r   r   rK   rL   r:   rB   rC   __classcell__r   r   r   r   r      s
   )r   c                   @   sz   e Zd ZdZg dZejjjZ	dZ
dZdd Zdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )CrtSigV4AsymAuthTr   c                 C   s   || _ || _|| _d | _d S r   r   r   r   r   r   r       s    zCrtSigV4AsymAuth.__init__c           
      C   s  | j d u rt tj jtjjd}| |}| | t	j
jj| j j| j j| j jd}| |rjt}n| |r|r~|}qd }nt}| |rt	j
jj}n
t	j
jj}t	j
jt	j
jj| j|| j| j|| j| j| j ||| j!d}| "|}t	j
#||}	|	$  | %|| d S r0   )&r   r   r5   r6   r7   r8   r9   r:   r;   r
   r<   r=   r>   r?   r@   rA   r/   r   rB   r   rC   rD   rE   rF   rG   rH   ZV4_ASYMMETRICrI   r   r   rJ   rK   rL   r   rM   rN   rO   rP   rQ   r   r   r   rU      sR    








zCrtSigV4AsymAuth.add_authc           
      C   s   t |j}|jr|jnd}|jrhg }|j D ]$\}}t|}|| d|  q.|d d| }n|jr~| d|j }t	j
|j }d }|jrt|jdr|j}n
t|j}t	j
j|j|||d}	|	S rV   r_   rj   r   r   r   rM   3  s.    

z.CrtSigV4AsymAuth._crt_request_from_aws_requestc                 C   s   t t|j|_d S r   rp   rr   r   r   r   rP   Q  s    z'CrtSigV4AsymAuth._apply_signing_changesc                 K   s   |  tvS r   rt   rv   r   r   r   rJ   W  s    z$CrtSigV4AsymAuth._should_sign_headerc                 C   s<   | j D ]}||jv r|j|= qd|jvr8t|j|jd< d S ry   r{   r}   r   r   r   r;   Z  s
    



z/CrtSigV4AsymAuth._modify_request_before_signingc                 C   s   |j dS r   r   r   r   r   r   r:   d  s    z%CrtSigV4AsymAuth._get_existing_sha256c                 C   s0   |j di }|d}t|to.|ddkS r!   r&   r+   r   r   r   r/   g  s    
z/CrtSigV4AsymAuth._is_streaming_checksum_payloadc                 C   s   |j dsdS |jddS r   r   r   r   r   r   rB   l  s    z,CrtSigV4AsymAuth._should_sha256_sign_payloadc                 C   s   |d uS r   r   r   r   r   r   rC   v  s    z2CrtSigV4AsymAuth._should_add_content_sha256_headerN)r   r   r   r   r|   r
   r<   r   r   rI   rK   rL   r    rU   rM   rP   rJ   r;   r:   r/   rB   rC   r   r   r   r   r      s   
9

r   c                       s4   e Zd ZdZdZdd Z fddZdd Z  ZS )CrtS3SigV4AsymAuthFc                 C   s   d S r   r   r   r   r   r   r:     s    z'CrtS3SigV4AsymAuth._get_existing_sha256c                    st   |j d}t|dd }|d u r$i }|dd }|d ur<|S |jdrRd|jvrVdS |j ddrhdS t |S )	Nr   r   r   r   r   Tr   F)r'   r(   r   r`   r   r^   r   rB   )r   r,   r   r   r   r   r   r   rB     s    
z.CrtS3SigV4AsymAuth._should_sha256_sign_payloadc                 C   s   dS r   r   r   r   r   r   rC     s    z4CrtS3SigV4AsymAuth._should_add_content_sha256_headerr   r   r   r   r   r   {  s
   $r   c                       sF   e Zd ZdZejjjZef fdd	Z	 fddZ
 fddZ  ZS )CrtSigV4AsymQueryAuth  c                    s   t  ||| || _d S r   r   r    r   r   r   r   r   expiresr   r   r   r      s    zCrtSigV4AsymQueryAuth.__init__c           	         s   t  | |jd}|dkr(|jd= t|j}t|jdd}dd | D }|j	rl|
t| d|_	t|}|}|d |d	 |d
 ||d f}t||_d S )Ncontent-type0application/x-www-form-urlencoded; charset=utf-8Tkeep_blank_valuesc                 S   s   i | ]\}}||d  qS r   r   .0kvr   r   r   
<dictcomp>      zHCrtSigV4AsymQueryAuth._modify_request_before_signing.<locals>.<dictcomp> r            )r   r;   r^   r(   r   r`   r   rf   rb   dataupdater   r   r   )	r   r,   content_typerl   Zquery_string_parts
query_dictnew_query_stringpnew_url_partsr   r   r   r;     s    
	z4CrtSigV4AsymQueryAuth._modify_request_before_signingc                    sL   t  || t|jj}t|j}t|d |d |d ||d f|_d S Nr   r   r   r   r   rP   r   r]   rf   r`   r   r   rk   rs   Zsigned_queryr   r   r   r   rP     s    
	z,CrtSigV4AsymQueryAuth._apply_signing_changesr   r   r   ZDEFAULT_EXPIRESr
   r<   r   ZHTTP_REQUEST_QUERY_PARAMSrI   r    r;   rP   r   r   r   r   r   r     s   
*r   c                   @   s(   e Zd ZdZdZdZdd Zdd ZdS )CrtS3SigV4AsymQueryAuthzS3 SigV4A auth using query parameters.
    This signer will sign a request using query parameters and signature
    version 4A, i.e a "presigned url" signer.
    Fc                 C   s   dS NFr   r   r   r   r   rB     s    z3CrtS3SigV4AsymQueryAuth._should_sha256_sign_payloadc                 C   s   dS r   r   r   r   r   r   rC     s    z9CrtS3SigV4AsymQueryAuth._should_add_content_sha256_headerNr   r   r   __doc__rK   rL   rB   rC   r   r   r   r   r     s
   r   c                       sF   e Zd ZdZejjjZef fdd	Z	 fddZ
 fddZ  ZS )CrtSigV4QueryAuthr   c                    s   t  ||| || _d S r   r   r   r   r   r   r      s    zCrtSigV4QueryAuth.__init__c                    s   t  | |jd}|dkr(|jd= t|j}dd t|jdd D }|j	rf|
|j	 i |_	|jr|
t| d|_t|}|}|d |d	 |d
 ||d f}t||_d S )Nr   r   c                 S   s   i | ]\}}||d  qS r   r   r   r   r   r   r   !  s   zDCrtSigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>Tr   r   r   r   r   r   )r   r;   r^   r(   r   r`   r   rf   rb   ra   r   r   r   r   r   )r   r,   r   rl   r   r   r   r   r   r   r   r;     s(    
	z0CrtSigV4QueryAuth._modify_request_before_signingc                    sL   t  || t|jj}t|j}t|d |d |d ||d f|_d S r   r   r   r   r   r   rP   B  s    
	z(CrtSigV4QueryAuth._apply_signing_changesr   r   r   r   r   r     s   
0r   c                   @   s(   e Zd ZdZdZdZdd Zdd ZdS )CrtS3SigV4QueryAutha  S3 SigV4 auth using query parameters.
    This signer will sign a request using query parameters and signature
    version 4, i.e a "presigned url" signer.
    Based off of:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
    Fc                 C   s   dS r   r   r   r   r   r   rB   _  s    z/CrtS3SigV4QueryAuth._should_sha256_sign_payloadc                 C   s   dS r   r   r   r   r   r   rC   f  s    z5CrtS3SigV4QueryAuth._should_add_content_sha256_headerNr   r   r   r   r   r   S  s
   r   )Zv4zv4-queryZv4aZs3v4z
s3v4-queryZs3v4azs3v4a-query)r5   ior   Zbotocore.authr   r   r   r   r   r   Zbotocore.compatr	   r
   r   r   r   Zbotocore.exceptionsr   Zbotocore.utilsr   r   r   r   r   r   r   r   r   ZCRT_AUTH_TYPE_MAPSr   r   r   r   <module>   s.     7 2EK