o
    è’Ojo´  ã                   @   sŽ  d dl Z d dlZd dlZ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 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z% e &e'¡Z(d	Z)d
Z*dZ+dZ,g d¢Z-dZ.dZ/dd„ Z0dd„ Z1G dd„ dƒZ2G dd„ de2ƒZ3G dd„ de2ƒZ4G dd„ de2ƒZ5G dd„ de2ƒZ6G dd„ de6ƒZ7G d d!„ d!e7ƒZ8G d"d#„ d#e8ƒZ9G d$d%„ d%e8ƒZ:G d&d'„ d'e6ƒZ;G d(d)„ d)e;ƒZ<G d*d+„ d+e6ƒZ=G d,d-„ d-e2ƒZ>G d.d/„ d/e>ƒZ?G d0d1„ d1e>ƒZ@G d2d3„ d3e3ƒZAd4d5„ ZBd6d7„ ZCe4e5e5e>e?e@e=e8e:e9eAd8œZDe�r+d d9lEmFZF eD GeF¡ n
eD Ge6e;e7e<d:œ¡ d;d<d=d>d?œZHd@dA„ eH I¡ D ƒZJdS )Bé    N)ÚMapping©Ú
formatdate)Úsha1Úsha256)Ú
itemgetter)ÚHAS_CRTÚMD5_AVAILABLEÚHTTPHeadersÚencodebytesÚensure_unicodeÚget_current_datetimeÚparse_qsÚquoteÚunquoteÚurlsplitÚ
urlunsplit)ÚNoAuthTokenErrorÚNoCredentialsErrorÚUnknownSignatureVersionErrorÚ UnsupportedSignatureVersionError)Úis_valid_ipv6_endpoint_urlÚnormalize_url_pathÚpercent_encode_sequenceÚ@e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855i   z%Y-%m-%dT%H:%M:%SZz%Y%m%dT%H%M%SZ)Ú
connectionÚexpectz
keep-alivezproxy-authenticatezproxy-authorizationÚteÚtrailerztransfer-encodingÚupgradez
user-agentzx-amzn-trace-idzUNSIGNED-PAYLOADz"STREAMING-UNSIGNED-PAYLOAD-TRAILERc                 C   s\   t | ƒ}|j}t| ƒrd|› d�}dddœ}|jd ur,|j| |j¡kr,|› d|j› �}|S )Nú[ú]éP   i»  )ÚhttpÚhttpsú:)r   Úhostnamer   ÚportÚgetÚscheme)ÚurlÚ	url_partsÚhostÚdefault_ports© r.   úS/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/botocore/auth.pyÚ_host_from_urlQ   s   þ
r0   c                 C   s<   | j }t|tƒrt | d¡¡}|S t|tƒrt |¡}|S ©Núutf-8)ÚdataÚ
isinstanceÚbytesÚjsonÚloadsÚdecodeÚstr)Úrequestr3   r.   r.   r/   Ú_get_body_as_dictd   s   

þ
r;   c                   @   s   e Zd ZdZdZdd„ ZdS )Ú
BaseSignerFc                 C   s   t dƒ‚)NÚadd_auth)ÚNotImplementedError©Úselfr:   r.   r.   r/   r=   u   s   zBaseSigner.add_authN)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONÚREQUIRES_TOKENr=   r.   r.   r.   r/   r<   q   s    r<   c                   @   s   e Zd ZdZ	 dd„ ZdS )ÚTokenSignerTc                 C   ó
   || _ d S ©N)Ú
auth_token)r@   rI   r.   r.   r/   Ú__init__   ó   
zTokenSigner.__init__N)rA   rB   rC   rE   rJ   r.   r.   r.   r/   rF   y   s    rF   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	SigV2Authz+
    Sign a request with Signature V2.
    c                 C   rG   rH   ©Úcredentials©r@   rN   r.   r.   r/   rJ   ˆ   rK   zSigV2Auth.__init__c                 C   s
  t  d¡ t|jƒ}|j}t|ƒdkrd}|j› d|j› d|› d�}tj	| j
j d¡td�}g }t|ƒD ])}|dkr;q4t|| ƒ}	t| d¡dd	�}
t|	 d¡d
d	�}| |
› d|› �¡ q4d |¡}||7 }t  d|¡ | | d¡¡ t | ¡ ¡ ¡  d¡}||fS )Nz$Calculating signature using v2 auth.r   ú/Ú
r2   ©Ú	digestmodÚ	SignatureÚ ©Úsafez-_~ú=ú&zString to sign: %s)ÚloggerÚdebugr   r*   ÚpathÚlenÚmethodÚnetlocÚhmacÚnewrN   Ú
secret_keyÚencoder   Úsortedr9   r   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr8   )r@   r:   ÚparamsÚsplitr\   Ústring_to_signÚlhmacÚpairsÚkeyÚvalueÚ
quoted_keyÚquoted_valueÚqsÚb64r.   r.   r/   Úcalc_signature‹   s.   

ÿ
zSigV2Auth.calc_signaturec                 C   s„   | j d u rtƒ ‚|jr|j}n|j}| j j|d< d|d< d|d< t tt ¡ ¡|d< | j j	r4| j j	|d< |  
||¡\}}||d< |S )	NÚAWSAccessKeyIdÚ2ÚSignatureVersionÚ
HmacSHA256ÚSignatureMethodÚ	TimestampÚSecurityTokenrT   )rN   r   r3   rl   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenrw   )r@   r:   rl   ru   Ú	signaturer.   r.   r/   r=   §   s   
zSigV2Auth.add_authN)rA   rB   rC   Ú__doc__rJ   rw   r=   r.   r.   r.   r/   rL   ƒ   s
    rL   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	SigV3Authc                 C   rG   rH   rM   rO   r.   r.   r/   rJ   Á   rK   zSigV3Auth.__init__c                 C   sÒ   | j d u rtƒ ‚d|jv r|jd= tdd�|jd< | j jr-d|jv r&|jd= | j j|jd< tj| j j d¡t	d�}| 
|jd  d¡¡ t| ¡ ƒ ¡ }d| j j› d| d¡› �}d	|jv rb|jd	= ||jd	< d S )
NÚDateT©ÚusegmtúX-Amz-Security-Tokenr2   rR   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rN   r   Úheadersr   r„   r`   ra   rb   rc   r   rg   r   rj   rk   r   r8   )r@   r:   Únew_hmacÚencoded_signaturer…   r.   r.   r/   r=   Ä   s*   


ÿÿÿ
zSigV3Auth.add_authN)rA   rB   rC   rJ   r=   r.   r.   r.   r/   r‡   À   s    r‡   c                   @   sÆ   e Zd ZdZdZdd„ Zd1d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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d0S )2Ú	SigV4Authz+
    Sign a request with Signature V4.
    Tc                 C   s   || _ || _|| _d S rH   )rN   Ú_region_nameÚ_service_name©r@   rN   Úservice_nameÚregion_namer.   r.   r/   rJ   ã   s   
zSigV4Auth.__init__Fc                 C   s<   |rt  || d¡t¡ ¡ }|S t  || d¡t¡ ¡ }|S r1   )r`   ra   rc   r   Ú	hexdigestrj   )r@   rq   ÚmsgÚhexÚsigr.   r.   r/   Ú_signë   s
   ÿzSigV4Auth._signc                 C   sL   t ƒ }|j ¡ D ]\}}| ¡ }|tvr|||< qd|vr$t|jƒ|d< |S )zk
        Select the headers from the request that need to be included
        in the StringToSign.
        r,   )r
   rŒ   ÚitemsÚlowerÚSIGNED_HEADERS_BLACKLISTr0   r*   )r@   r:   Ú
header_mapÚnamerr   Úlnamer.   r.   r/   Úheaders_to_signò   s   €zSigV4Auth.headers_to_signc                 C   s"   |j r	|  |j ¡S |  t|jƒ¡S rH   )rl   Ú_canonical_query_string_paramsÚ_canonical_query_string_urlr   r*   r?   r.   r.   r/   Úcanonical_query_string  s   z SigV4Auth.canonical_query_stringc                 C   s~   g }t |tƒr| ¡ }|D ]\}}| t|dd�tt|ƒdd�f¡ qg }t|ƒD ]\}}| |› d|› �¡ q)d |¡}|S )Nz-_.~rV   rX   rY   )r4   r   rš   re   r   r9   rd   rf   )r@   rl   Úkey_val_pairsrq   rr   Úsorted_key_valsr£   r.   r.   r/   r¡     s   
ÿ
z(SigV4Auth._canonical_query_string_paramsc           	      C   sv   d}|j r9g }|j  d¡D ]}| d¡\}}}| ||f¡ qg }t|ƒD ]\}}| |› d|› �¡ q%d |¡}|S )NrU   rY   rX   )Úqueryrm   Ú	partitionre   rd   rf   )	r@   Úpartsr£   r¤   Úpairrq   Ú_rr   r¥   r.   r.   r/   r¢     s   
z%SigV4Auth._canonical_query_string_urlc                    sZ   g }t t|ƒƒ}|D ]}d ‡ fdd„| |¡D ƒ¡}| |› dt|ƒ› �¡ q
d |¡S )a  
        Return the headers that need to be included in the StringToSign
        in their canonical form by converting all header keys to lower
        case, sorting them in alphabetical order and then joining
        them into a string, separated by newlines.
        ú,c                 3   s   � | ]}ˆ   |¡V  qd S rH   )Ú_header_value©Ú.0Úv©r@   r.   r/   Ú	<genexpr>7  s   € 

ÿz.SigV4Auth.canonical_headers.<locals>.<genexpr>r%   rQ   )rd   Úsetrf   Úget_allre   r   )r@   r    rŒ   Úsorted_header_namesrq   rr   r.   r°   r/   Úcanonical_headers-  s   ÿ
zSigV4Auth.canonical_headersc                 C   s   d  | ¡ ¡S )Nú )rf   rm   )r@   rr   r.   r.   r/   r¬   =  s   zSigV4Auth._header_valuec                 C   s    t dd„ t|ƒD ƒƒ}d |¡S )Nc                 s   s   � | ]	}|  ¡  ¡ V  qd S rH   )r›   rk   )r®   Únr.   r.   r/   r±   F  s   € z+SigV4Auth.signed_headers.<locals>.<genexpr>ú;)rd   r²   rf   )r@   r    rŒ   r.   r.   r/   Úsigned_headersE  s   
zSigV4Auth.signed_headersc                 C   s0   |j  di ¡}| d¡}t|tƒo| d¡dkS )NÚchecksumÚrequest_algorithmÚinr   )Úcontextr(   r4   Údict)r@   r:   Úchecksum_contextÚ	algorithmr.   r.   r/   Ú_is_streaming_checksum_payloadI  s   
z(SigV4Auth._is_streaming_checksum_payloadc                 C   s�   |   |¡rtS |  |¡stS |j}|r>t|dƒr>| ¡ }t |j	t
¡}tƒ }t|dƒD ]}| |¡ q+| ¡ }| |¡ |S |rFt|ƒ ¡ S tS )NÚseekó    )rÁ   Ú"STREAMING_UNSIGNED_PAYLOAD_TRAILERÚ_should_sha256_sign_payloadÚUNSIGNED_PAYLOADÚbodyÚhasattrÚtellÚ	functoolsÚpartialÚreadÚPAYLOAD_BUFFERr   Úiterrg   r•   rÂ   ÚEMPTY_SHA256_HASH)r@   r:   Úrequest_bodyÚpositionÚread_chunksizerº   ÚchunkÚhex_checksumr.   r.   r/   ÚpayloadN  s&   

ÿ
zSigV4Auth.payloadc                 C   s   |j  d¡sdS |j dd¡S )Nr$   TÚpayload_signing_enabled)r*   Ú
startswithr½   r(   r?   r.   r.   r/   rÅ   h  s   z%SigV4Auth._should_sha256_sign_payloadc                 C   sš   |j  ¡ g}|  t|jƒj¡}| |¡ | |  |¡¡ |  |¡}| |  	|¡d ¡ | |  
|¡¡ d|jv r>|jd }n|  |¡}| |¡ d |¡S )NrQ   úX-Amz-Content-SHA256)r^   ÚupperÚ_normalize_url_pathr   r*   r\   re   r£   r    rµ   r¹   rŒ   rÕ   rf   )r@   r:   Úcrr\   r    Úbody_checksumr.   r.   r/   Úcanonical_requestr  s   





zSigV4Auth.canonical_requestc                 C   s   t t|ƒdd�}|S )Nz/~rV   )r   r   )r@   r\   Únormalized_pathr.   r.   r/   rÚ   �  s   zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}| |jd dd… ¡ | | j¡ | | j¡ | d¡ d |¡S ©NÚ	timestampr   é   Úaws4_requestrP   )rN   r   re   r½   r�   r‘   rf   ©r@   r:   Úscoper.   r.   r/   rä   …  s   


zSigV4Auth.scopec                 C   sH   g }|  |jd dd… ¡ |  | j¡ |  | j¡ |  d¡ d |¡S rß   )re   r½   r�   r‘   rf   rã   r.   r.   r/   Úcredential_scope�  s   

zSigV4Auth.credential_scopec                 C   sH   dg}|  |jd ¡ |  |  |¡¡ |  t| d¡ƒ ¡ ¡ d |¡S )z¬
        Return the canonical StringToSign as well as a dict
        containing the original version of all headers that
        were included in the StringToSign.
        úAWS4-HMAC-SHA256rà   r2   rQ   )re   r½   rå   r   rc   r•   rf   )r@   r:   rÝ   Ústsr.   r.   r/   rn   •  s
   
zSigV4Auth.string_to_signc                 C   sd   | j j}|  d|› � ¡ |jd dd… ¡}|  || j¡}|  || j¡}|  |d¡}| j||dd�S )NÚAWS4rà   r   rá   râ   T)r—   )rN   rb   r™   rc   r½   r�   r‘   )r@   rn   r:   rq   Úk_dateÚk_regionÚ	k_serviceÚ	k_signingr.   r.   r/   r…   ¡  s   ÿzSigV4Auth.signaturec                 C   s�   | j d u rtƒ ‚tƒ }| t¡|jd< |  |¡ |  |¡}t 	d¡ t 	d|¡ |  
||¡}t 	d|¡ |  ||¡}t 	d|¡ |  ||¡ d S )Nrà   z$Calculating signature using v4 auth.zCanonicalRequest:
%súStringToSign:
%szSignature:
%s)rN   r   r   r�   ÚSIGV4_TIMESTAMPr½   Ú_modify_request_before_signingrÝ   rZ   r[   rn   r…   Ú_inject_signature_to_request)r@   r:   Údatetime_nowrÝ   rn   r…   r.   r.   r/   r=   «  s   



zSigV4Auth.add_authc                 C   sV   d|   |¡› �g}|  |¡}| d|  |¡› �¡ | d|› �¡ d |¡|jd< |S )NzAWS4-HMAC-SHA256 Credential=zSignedHeaders=z
Signature=ú, ÚAuthorization)rä   r    re   r¹   rf   rŒ   )r@   r:   r…   Úauth_strr    r.   r.   r/   rð   ½  s   
ÿz&SigV4Auth._inject_signature_to_requestc                 C   sv   d|j v r	|j d= |  |¡ | jjr"d|j v r|j d= | jj|j d< |j dd¡s9d|j v r2|j d= t|j d< d S d S )Nró   r‹   rÖ   TrØ   )rŒ   Ú_set_necessary_date_headersrN   r„   r½   r(   rÆ   r?   r.   r.   r/   rï   Ç  s   



ýz(SigV4Auth._modify_request_before_signingc                 C   s‚   d|j v r.|j d= tj |jd t¡}ttt | 	¡ ¡ƒƒ|j d< d|j v r,|j d= d S d S d|j v r7|j d= |jd |j d< d S )Nrˆ   rà   ú
X-Amz-Date)
rŒ   ÚdatetimeÚstrptimer½   rî   r   ÚintÚcalendarÚtimegmÚ	timetuple)r@   r:   Údatetime_timestampr.   r.   r/   rõ   Õ  s   

ÿ
ÿ
ÿ
z%SigV4Auth._set_necessary_date_headersN)F)rA   rB   rC   r†   rD   rJ   r™   r    r£   r¡   r¢   rµ   r¬   r¹   rÁ   rÕ   rÅ   rÝ   rÚ   rä   rå   rn   r…   r=   rð   rï   rõ   r.   r.   r.   r/   r�   Ü   s2    




r�   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚS3SigV4Authc                    s2   t ƒ  |¡ d|jv r|jd= |  |¡|jd< d S )NrØ   )Úsuperrï   rŒ   rÕ   r?   ©Ú	__class__r.   r/   rï   ê  s   
z*S3SigV4Auth._modify_request_before_signingc                    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Ö   zContent-MD5rº   r»   r¼   Úheaderrž   r$   TÚhas_streaming_inputF)
r½   r(   Úgetattrr4   r¾   r*   r×   rŒ   rÿ   rÅ   )r@   r:   r  Ú	s3_configÚsign_payloadÚchecksum_headerr¿   rÀ   r   r.   r/   rÅ   ñ  s(   

ÿþz'S3SigV4Auth._should_sha256_sign_payloadc                 C   ó   |S rH   r.   ©r@   r\   r.   r.   r/   rÚ     ó   zS3SigV4Auth._normalize_url_path)rA   rB   rC   rï   rÅ   rÚ   Ú__classcell__r.   r.   r   r/   rþ   é  s    )rþ   c                       s8   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚS3ExpressAuthTc                   ó   t ƒ  |||¡ || _d S rH   )rÿ   rJ   Ú_identity_cache)r@   rN   r“   r”   Úidentity_cacher   r.   r/   rJ   "  ó   
zS3ExpressAuth.__init__c                    s   t ƒ  |¡ d S rH   )rÿ   r=   r?   r   r.   r/   r=   (  s   zS3ExpressAuth.add_authc                    s>   t ƒ  |¡ d|jvr| jj|jd< d|jv r|jd= d S d S )Nzx-amz-s3session-tokenr‹   )rÿ   rï   rŒ   rN   r„   r?   r   r.   r/   rï   +  s   

ÿz,S3ExpressAuth._modify_request_before_signing)rA   rB   rC   ÚREQUIRES_IDENTITY_CACHErJ   r=   rï   r  r.   r.   r   r/   r    s
    r  c                   @   ó   e Zd ZdZdd„ ZdS )ÚS3ExpressPostAuthTc                 C   óJ  t ƒ }| t¡|jd< i }|j dd ¡d ur|jd }i }g }|j dd ¡d ur9|jd }| dd ¡d ur9|d }||d< d|d< |  |¡|d< |jd |d< | ddi¡ | d|  |¡i¡ | d|jd i¡ | jjd ur| jj|d	< | d	| jji¡ t	 
t |¡ d
¡¡ d
¡|d< |  |d |¡|d< ||jd< ||jd< d S )Nrà   ús3-presign-post-fieldsús3-presign-post-policyÚ
conditionsræ   úx-amz-algorithmúx-amz-credentialú
x-amz-dateúX-Amz-S3session-Tokenr2   Úpolicyúx-amz-signature©r   r�   rî   r½   r(   rä   re   rN   r„   rh   ri   r6   Údumpsrc   r8   r…   ©r@   r:   rñ   Úfieldsr  r  r.   r.   r/   r=   7  s>   


ÿÿþ
zS3ExpressPostAuth.add_authN)rA   rB   rC   r  r=   r.   r.   r.   r/   r  4  s    r  c                       sJ   e Zd ZdZdZedœ‡ fdd„
Zdd„ Zdd	„ Zd
d„ Zdd„ Z	‡  Z
S )ÚS3ExpressQueryAuthi,  T)Úexpiresc                   s   t ƒ j||||d� || _d S )N)r  ©rÿ   rJ   Ú_expires)r@   rN   r“   r”   r  r%  r   r.   r/   rJ   e  s   	ü
zS3ExpressQueryAuth.__init__c                 C   ó  |j  d¡}d}||kr|j d= |  |  |¡¡}d|  |¡|jd | j|dœ}| jjd ur3| jj|d< t	|j
ƒ}t|jdd�}d	d
„ | ¡ D ƒ}|jrT| |j¡ i |_d}	|jrc| t|ƒ¡ d|_|rkt|ƒd }	|	› t|ƒ› �}
|}|d |d |d |
|d f}t|ƒ|_
d S )Núcontent-typeú0application/x-www-form-urlencoded; charset=utf-8ræ   rà   ©zX-Amz-AlgorithmzX-Amz-Credentialrö   zX-Amz-ExpireszX-Amz-SignedHeadersr  T©Úkeep_blank_valuesc                 S   ó   i | ]	\}}||d  “qS ©r   r.   ©r®   Úkr¯   r.   r.   r/   Ú
<dictcomp>•  ó    zES3ExpressQueryAuth._modify_request_before_signing.<locals>.<dictcomp>rU   rY   r   é   é   é   ©rŒ   r(   r¹   r    rä   r½   r'  rN   r„   r   r*   r   r¦   rš   rl   rg   r3   r;   r   r   )r@   r:   Úcontent_typeÚblocklisted_content_typer¹   Úauth_paramsr+   Úquery_string_partsÚ
query_dictÚoperation_paramsÚnew_query_stringÚpÚnew_url_partsr.   r.   r/   rï   v  ó>   ÿû
ÿz1S3ExpressQueryAuth._modify_request_before_signingc                 C   ó   | j d|› �7  _ d S ©Nz&X-Amz-Signature=©r*   ©r@   r:   r…   r.   r.   r/   rð   ·  ó   z/S3ExpressQueryAuth._inject_signature_to_requestc                 C   r
  rH   r.   r  r.   r.   r/   rÚ   ½  r  z&S3ExpressQueryAuth._normalize_url_pathc                 C   ó   t S rH   ©rÆ   r?   r.   r.   r/   rÕ   Á  ó   zS3ExpressQueryAuth.payload)rA   rB   rC   ÚDEFAULT_EXPIRESr  rJ   rï   rð   rÚ   rÕ   r  r.   r.   r   r/   r$  a  s    	ùAr$  c                       s4   e Zd ZdZef‡ fdd„	Zdd„ Zdd„ Z‡  ZS )ÚSigV4QueryAuthé  c                    r  rH   r&  )r@   rN   r“   r”   r%  r   r.   r/   rJ   Ì  r  zSigV4QueryAuth.__init__c                 C   r(  )Nr)  r*  ræ   rà   r+  r‹   Tr,  c                 S   r.  r/  r.   r0  r.   r.   r/   r2  ñ  r3  zASigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>rU   rY   r   r4  r5  r6  r7  )r@   r:   r8  Úblacklisted_content_typer¹   r:  r+   r;  r<  r=  r>  r?  r@  r.   r.   r/   rï   Ò  rA  z-SigV4QueryAuth._modify_request_before_signingc                 C   rB  rC  rD  rE  r.   r.   r/   rð     rF  z+SigV4QueryAuth._inject_signature_to_request)rA   rB   rC   rJ  rJ   rï   rð   r  r.   r.   r   r/   rK  É  s    ÿArK  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚS3SigV4QueryAutha  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

    c                 C   r
  rH   r.   r  r.   r.   r/   rÚ   &  r  z$S3SigV4QueryAuth._normalize_url_pathc                 C   rG  rH   rH  r?   r.   r.   r/   rÕ   *  rI  zS3SigV4QueryAuth.payloadN)rA   rB   rC   r†   rÚ   rÕ   r.   r.   r.   r/   rN    s    rN  c                   @   r  )ÚS3SigV4PostAuthz†
    Presigns a s3 post

    Implementation doc here:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
    c                 C   r  )Nrà   r  r  r  ræ   r  r  r  úx-amz-security-tokenr2   r  r  r   r"  r.   r.   r/   r=   :  s:   

ÿþ
zS3SigV4PostAuth.add_authN©rA   rB   rC   r†   r=   r.   r.   r.   r/   rO  2  ó    rO  c                   @   sx   e Zd Zg d¢Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd„Z		ddd„Z
	ddd„Zdd„ Zdd„ Zdd„ ZdS )Ú
HmacV1Auth)$Ú
accelerateÚaclÚcorsÚdefaultObjectAclÚlocationÚloggingÚ
partNumberr  ÚrequestPaymentÚtorrentÚ
versioningÚ	versionIdÚversionsÚwebsiteÚuploadsÚuploadIdzresponse-content-typezresponse-content-languagezresponse-expireszresponse-cache-controlzresponse-content-dispositionzresponse-content-encodingÚdeleteÚ	lifecycleÚtaggingÚrestoreÚstorageClassÚnotificationÚreplicationr[  Ú	analyticsÚmetricsÚ	inventoryÚselectzselect-typezobject-lockNc                 C   rG   rH   rM   r’   r.   r.   r/   rJ   ‹  rK   zHmacV1Auth.__init__c                 C   s>   t j| jj d¡td�}| | d¡¡ t| ¡ ƒ 	¡  
d¡S )Nr2   rR   )r`   ra   rN   rb   rc   r   rg   r   rj   rk   r8   )r@   rn   r�   r.   r.   r/   Úsign_stringŽ  s
   ÿzHmacV1Auth.sign_stringc                 C   sˆ   g d¢}g }d|v r|d= |   ¡ |d< |D ])}d}|D ]}| ¡ }|| d ur6||kr6| ||  ¡ ¡ d}q|s>| d¡ qd |¡S )N)úcontent-md5r)  Údaterˆ   FTrU   rQ   )Ú	_get_dater›   re   rk   rf   )r@   rŒ   Úinteresting_headersÚhoiÚihÚfoundrq   Úlkr.   r.   r/   Úcanonical_standard_headers•  s"   €
€
z%HmacV1Auth.canonical_standard_headersc                 C   s†   g }i }|D ] }|  ¡ }|| d ur&| d¡r&d dd„ | |¡D ƒ¡||< qt| ¡ ƒ}|D ]}| |› d|| › �¡ q/d |¡S )Núx-amz-r«   c                 s   s   � | ]}|  ¡ V  qd S rH   )rk   r­   r.   r.   r/   r±   ­  s   € 
ÿz6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>r%   rQ   )r›   r×   rf   r³   rd   Úkeysre   )r@   rŒ   rs  Úcustom_headersrq   rv  Úsorted_header_keysr.   r.   r/   Úcanonical_custom_headers¦  s   

ÿ€
z#HmacV1Auth.canonical_custom_headersc                 C   s$   t |ƒdkr|S |d t|d ƒfS )z(
        TODO: Do we need this?
        r4  r   )r]   r   )r@   Únvr.   r.   r/   Ú	unquote_vµ  s   zHmacV1Auth.unquote_vc                    sŠ   |d ur|}n|j }|jrC|j d¡}dd„ |D ƒ}‡ fdd„|D ƒ}t|ƒdkrC|jtdƒd� dd„ |D ƒ}|d7 }|d |¡7 }|S )	NrY   c                 S   s   g | ]}|  d d¡‘qS )rX   r4  ©rm   ©r®   Úar.   r.   r/   Ú
<listcomp>Í  s    z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d  ˆ j v rˆ  |¡‘qS r/  )ÚQSAOfInterestr~  r€  r°   r.   r/   r‚  Î  s
    ÿÿr   )rq   c                 S   s   g | ]}d   |¡‘qS )rX   )rf   r€  r.   r.   r/   r‚  Ó  s    ú?)r\   r¦   rm   r]   Úsortr   rf   )r@   rm   Ú	auth_pathÚbufÚqsar.   r°   r/   Úcanonical_resource¾  s   	
ÿzHmacV1Auth.canonical_resourcec                 C   sN   |  ¡ d }||  |¡d 7 }|  |¡}|r||d 7 }|| j||d�7 }|S )NrQ   ©r†  )rÙ   rw  r|  r‰  )r@   r^   rm   rŒ   r%  r†  Úcsrz  r.   r.   r/   Úcanonical_stringØ  s   
zHmacV1Auth.canonical_stringc                 C   sB   | j jr|d= | j j|d< | j||||d�}t d|¡ |  |¡S )NrP  rŠ  rí   )rN   r„   rŒ  rZ   r[   rn  )r@   r^   rm   rŒ   r%  r†  rn   r.   r.   r/   Úget_signatureã  s   ÿ
zHmacV1Auth.get_signaturec                 C   sX   | j d u rt‚t d¡ t|jƒ}t d|j¡ | j|j||j|j	d�}|  
||¡ d S )Nz(Calculating signature using hmacv1 auth.zHTTP request method: %srŠ  )rN   r   rZ   r[   r   r*   r^   r�  rŒ   r†  Ú_inject_signature)r@   r:   rm   r…   r.   r.   r/   r=   ï  s   


ÿzHmacV1Auth.add_authc                 C   s
   t dd�S )NTr‰   r   r°   r.   r.   r/   rq  ú  rK   zHmacV1Auth._get_datec                 C   s4   d|j v r	|j d= d| jj› d|› �}||j d< d S )Nró   zAWS r%   )rŒ   rN   r   )r@   r:   r…   Úauth_headerr.   r.   r/   rŽ  ý  s   
zHmacV1Auth._inject_signature)NNrH   )rA   rB   rC   rƒ  rJ   rn  rw  r|  r~  r‰  rŒ  r�  r=   rq  rŽ  r.   r.   r.   r/   rS  b  s    
'
	
ÿ
ÿrS  c                   @   s0   e Zd ZdZdZefdd„Zdd„ Zdd„ Zd	S )
ÚHmacV1QueryAuthzÁ
    Generates a presigned request for s3.

    Spec from this document:

    http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
    #RESTAuthenticationQueryStringAuth

    rL  c                 C   s   || _ || _d S rH   )rN   r'  )r@   rN   r%  r.   r.   r/   rJ     s   
zHmacV1QueryAuth.__init__c                 C   s   t tt ¡ t| jƒ ƒƒS rH   )r9   rù   r€   r'  r°   r.   r.   r/   rq    s   zHmacV1QueryAuth._get_datec           	      C   s¼   i }| j j|d< ||d< |jD ]"}| ¡ }|dkr!|jd |d< q| d¡s*|dv r1|j| ||< qt|ƒ}t|jƒ}|d rH|d › d|› �}|d	 |d
 |d ||d f}t|ƒ|_d S )Nrx   rT   rˆ   ÚExpiresrx  )ro  r)  é   rY   r   r4  r5  r6  )	rN   r   rŒ   r›   r×   r   r   r*   r   )	r@   r:   r…   r<  Ú
header_keyrv  r>  r?  r@  r.   r.   r/   rŽ    s    
€
z!HmacV1QueryAuth._inject_signatureN)rA   rB   rC   r†   rJ  rJ   rq  rŽ  r.   r.   r.   r/   r�    s    
r�  c                   @   r  )ÚHmacV1PostAuthz‘
    Generates a presigned post for s3.

    Spec from this document:

    http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
    c                 C   sä   i }|j  dd ¡d ur|j d }i }g }|j  dd ¡d ur.|j d }| dd ¡d ur.|d }||d< | jj|d< | jjd urM| jj|d< | d| jji¡ t t 	|¡ 
d¡¡ d¡|d< |  |d ¡|d< ||j d< ||j d< d S )	Nr  r  r  rx   rP  r2   r  r…   )r½   r(   rN   r   r„   re   rh   ri   r6   r!  rc   r8   rn  )r@   r:   r#  r  r  r.   r.   r/   r=   I  s,   

ÿþ
zHmacV1PostAuth.add_authNrQ  r.   r.   r.   r/   r”  @  s    r”  c                   @   r  )Ú
BearerAuthzÑ
    Performs bearer token authorization by placing the bearer token in the
    Authorization header as specified by Section 2.1 of RFC 6750.

    https://datatracker.ietf.org/doc/html/rfc6750#section-2.1
    c                 C   s>   | j d u rtƒ ‚d| j j› �}d|jv r|jd= ||jd< d S )NzBearer ró   )rI   r   r„   rŒ   )r@   r:   r�  r.   r.   r/   r=   p  s   

zBearerAuth.add_authNrQ  r.   r.   r.   r/   r•  h  rR  r•  c                 C   sR   | D ]!}|dkrt |   S |t v rt | }|tv r|  S qt|d�‚t| d�‚)Núsmithy.api#noAuth©Úsignature_version)ÚAUTH_TYPE_TO_SIGNATURE_VERSIONÚAUTH_TYPE_MAPSr   r   )Ú
auth_traitÚ	auth_typer˜  r.   r.   r/   Úresolve_auth_typez  s   ÿ

r�  c                    s˜   dd„ |D ƒ‰ dd„ | D ƒ}|rt  d|¡ | ˆ  }‡ fdd„t |¡D ƒ}|D ]}|dkr4t|   S t |¡}|tv rA|  S q(td t	ˆ ƒ¡d�‚)	Nc                 S   s   g | ]	}|  d ¡d ‘qS ©ú#éÿÿÿÿr  ©r®   r)   r.   r.   r/   r‚  ˆ  r3  z2resolve_auth_scheme_preference.<locals>.<listcomp>c                 S   s   g | ]}|t vr|‘qS r.   )ÚAUTH_PREF_TO_SIGNATURE_VERSIONr¡  r.   r.   r/   r‚  Š  ó    ýÿz/Unsupported auth schemes in preference list: %rc                    s   g | ]}|ˆ v r|‘qS r.   r.   r¡  ©Úservice_supportedr.   r/   r‚  •  r£  ÚnoAuthrò   r—  )
rZ   r[   r¾   Úfromkeysr¢  r(   rš  r   rf   rd   )Úpreference_listÚauth_optionsÚunsupportedÚcombinedÚprioritized_schemesr)   Úsig_versionr.   r¤  r/   Úresolve_auth_scheme_preference‡  s,   þÿ
þ
ÿÿr®  )Úv2Úv3Úv3httpsr  zs3-queryzs3-presign-postzs3v4-presign-postzv4-s3expresszv4-s3express-queryzv4-s3express-presign-postÚbearer)ÚCRT_AUTH_TYPE_MAPS)Úv4zv4-queryÚs3v4z
s3v4-queryr´  Úv4ar²  Únone)zaws.auth#sigv4zaws.auth#sigv4azsmithy.api#httpBearerAuthr–  c                 C   s    i | ]\}}|  d ¡d |“qS rž  r  )r®   Úauth_schemer­  r.   r.   r/   r2  Ï  s    ÿÿr2  )Krh   rú   r÷   rÊ   r`   r6   rY  r€   Úcollections.abcr   Úemail.utilsr   Úhashlibr   r   Úoperatorr   Úbotocore.compatr   r	   r
   r   r   r   r   r   r   r   r   Úbotocore.exceptionsr   r   r   r   Úbotocore.utilsr   r   r   Ú	getLoggerrA   rZ   rÏ   rÍ   r‚   rî   rœ   rÆ   rÄ   r0   r;   r<   rF   rL   r‡   r�   rþ   r  r  r$  rK  rN  rO  rS  r�  r”  r•  r�  r®  rš  Úbotocore.crt.authr³  rg   r™  rš   r¢  r.   r.   r.   r/   Ú<module>   sš   4
ÿ
=  6-hQ0 *5(!õüÿ
ü
þ