U
    ÒZj�  ã                	   @   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 d dlmZmZ d dlmZm Z m!Z! d d	lm"Z" e #e$¡Z%d
Z&dZ'dZ(dZ)dddgZ*dZ+dZ,dd„ Z-dd„ Z.G dd„ dƒZ/G dd„ de/ƒZ0G dd„ de/ƒZ1G dd„ de/ƒZ2G dd „ d e/ƒZ3G d!d"„ d"e3ƒZ4G d#d$„ d$e3ƒZ5G d%d&„ d&e5ƒZ6G d'd(„ d(e3ƒZ7G d)d*„ d*e/ƒZ8G d+d,„ d,e8ƒZ9G d-d.„ d.e8ƒZ:G d/d0„ d0e0ƒZ;e1e2e2e8e9e:e7e;d1œZ<e�rd d2l=m>Z> e< ?e>¡ ne< ?e3e5e4e6d3œ¡ dS )4é    N)ÚMapping©Ú
formatdate)Úsha1Úsha256)Ú
itemgetter)	ÚHAS_CRTÚHTTPHeadersÚencodebytesÚensure_unicodeÚparse_qsÚquoteÚunquoteÚurlsplitÚ
urlunsplit)ÚNoAuthTokenErrorÚNoCredentialsError)Úis_valid_ipv6_endpoint_urlÚnormalize_url_pathÚpercent_encode_sequence)ÚMD5_AVAILABLEZ@e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855i   z%Y-%m-%dT%H:%M:%SZz%Y%m%dT%H%M%SZÚexpectz
user-agentzx-amzn-trace-idzUNSIGNED-PAYLOADz"STREAMING-UNSIGNED-PAYLOAD-TRAILERc                 C   sZ   t | ƒ}|j}t| ƒr"d|› d�}dddœ}|jd k	rV|j| |j¡krVd||jf }|S )Nú[ú]éP   i»  )ÚhttpÚhttpsz%s:%d)r   Úhostnamer   ÚportÚgetÚscheme)ÚurlÚ	url_partsÚhostZdefault_ports© r$   úP/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/botocore/auth.pyÚ_host_from_urlF   s    þ
r&   c                 C   s:   | j }t|tƒr"t | d¡¡}nt|tƒr6t |¡}|S ©Núutf-8)ÚdataÚ
isinstanceÚbytesÚjsonÚloadsÚdecodeÚstr)Úrequestr)   r$   r$   r%   Ú_get_body_as_dictY   s    


r1   c                   @   s   e Zd ZdZdZdd„ ZdS )Ú
BaseSignerFc                 C   s   t dƒ‚d S )NÚadd_auth)ÚNotImplementedError©Úselfr0   r$   r$   r%   r3   j   s    zBaseSigner.add_authN)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONÚREQUIRES_TOKENr3   r$   r$   r$   r%   r2   f   s   r2   c                   @   s   e Zd ZdZdd„ ZdS )ÚTokenSignerTc                 C   s
   || _ d S ©N)Ú
auth_token)r6   r>   r$   r$   r%   Ú__init__t   s    zTokenSigner.__init__N)r7   r8   r9   r;   r?   r$   r$   r$   r%   r<   n   s   r<   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   s
   || _ d S r=   ©Úcredentials©r6   rB   r$   r$   r%   r?   }   s    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 ]R}|dkrvqht|| ƒ}	t| d¡dd	�}
t|	 d¡d
d	�}| |
› d|› �¡ qhd |¡}||7 }t  d|¡ | | d¡¡ t | ¡ ¡ ¡  d¡}||fS )Nz$Calculating signature using v2 auth.r   ú/Ú
r(   ©Ú	digestmodÚ	SignatureÚ ©Úsafez-_~ú=ú&zString to sign: %s)ÚloggerÚdebugr   r!   ÚpathÚlenÚmethodÚnetlocÚhmacÚnewrB   Ú
secret_keyÚencoder   Úsortedr/   r   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr.   )r6   r0   ÚparamsÚsplitrP   Ústring_to_signZlhmacÚpairsÚkeyÚvalueZ
quoted_keyZquoted_valueÚqsZb64r$   r$   r%   Úcalc_signature€   s0    

 ÿ
zSigV2Auth.calc_signaturec                 C   s„   | j d krtƒ ‚|jr|j}n|j}| j j|d< d|d< d|d< t tt ¡ ¡|d< | j j	rh| j j	|d< |  
||¡\}}||d< |S )	NÚAWSAccessKeyIdÚ2ZSignatureVersionZ
HmacSHA256ZSignatureMethodÚ	TimestampZSecurityTokenrH   )rB   r   r)   r`   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenrg   )r6   r0   r`   rf   Ú	signaturer$   r$   r%   r3   œ   s    
zSigV2Auth.add_authN)r7   r8   r9   Ú__doc__r?   rg   r3   r$   r$   r$   r%   r@   x   s   r@   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	SigV3Authc                 C   s
   || _ d S r=   rA   rC   r$   r$   r%   r?   ¶   s    zSigV3Auth.__init__c                 C   sÒ   | j d krtƒ ‚d|jkr"|jd= tdd�|jd< | j jrZd|jkrL|jd= | j j|jd< tj| j j d¡t	d�}| 
|jd  d¡¡ t| ¡ ƒ ¡ }d| j j› d| d¡› �}d	|jkrÄ|jd	= ||jd	< d S )
NÚDateT©ÚusegmtúX-Amz-Security-Tokenr(   rF   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rB   r   Úheadersr   rp   rT   rU   rV   rW   r   r[   r
   r^   r_   rk   r.   )r6   r0   Únew_hmacZencoded_signaturerq   r$   r$   r%   r3   ¹   s(    


 ÿÿ
zSigV3Auth.add_authN)r7   r8   r9   r?   r3   r$   r$   r$   r%   rs   µ   s   rs   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 r=   )rB   Ú_region_nameÚ_service_name©r6   rB   Úservice_nameÚregion_namer$   r$   r%   r?   Ø   s    zSigV4Auth.__init__Fc                 C   s:   |rt  || d¡t¡ ¡ }nt  || d¡t¡ ¡ }|S r'   )rT   rU   rW   r   Ú	hexdigestr^   )r6   rd   ÚmsgÚhexÚsigr$   r$   r%   Ú_signà   s    zSigV4Auth._signc                 C   sL   t ƒ }|j ¡ D ] \}}| ¡ }|tkr|||< qd|krHt|jƒ|d< |S )zk
        Select the headers from the request that need to be included
        in the StringToSign.
        r#   )r	   rx   ÚitemsÚlowerÚSIGNED_HEADERS_BLACKLISTr&   r!   )r6   r0   Z
header_mapÚnamere   Úlnamer$   r$   r%   Úheaders_to_signç   s    
zSigV4Auth.headers_to_signc                 C   s&   |j r|  |j ¡S |  t|jƒ¡S d S r=   )r`   Ú_canonical_query_string_paramsÚ_canonical_query_string_urlr   r!   r5   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|› �¡ qRd |¡}|S )Nz-_.~rJ   rL   rM   )r*   r   r…   rY   r   r/   rX   rZ   )r6   r`   Úkey_val_pairsrd   re   Úsorted_key_valsr�   r$   r$   r%   r‹     s    
ÿ
z(SigV4Auth._canonical_query_string_paramsc           	      C   sv   d}|j rrg }|j  d¡D ]"}| d¡\}}}| ||f¡ qg }t|ƒD ]\}}| |› d|› �¡ qJd |¡}|S )NrI   rM   rL   )Úqueryra   Ú	partitionrY   rX   rZ   )	r6   Úpartsr�   rŽ   Úpairrd   Ú_re   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 r=   )Ú_header_value©Ú.0Úv©r6   r$   r%   Ú	<genexpr>,  s    z.SigV4Auth.canonical_headers.<locals>.<genexpr>ú:rE   )rX   ÚsetrZ   Úget_allrY   r   )r6   rŠ   rx   Zsorted_header_namesrd   re   r$   rš   r%   Úcanonical_headers"  s    ÿzSigV4Auth.canonical_headersc                 C   s   d  | ¡ ¡S )Nú )rZ   ra   )r6   re   r$   r$   r%   r–   2  s    zSigV4Auth._header_valuec                 C   s    t dd„ t|ƒD ƒƒ}d |¡S )Nc                 s   s   | ]}|  ¡  ¡ V  qd S r=   )r†   r_   )r˜   Únr$   r$   r%   r›   ;  s     z+SigV4Auth.signed_headers.<locals>.<genexpr>ú;)rX   r�   rZ   )r6   rŠ   rx   r$   r$   r%   Úsigned_headers:  s    zSigV4Auth.signed_headersc                 C   s0   |j  di ¡}| d¡}t|tƒo.| d¡dkS )NÚchecksumÚrequest_algorithmÚinÚtrailer)Úcontextr   r*   Údict)r6   r0   Úchecksum_contextÚ	algorithmr$   r$   r%   Ú_is_streaming_checksum_payload>  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 ]}| |¡ qV| ¡ }| |¡ |S |rŒt|ƒ ¡ S tS d S )NÚseekó    )r¬   Ú"STREAMING_UNSIGNED_PAYLOAD_TRAILERÚ_should_sha256_sign_payloadÚUNSIGNED_PAYLOADÚbodyÚhasattrÚtellÚ	functoolsÚpartialÚreadÚPAYLOAD_BUFFERr   Úiterr[   r€   r­   ÚEMPTY_SHA256_HASH)r6   r0   Úrequest_bodyÚpositionZread_chunksizer¤   ÚchunkZhex_checksumr$   r$   r%   ÚpayloadC  s(    

 ÿ
zSigV4Auth.payloadc                 C   s   |j  d¡sdS |j dd¡S )Nr   TÚpayload_signing_enabled)r!   Ú
startswithr¨   r   r5   r$   r$   r%   r°   ]  s    z%SigV4Auth._should_sha256_sign_payloadc                 C   sš   |j  ¡ g}|  t|jƒj¡}| |¡ | |  |¡¡ |  |¡}| |  	|¡d ¡ | |  
|¡¡ d|jkr||jd }n
|  |¡}| |¡ d |¡S )NrE   úX-Amz-Content-SHA256)rR   ÚupperÚ_normalize_url_pathr   r!   rP   rY   r�   rŠ   rŸ   r£   rx   r¾   rZ   )r6   r0   ÚcrrP   rŠ   Zbody_checksumr$   r$   r%   Úcanonical_requestg  s    




zSigV4Auth.canonical_requestc                 C   s   t t|ƒdd�}|S )Nz/~rJ   )r   r   )r6   rP   Znormalized_pathr$   r$   r%   rÃ   v  s    zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}| |jd dd… ¡ | | j¡ | | j¡ | d¡ d |¡S ©NÚ	timestampr   é   Úaws4_requestrD   )rB   rk   rY   r¨   r{   r|   rZ   ©r6   r0   Úscoper$   r$   r%   rË   z  s    

zSigV4Auth.scopec                 C   sH   g }|  |jd dd… ¡ |  | j¡ |  | j¡ |  d¡ d |¡S rÆ   )rY   r¨   r{   r|   rZ   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Ç   r(   rE   )rY   r¨   rÌ   r   rW   r€   rZ   )r6   r0   rÅ   Ústsr$   r$   r%   rb   Š  s
    zSigV4Auth.string_to_signc                 C   sd   | j j}|  d|› � ¡ |jd dd… ¡}|  || j¡}|  || j¡}|  |d¡}| j||dd�S )NZAWS4rÇ   r   rÈ   rÉ   T)r‚   )rB   rV   r„   rW   r¨   r{   r|   )r6   rb   r0   rd   Zk_dateZk_regionZ	k_serviceZ	k_signingr$   r$   r%   rq   –  s     ÿzSigV4Auth.signaturec                 C   s”   | j d krtƒ ‚tj ¡ }| 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)rB   r   ÚdatetimeÚutcnowrm   ÚSIGV4_TIMESTAMPr¨   Ú_modify_request_before_signingrÅ   rN   rO   rb   rq   Ú_inject_signature_to_request)r6   r0   Údatetime_nowrÅ   rb   rq   r$   r$   r%   r3      s    




zSigV4Auth.add_authc                 C   sR   d|   |¡ g}|  |¡}| d|  |¡› �¡ | d| ¡ d |¡|jd< |S )NzAWS4-HMAC-SHA256 Credential=%szSignedHeaders=zSignature=%sz, ÚAuthorization)rË   rŠ   rY   r£   rZ   rx   )r6   r0   rq   Úauth_strrŠ   r$   r$   r%   rÔ   ²  s    
ÿz&SigV4Auth._inject_signature_to_requestc                 C   sr   d|j kr|j d= |  |¡ | jjrDd|j kr6|j d= | jj|j d< |j dd¡snd|j krd|j d= t|j d< d S )NrÖ   rw   r¿   TrÁ   )rx   Ú_set_necessary_date_headersrB   rp   r¨   r   r±   r5   r$   r$   r%   rÓ   ¼  s    



z(SigV4Auth._modify_request_before_signingc                 C   s|   d|j krV|j d= tj |jd t¡}ttt | 	¡ ¡ƒƒ|j d< d|j krx|j d= n"d|j krh|j d= |jd |j d< d S )Nrt   rÇ   ú
X-Amz-Date)
rx   rÐ   Ústrptimer¨   rÒ   r   ÚintÚcalendarÚtimegmÚ	timetuple)r6   r0   Zdatetime_timestampr$   r$   r%   rØ   Ê  s    
 ÿÿ



z%SigV4Auth._set_necessary_date_headersN)F)r7   r8   r9   rr   r:   r?   r„   rŠ   r�   r‹   rŒ   rŸ   r–   r£   r¬   r¾   r°   rÅ   rÃ   rË   rÌ   rb   rq   r3   rÔ   rÓ   rØ   r$   r$   r$   r%   rz   Ñ   s0   




rz   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚS3SigV4Authc                    s2   t ƒ  |¡ d|jkr|jd= |  |¡|jd< d S )NrÁ   )ÚsuperrÓ   rx   r¾   r5   ©Ú	__class__r$   r%   rÓ   ß  s    
z*S3SigV4Auth._modify_request_before_signingc                    s°   |j  d¡}t|dd ƒ}|d kr$i }| dd ¡}|d k	r<|S d}|j  di ¡}| d¡}t|tƒrx| d¡dkrx|d	 }|j d
¡rŽ||jkr’dS |j  dd¡r¤dS tƒ  	|¡S )NÚclient_configÚs3r¿   zContent-MD5r¤   r¥   r¦   Úheaderrˆ   r   TZhas_streaming_inputF)
r¨   r   Úgetattrr*   r©   r!   rÀ   rx   rà   r°   )r6   r0   rã   Z	s3_configZsign_payloadZchecksum_headerrª   r«   rá   r$   r%   r°   æ  s(    

ÿþz'S3SigV4Auth._should_sha256_sign_payloadc                 C   s   |S r=   r$   ©r6   rP   r$   r$   r%   rÃ     s    zS3SigV4Auth._normalize_url_path)r7   r8   r9   rÓ   r°   rÃ   Ú__classcell__r$   r$   rá   r%   rß   Þ  s   )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                    s   t ƒ  |||¡ || _d S r=   )rà   r?   Ú_expires)r6   rB   r~   r   Úexpiresrá   r$   r%   r?     s    zSigV4QueryAuth.__init__c                 C   s  |j  d¡}d}||kr |j d= |  |  |¡¡}d|  |¡|jd | j|dœ}| jjd k	rf| jj|d< t	|j
ƒ}t|jdd�}d	d
„ | ¡ D ƒ}|jr¨| |j¡ i |_d}	|jrÆ| t|ƒ¡ d|_|rÖt|ƒd }	|	› t|ƒ› �}
|}|d |d |d |
|d f}t|ƒ|_
d S )Núcontent-typez0application/x-www-form-urlencoded; charset=utf-8rÍ   rÇ   )zX-Amz-AlgorithmzX-Amz-CredentialrÙ   zX-Amz-ExpireszX-Amz-SignedHeadersrw   T)Úkeep_blank_valuesc                 S   s   i | ]\}}||d  “qS ©r   r$   )r˜   Úkr™   r$   r$   r%   Ú
<dictcomp><  s      zASigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>rI   rM   r   é   é   é   )rx   r   r£   rŠ   rË   r¨   rë   rB   rp   r   r!   r   r�   r…   r`   r[   r)   r1   r   r   )r6   r0   Úcontent_typeZblacklisted_content_typer£   Zauth_paramsr"   Zquery_string_partsÚ
query_dictZoperation_paramsÚnew_query_stringÚpÚnew_url_partsr$   r$   r%   rÓ     s>    ÿû
ÿz-SigV4QueryAuth._modify_request_before_signingc                 C   s   | j d| 7  _ d S )Nz&X-Amz-Signature=%s)r!   )r6   r0   rq   r$   r$   r%   rÔ   ^  s    z+SigV4QueryAuth._inject_signature_to_request)r7   r8   r9   ÚDEFAULT_EXPIRESr?   rÓ   rÔ   rè   r$   r$   rá   r%   ré     s
   ÿAré   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   s   |S r=   r$   rç   r$   r$   r%   rÃ   q  s    z$S3SigV4QueryAuth._normalize_url_pathc                 C   s   t S r=   )r±   r5   r$   r$   r%   r¾   u  s    zS3SigV4QueryAuth.payloadN)r7   r8   r9   rr   rÃ   r¾   r$   r$   r$   r%   rû   e  s   rû   c                   @   s   e Zd ZdZdd„ ZdS )ÚS3SigV4PostAuthz†
    Presigns a s3 post

    Implementation doc here:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
    c                 C   sP  t j  ¡ }| t¡|jd< i }|j dd ¡d k	r:|jd }i }g }|j dd ¡d k	rv|jd }| dd ¡d k	rv|d }||d< d|d< |  |¡|d< |jd |d< | ddi¡ | d|  |¡i¡ | d|jd i¡ | jj	d k	�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Í   zx-amz-algorithmzx-amz-credentialz
x-amz-dateúx-amz-security-tokenr(   Úpolicyzx-amz-signature)rÐ   rÑ   rm   rÒ   r¨   r   rË   rY   rB   rp   r\   r]   r,   ÚdumpsrW   r.   rq   )r6   r0   rÕ   Úfieldsr  rÿ   r$   r$   r%   r3   …  s:    


ÿþ
zS3SigV4PostAuth.add_authN©r7   r8   r9   rr   r3   r$   r$   r$   r%   rü   }  s   rü   c                $   @   s¸   e Zd Zddddddddd	d
dddddddddddddddddddd	ddd d!d"d#g$Zd;d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd<d/d0„Z	d=d1d2„Z
d>d3d4„Zd5d6„ Zd7d8„ Zd9d:„ Zd$S )?Ú
HmacV1AuthZ
accelerateZaclZcorsZdefaultObjectAclÚlocationÚloggingZ
partNumberr  ZrequestPaymentZtorrentZ
versioningZ	versionIdÚversionsZwebsiteZuploadsZuploadIdzresponse-content-typezresponse-content-languagezresponse-expireszresponse-cache-controlzresponse-content-dispositionzresponse-content-encodingÚdeleteZ	lifecycleZtaggingZrestoreZstorageClassZnotificationZreplicationZ	analyticsZmetricsZ	inventoryÚselectzselect-typezobject-lockNc                 C   s
   || _ d S r=   rA   r}   r$   r$   r%   r?   ×  s    zHmacV1Auth.__init__c                 C   s>   t j| jj d¡td�}| | d¡¡ t| ¡ ƒ 	¡  
d¡S )Nr(   rF   )rT   rU   rB   rV   rW   r   r[   r
   r^   r_   r.   )r6   rb   ry   r$   r$   r%   Úsign_stringÚ  s     ÿzHmacV1Auth.sign_stringc                 C   sŠ   dddg}g }d|kr|d= |   ¡ |d< |D ]R}d}|D ]6}| ¡ }|| d k	r8||kr8| ||  ¡ ¡ d}q8|s,| d¡ q,d |¡S )	Núcontent-md5rí   Údatert   FTrI   rE   )Ú	_get_dater†   rY   r_   rZ   )r6   rx   Zinteresting_headersÚhoiZihÚfoundrd   Úlkr$   r$   r%   Úcanonical_standard_headersá  s    
z%HmacV1Auth.canonical_standard_headersc                 C   s†   g }i }|D ]@}|  ¡ }|| d k	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 r=   )r_   r—   r$   r$   r%   r›   ù  s    z6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>rœ   rE   )r†   rÀ   rZ   rž   rX   ÚkeysrY   )r6   rx   r  Úcustom_headersrd   r  Z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 dS )z(
        TODO: Do we need this?
        rò   r   N)rQ   r   )r6   Únvr$   r$   r%   Ú	unquote_v  s    zHmacV1Auth.unquote_vc                    sŠ   |d k	r|}n|j }|jr†|j d¡}dd„ |D ƒ}‡ fdd„|D ƒ}t|ƒdkr†|jtdƒd� dd„ |D ƒ}|d7 }|d |¡7 }|S )	NrM   c                 S   s   g | ]}|  d d¡‘qS )rL   rò   )ra   ©r˜   Úar$   r$   r%   Ú
<listcomp>  s     z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d  ˆ j krˆ  |¡‘qS rï   )ÚQSAOfInterestr  r  rš   r$   r%   r    s     r   )rd   c                 S   s   g | ]}d   |¡‘qS )rL   )rZ   r  r$   r$   r%   r    s     ú?)rP   r�   ra   rQ   Úsortr   rZ   )r6   ra   Ú	auth_pathÚbufZqsar$   rš   r%   Úcanonical_resource
  s    	
ÿzHmacV1Auth.canonical_resourcec                 C   sN   |  ¡ d }||  |¡d 7 }|  |¡}|r8||d 7 }|| j||d�7 }|S )NrE   ©r  )rÂ   r  r  r!  )r6   rR   ra   rx   rì   r  Úcsr  r$   r$   r%   Úcanonical_string$  s    
zHmacV1Auth.canonical_stringc                 C   sB   | j jr|d= | j j|d< | j||||d�}t d|¡ |  |¡S )Nr   r"  rÏ   )rB   rp   r$  rN   rO   r  )r6   rR   ra   rx   rì   r  rb   r$   r$   r%   Úget_signature/  s       ÿzHmacV1Auth.get_signaturec                 C   sX   | j d k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"  )rB   r   rN   rO   r   r!   rR   r%  rx   r  Ú_inject_signature)r6   r0   ra   rq   r$   r$   r%   r3   ;  s    


   ÿzHmacV1Auth.add_authc                 C   s
   t dd�S )NTru   r   rš   r$   r$   r%   r  F  s    zHmacV1Auth._get_datec                 C   s4   d|j kr|j d= d| jj› d|› �}||j d< d S )NrÖ   zAWS rœ   )rx   rB   rk   )r6   r0   rq   Úauth_headerr$   r$   r%   r&  I  s    
zHmacV1Auth._inject_signature)NN)N)NN)NN)r7   r8   r9   r  r?   r  r  r  r  r!  r$  r%  r3   r  r&  r$   r$   r$   r%   r  ­  sh   Ü'
	
   ÿ
   ÿ
r  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

    rê   c                 C   s   || _ || _d S r=   )rB   rë   )r6   rB   rì   r$   r$   r%   r?   d  s    zHmacV1QueryAuth.__init__c                 C   s   t tt ¡ t| jƒ ƒƒS r=   )r/   rÛ   rl   rë   rš   r$   r$   r%   r  h  s    zHmacV1QueryAuth._get_datec           	      C   s¼   i }| j j|d< ||d< |jD ]D}| ¡ }|dkrB|jd |d< q| d¡sT|dkr|j| ||< qt|ƒ}t|jƒ}|d r�|d › d|› �}|d	 |d
 |d ||d f}t|ƒ|_d S )Nrh   rH   rt   ZExpiresr  )r  rí   é   rM   r   rò   ró   rô   )	rB   rk   rx   r†   rÀ   r   r   r!   r   )	r6   r0   rq   rö   Z
header_keyr  r÷   rø   rù   r$   r$   r%   r&  k  s    

z!HmacV1QueryAuth._inject_signatureN)r7   r8   r9   rr   rú   r?   r  r&  r$   r$   r$   r%   r(  W  s
   
r(  c                   @   s   e Zd ZdZdd„ ZdS )Ú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 k	r |j d }i }g }|j  dd ¡d k	r\|j d }| dd ¡d k	r\|d }||d< | jj|d< | jjd k	rš| jj|d< | d| jji¡ t t 	|¡ 
d¡¡ d¡|d< |  |d ¡|d< ||j d< ||j d< d S )	Nrý   rþ   rÿ   rh   r   r(   r  rq   )r¨   r   rB   rk   rp   rY   r\   r]   r,   r  rW   r.   r  )r6   r0   r  r  rÿ   r$   r$   r%   r3   •  s,    

ÿþ
zHmacV1PostAuth.add_authNr  r$   r$   r$   r%   r*  Œ  s   r*  c                   @   s   e Zd ZdZdd„ ZdS )Ú
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 krtƒ ‚d| j j› �}d|jkr0|jd= ||jd< d S )NzBearer rÖ   )r>   r   rp   rx   )r6   r0   r'  r$   r$   r%   r3   ¼  s    

zBearerAuth.add_authNr  r$   r$   r$   r%   r+  ´  s   r+  )Zv2Zv3Zv3httpsrä   zs3-queryzs3-presign-postzs3v4-presign-postZbearer)ÚCRT_AUTH_TYPE_MAPS)Zv4zv4-queryZs3v4z
s3v4-query)@r\   rÜ   rÐ   rµ   rT   r,   r  rl   Úcollections.abcr   Úemail.utilsr   Úhashlibr   r   Úoperatorr   Zbotocore.compatr   r	   r
   r   r   r   r   r   r   Zbotocore.exceptionsr   r   Zbotocore.utilsr   r   r   r   Ú	getLoggerr7   rN   rº   r¸   rn   rÒ   r‡   r±   r¯   r&   r1   r2   r<   r@   rs   rz   rß   ré   rû   rü   r  r(  r*  r+  ZAUTH_TYPE_MAPSZbotocore.crt.authr,  r[   r$   r$   r$   r%   Ú<module>   s€   ,
ÿý
=  6Q0 +5(øüÿ