o
    JhGc                     @   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 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)register_feature_id)percent_encode_sequencec                   @   z   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      || _ || _|| _d | _d S Ncredentials_service_name_region_name_expiration_in_secondsselfr   service_nameregion_name r!   q/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/botocore/crt/auth.py__init__+      
zCrtSigV4Auth.__init__c                 C   0   |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_payload1      
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}| |r5t}n| |rB|r?|}nd }nt}| |rOt	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access_key_idsecret_access_keysession_tokenr3   signature_typecredentials_providerregionservicedateshould_sign_headeruse_double_uri_encodeshould_normalize_uri_pathsigned_body_valuesigned_body_header_type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tokenr4   r   _should_sha256_sign_payloadr   !_should_add_content_sha256_headerAwsSignedBodyHeaderTypeX_AMZ_CONTENT_SHA_256NONEAwsSigningConfigAwsSigningAlgorithm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   r1   datetime_nowexisting_sha256r>   explicit_payloadbody_headersigning_configcrt_requestfuturer!   r!   r"   add_auth6   sR   








zCrtSigV4Auth.add_authc           
      C      t |j}|jr|jnd}|jr4g }|j D ]\}}t|}|| d|  q|d d| }n|jr?| d|j }t	j
|j }d }|jr\t|jdrW|j}nt|j}t	j
j|j|||d}	|	S N/=?&seek)methodpathheadersbody_streamr   urlrv   paramsitemsstrappendjoinqueryr
   httpHttpHeadersrw   bodyhasattrr   HttpRequestru   
r   aws_request	url_partscrt_patharrayparamvaluecrt_headerscrt_body_streamrk   r!   r!   r"   ra   o   .   

z*CrtSigV4Auth._crt_request_from_aws_requestc                 C      t t|j|_d S r   r	   
from_pairslistrw   r   r   signed_crt_requestr!   r!   r"   rd         
z#CrtSigV4Auth._apply_signing_changesc                 K      |  tvS r   lowerr   r   namekwargsr!   r!   r"   r^         z CrtSigV4Auth._should_sign_headerc                 C   @   | j D ]}||jv r|j|= qd|jvrt|j|jd< d S d S Nhost_PRESIGNED_HEADERS_BLOCKLISTrw   r   rz   r   r1   hr!   r!   r"   rN         


z+CrtSigV4Auth._modify_request_before_signingc                 C      |j dS Nr   rw   r-   r   r1   r!   r!   r"   rM      r   z!CrtSigV4Auth._get_existing_sha256c                 C      |j dsdS |jddS NhttpsTpayload_signing_enabledrz   
startswithr,   r-   r   r!   r!   r"   rU         z(CrtSigV4Auth._should_sha256_sign_payloadc                 C      |d uS r   r!   r   rh   r!   r!   r"   rV         z.CrtSigV4Auth._should_add_content_sha256_headerN)__name__
__module____qualname__REQUIRES_REGIONr   r
   rO   AwsSignatureTypeHTTP_REQUEST_HEADERSr]   r_   r`   r#   r4   rm   ra   rd   r^   rN   rM   rU   rV   r!   r!   r!   r"   r      s     
9

r   c                       4   e Zd ZdZdZdd Z fddZdd Z  ZS )CrtS3SigV4AuthFc                 C      d S r   r!   r   r!   r!   r"   rM         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r<|ddkr<|d	 }|jd
rG||jvrIdS |j ddrRdS t 	|S )Nclient_configs3r   Content-MD5r'   r(   r)   headerr   r   Thas_streaming_inputF)
r,   r-   getattrr.   r/   rz   r   rw   superrU   )r   r1   r   	s3_configsign_payloadchecksum_headerr2   r3   	__class__r!   r"   rU      s&   


z*CrtS3SigV4Auth._should_sha256_sign_payloadc                 C      dS NTr!   r   r!   r!   r"   rV      r   z0CrtS3SigV4Auth._should_add_content_sha256_header	r   r   r   r_   r`   rM   rU   rV   __classcell__r!   r!   r   r"   r      s    )r   c                   @   r   )CrtSigV4AsymAuthTr   c                 C   r   r   r   r   r!   r!   r"   r#      r$   zCrtSigV4AsymAuth.__init__c           
      C   s  t d | jd u rt tj jtjjd}| |}| 	| t
jjj| jj| jj| jjd}| |r9t}n| |rF|rC|}nd }nt}| |rSt
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SIGV4A_SIGNINGr6   r8   r<   )'r   r   r   rH   rI   rJ   rK   rL   rM   rN   r
   rO   rP   rQ   rR   rS   rT   r4   r   rU   r   rV   rW   rX   rY   rZ   r[   V4_ASYMMETRICr]   r   r   r^   r_   r`   r   ra   rb   rc   rd   re   r!   r!   r"   rm      sT   








zCrtSigV4AsymAuth.add_authc           
      C   rn   ro   ry   r   r!   r!   r"   ra   5  r   z.CrtSigV4AsymAuth._crt_request_from_aws_requestc                 C   r   r   r   r   r!   r!   r"   rd   S  r   z'CrtSigV4AsymAuth._apply_signing_changesc                 K   r   r   r   r   r!   r!   r"   r^   Y  r   z$CrtSigV4AsymAuth._should_sign_headerc                 C   r   r   r   r   r!   r!   r"   rN   \  r   z/CrtSigV4AsymAuth._modify_request_before_signingc                 C   r   r   r   r   r!   r!   r"   rM   f  r   z%CrtSigV4AsymAuth._get_existing_sha256c                 C   r%   r&   r+   r0   r!   r!   r"   r4   i  r5   z/CrtSigV4AsymAuth._is_streaming_checksum_payloadc                 C   r   r   r   r   r!   r!   r"   rU   n  r   z,CrtSigV4AsymAuth._should_sha256_sign_payloadc                 C   r   r   r!   r   r!   r!   r"   rV   x  r   z2CrtSigV4AsymAuth._should_add_content_sha256_headerN)r   r   r   r   r   r
   rO   r   r   r]   r_   r`   r#   rm   ra   rd   r^   rN   rM   r4   rU   rV   r!   r!   r!   r"   r      s     
:

r   c                       r   )CrtS3SigV4AsymAuthFc                 C   r   r   r!   r   r!   r!   r"   rM     r   z'CrtS3SigV4AsymAuth._get_existing_sha256c                    st   |j d}t|dd }|d u ri }|dd }|d ur|S |jdr)d|jvr+dS |j ddr4dS t |S )	Nr   r   r   r   r   Tr   F)r,   r-   r   rz   r   rw   r   rU   )r   r1   r   r   r   r   r!   r"   rU     s   

z.CrtS3SigV4AsymAuth._should_sha256_sign_payloadc                 C   r   r   r!   r   r!   r!   r"   rV     r   z4CrtS3SigV4AsymAuth._should_add_content_sha256_headerr   r!   r!   r   r"   r   }  s    $r   c                       F   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                       t  ||| || _d S r   r   r#   r   r   r   r   r    expiresr   r!   r"   r#        
zCrtSigV4AsymQueryAuth.__init__c           	         s   t  | |jd}|dkr|jd= t|j}t|jdd}dd | D }|j	r6|
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      i | ]	\}}||d  qS r   r!   .0kvr!   r!   r"   
<dictcomp>  s    zHCrtSigV4AsymQueryAuth._modify_request_before_signing.<locals>.<dictcomp> r            )r   rN   rw   r-   r   rz   r   r   r|   dataupdater   r   r   )	r   r1   content_typer   query_string_parts
query_dictnew_query_stringpnew_url_partsr   r!   r"   rN     s   
	z4CrtSigV4AsymQueryAuth._modify_request_before_signingc                    L   t  || t|jj}t|j}t|d |d |d ||d f|_d S Nr   r   r   r   r   rd   r   rv   r   rz   r   r   r   r   signed_queryr   r   r!   r"   rd        
(	z,CrtSigV4AsymQueryAuth._apply_signing_changesr   r   r   DEFAULT_EXPIRESr
   rO   r   HTTP_REQUEST_QUERY_PARAMSr]   r#   rN   rd   r   r!   r!   r   r"   r     s    
*r   c                   @   (   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   r   NFr!   r   r!   r!   r"   rU        z3CrtS3SigV4AsymQueryAuth._should_sha256_sign_payloadc                 C   r   r   r!   r   r!   r!   r"   rV     r   z9CrtS3SigV4AsymQueryAuth._should_add_content_sha256_headerNr   r   r   __doc__r_   r`   rU   rV   r!   r!   r!   r"   r     s    r   c                       r   )CrtSigV4QueryAuthr   c                    r   r   r   r   r   r!   r"   r#     r   zCrtSigV4QueryAuth.__init__c                    s   t  | |jd}|dkr|jd= t|j}dd t|jdd D }|j	r3|
|j	 i |_	|jr@|
t| d|_t|}|}|d |d	 |d
 ||d f}t||_d S )Nr   r   c                 S   r   r   r!   r   r!   r!   r"   r   #  s    zDCrtSigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>Tr   r   r   r   r   r   )r   rN   rw   r-   r   rz   r   r   r|   r{   r   r   r   r   r   )r   r1   r   r   r   r   r   r   r   r!   r"   rN     s*   
	z0CrtSigV4QueryAuth._modify_request_before_signingc                    r   r   r   r   r   r!   r"   rd   D  r   z(CrtSigV4QueryAuth._apply_signing_changesr   r!   r!   r   r"   r   
  s    
0r   c                   @   r   )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   r   r   r!   r   r!   r!   r"   rU   a  r   z/CrtS3SigV4QueryAuth._should_sha256_sign_payloadc                 C   r   r   r!   r   r!   r!   r"   rV   h  r   z5CrtS3SigV4QueryAuth._should_add_content_sha256_headerNr   r!   r!   r!   r"   r  U  s    r  )v4zv4-queryv4as3v4z
s3v4-querys3v4azs3v4a-query)rH   ior   botocore.authr   r   r   r   r   r   botocore.compatr	   r
   r   r   r   botocore.exceptionsr   botocore.useragentr   botocore.utilsr   r   r   r   r   r   r   r   r  CRT_AUTH_TYPE_MAPSr!   r!   r!   r"   <module>   s2     7 2EK
