o
    ÙtBh®Œ  ã                   @   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 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(g d¢Z)dZ*dZ+dd„ Z,dd„ Z-G dd„ dƒZ.G dd„ de.ƒZ/G dd„ de.ƒZ0G dd„ de.ƒZ1G dd„ de1ƒZ2G dd „ d e1ƒZ3G d!d"„ d"e3ƒZ4G d#d$„ d$e1ƒZ5G d%d&„ d&e.ƒZ6G d'd(„ d(e6ƒZ7G d)d*„ d*e6ƒZ8e/e0e0e6e7e8e5d+œZ9eród d,l:m;Z; e9 <e;¡ dS e9 <e1e3e2e4d-œ¡ dS ).é    N)ÚMapping©Ú
formatdate)Úsha1Úsha256)Ú
itemgetter)	ÚHAS_CRTÚHTTPHeadersÚencodebytesÚensure_unicodeÚparse_qsÚquoteÚunquoteÚurlsplitÚ
urlunsplit)ÚNoCredentialsError)Úis_valid_ipv6_endpoint_urlÚnormalize_url_pathÚpercent_encode_sequence)ÚMD5_AVAILABLEÚ@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 ur+|j| |j¡kr+d||jf }|S )Nú[ú]éP   i»  )ÚhttpÚhttpsz%s:%d)r   Úhostnamer   ÚportÚgetÚscheme)ÚurlÚ	url_partsÚhostÚdefault_ports© r%   úd/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/botocore/auth.pyÚ_host_from_urlF   s   þ
r'   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)Úrequestr*   r%   r%   r&   Ú_get_body_as_dictY   s   

þ
r2   c                   @   ó   e Zd ZdZdd„ ZdS )Ú
BaseSignerFc                 C   s   t dƒ‚)NÚadd_auth)ÚNotImplementedError©Úselfr1   r%   r%   r&   r5   i   s   zBaseSigner.add_authN)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONr5   r%   r%   r%   r&   r4   f   s    r4   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   ó
   || _ d S ©N©Úcredentials©r8   rA   r%   r%   r&   Ú__init__r   ó   
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   ú/Ú
r)   ©Ú	digestmodÚ	SignatureÚ ©Úsafez-_~ú=ú&zString to sign: %s)ÚloggerÚdebugr   r!   ÚpathÚlenÚmethodÚnetlocÚhmacÚnewrA   Ú
secret_keyÚencoder   Úsortedr0   r   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr/   )r8   r1   ÚparamsÚsplitrQ   Ústring_to_signÚlhmacÚpairsÚkeyÚvalueÚ
quoted_keyÚquoted_valueÚqsÚb64r%   r%   r&   Úcalc_signatureu   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ÚSecurityTokenrI   )rA   r   r*   ra   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenrl   )r8   r1   ra   rj   Ú	signaturer%   r%   r&   r5   ‘   s   
zSigV2Auth.add_authN)r9   r:   r;   Ú__doc__rC   rl   r5   r%   r%   r%   r&   r=   m   s
    r=   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	SigV3Authc                 C   r>   r?   r@   rB   r%   r%   r&   rC   «   rD   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-Tokenr)   rG   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rA   r   Úheadersr   ry   rU   rV   rW   rX   r   r\   r
   r_   r`   rt   r/   )r8   r1   Únew_hmacÚencoded_signaturerz   r%   r%   r&   r5   ®   s*   


ÿÿÿ
zSigV3Auth.add_authN)r9   r:   r;   rC   r5   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 r?   )rA   Ú_region_nameÚ_service_name©r8   rA   Úservice_nameÚregion_namer%   r%   r&   rC   Í   s   
zSigV4Auth.__init__Fc                 C   s<   |rt  || d¡t¡ ¡ }|S t  || d¡t¡ ¡ }|S r(   )rU   rV   rX   r   Ú	hexdigestr_   )r8   rf   Ú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_BLACKLISTr'   r!   )r8   r1   Ú
header_mapÚnamerg   Úlnamer%   r%   r&   Úheaders_to_signÜ   s   €zSigV4Auth.headers_to_signc                 C   s"   |j r	|  |j ¡S |  t|jƒ¡S r?   )ra   Ú_canonical_query_string_paramsÚ_canonical_query_string_urlr   r!   r7   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-_.~rK   rM   rN   )r+   r   r   rZ   r   r0   rY   r[   )r8   ra   Úkey_val_pairsrf   rg   Ú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 )NrJ   rN   rM   )Úqueryrb   Ú	partitionrZ   rY   r[   )	r8   Úpartsr˜   r™   Úpairrf   Ú_rg   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©r8   r%   r&   Ú	<genexpr>!  s   € 

ÿz.SigV4Auth.canonical_headers.<locals>.<genexpr>ú:rF   )rY   Úsetr[   Úget_allrZ   r   )r8   r•   r   Úsorted_header_namesrf   rg   r%   r¥   r&   Úcanonical_headers  s   ÿ
zSigV4Auth.canonical_headersc                 C   s   d  | ¡ ¡S )Nú )r[   rb   )r8   rg   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 r?   )r   r`   )r£   Únr%   r%   r&   r¦   0  s   € z+SigV4Auth.signed_headers.<locals>.<genexpr>ú;)rY   r¨   r[   )r8   r•   r   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)r8   r1   Úchecksum_contextÚ	algorithmr%   r%   r&   Ú_is_streaming_checksum_payload3  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   Úiterr\   rŠ   r¹   ÚEMPTY_SHA256_HASH)r8   r1   Úrequest_bodyÚpositionÚread_chunksizer°   ÚchunkÚhex_checksumr%   r%   r&   Úpayload8  s&   

ÿ
zSigV4Auth.payloadc                 C   s   |j  d¡sdS |j dd¡S )Nr   TÚpayload_signing_enabled)r!   Ú
startswithr´   r   r7   r%   r%   r&   r¼   R  s   z%SigV4Auth._should_sha256_sign_payloadc                 C   sš   |j  ¡ g}|  t|jƒj¡}| |¡ | |  |¡¡ |  |¡}| |  	|¡d ¡ | |  
|¡¡ d|jv r>|jd }n|  |¡}| |¡ d |¡S )NrF   úX-Amz-Content-SHA256)rS   ÚupperÚ_normalize_url_pathr   r!   rQ   rZ   r˜   r•   r«   r¯   r   rÌ   r[   )r8   r1   ÚcrrQ   r•   Úbody_checksumr%   r%   r&   Úcanonical_request\  s   





zSigV4Auth.canonical_requestc                 C   s   t t|ƒdd}|S )Nz/~rK   )r   r   )r8   rQ   Únormalized_pathr%   r%   r&   rÑ   k  s   zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}| |jd dd… ¡ | | j¡ | | j¡ | d¡ d |¡S ©NÚ	timestampr   é   Úaws4_requestrE   )rA   rt   rZ   r´   r…   r†   r[   ©r8   r1   Úscoper%   r%   r&   rÛ   o  s   


zSigV4Auth.scopec                 C   sH   g }|  |jd dd… ¡ |  | j¡ |  | j¡ |  d¡ d |¡S rÖ   )rZ   r´   r…   r†   r[   rÚ   r%   r%   r&   Úcredential_scopew  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)   rF   )rZ   r´   rÜ   r   rX   rŠ   r[   )r8   r1   rÔ   Ústsr%   r%   r&   rc     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Œ   )rA   rW   rŽ   rX   r´   r…   r†   )r8   rc   r1   rf   Úk_dateÚk_regionÚ	k_serviceÚ	k_signingr%   r%   r&   rz   ‹  s   ÿzSigV4Auth.signaturec                 C   s”   | j d u 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)rA   r   ÚdatetimeÚutcnowrv   ÚSIGV4_TIMESTAMPr´   Ú_modify_request_before_signingrÔ   rO   rP   rc   rz   Ú_inject_signature_to_request)r8   r1   Údatetime_nowrÔ   rc   rz   r%   r%   r&   r5   •  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•   rZ   r¯   r[   r   )r8   r1   rz   Ú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_headersrA   ry   r´   r   r½   r7   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   rå   Ústrptimer´   rç   r   ÚintÚcalendarÚtimegmÚ	timetuple)r8   r1   Údatetime_timestampr%   r%   r&   rí   ¿  s   

ÿ
ÿ
ÿ
z%SigV4Auth._set_necessary_date_headersN)F)r9   r:   r;   r{   r<   rC   rŽ   r•   r˜   r–   r—   r«   r¡   r¯   r¸   rÌ   r¼   rÔ   rÑ   rÛ   rÜ   rc   rz   r5   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Ì   r7   ©Ú	__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   Úgetattrr+   rµ   r!   rÎ   r   rö   r¼   )r8   r1   rù   Ú	s3_configÚsign_payloadÚchecksum_headerr¶   r·   r÷   r%   r&   r¼   Û  s&   

ÿ
z'S3SigV4Auth._should_sha256_sign_payloadc                 C   ó   |S r?   r%   ©r8   rQ   r%   r%   r&   rÑ     ó   zS3SigV4Auth._normalize_url_path)r9   r:   r;   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ö   rC   Ú_expires)r8   rA   rˆ   r‰   Úexpiresr÷   r%   r&   rC     s   
zSigV4QueryAuth.__init__c                 C   s  |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-typez0application/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   s   i | ]	\}}||d  “qS ©r   r%   )r£   Úkr¤   r%   r%   r&   Ú
<dictcomp>1  s    zASigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>rJ   rN   r   é   é   é   )r   r   r¯   r•   rÛ   r´   r  rA   ry   r   r!   r   r›   r   ra   r\   r*   r2   r   r   )r8   r1   Úcontent_typeÚblacklisted_content_typer¯   Úauth_paramsr"   Úquery_string_partsÚ
query_dictÚ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!   )r8   r1   rz   r%   r%   r&   ré   S  s   z+SigV4QueryAuth._inject_signature_to_request)r9   r:   r;   ÚDEFAULT_EXPIRESrC   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   r  r?   r%   r  r%   r%   r&   rÑ   f  r  z$S3SigV4QueryAuth._normalize_url_pathc                 C   s   t S r?   )r½   r7   r%   r%   r&   rÌ   j  s   zS3SigV4QueryAuth.payloadN)r9   r:   r;   r{   rÑ   rÌ   r%   r%   r%   r&   r  Z  s    r  c                   @   r3   )ÚS3SigV4PostAuthz†
    Presigns a s3 post

    Implementation doc here:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
    c                 C   sN  t j  ¡ }| t¡|jd< 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< 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Ý   zx-amz-algorithmzx-amz-credentialz
x-amz-dateúx-amz-security-tokenr)   Úpolicyzx-amz-signature)rå   ræ   rv   rç   r´   r   rÛ   rZ   rA   ry   r]   r^   r-   ÚdumpsrX   r/   rz   )r8   r1   rê   Úfieldsr!  r  r%   r%   r&   r5   z  s:   


ÿþ
zS3SigV4PostAuth.add_authN©r9   r:   r;   r{   r5   r%   r%   r%   r&   r  r  s    r  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   r>   r?   r@   r‡   r%   r%   r&   rC   Ì  rD   zHmacV1Auth.__init__c                 C   s>   t j| jj d¡td}| | d¡¡ t| ¡ ƒ 	¡  
d¡S )Nr)   rG   )rU   rV   rA   rW   rX   r   r\   r
   r_   r`   r/   )r8   rc   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}   FTrJ   rF   )Ú	_get_dater   rZ   r`   r[   )r8   r   Úinteresting_headersÚhoiÚihÚfoundrf   Ú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 r?   )r`   r¢   r%   r%   r&   r¦   î  s   € 
ÿz6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>r§   rF   )r   rÎ   r[   r©   rY   ÚkeysrZ   )r8   r   rE  Úcustom_headersrf   rH  Ú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?
        r  r   )rR   r   )r8   Ú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 )	NrN   c                 S   s   g | ]}|  d d¡‘qS )rM   r  )rb   ©r£   Úar%   r%   r&   Ú
<listcomp>  s    z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d  ˆ j v rˆ  |¡‘qS r  )ÚQSAOfInterestrP  rQ  r¥   r%   r&   rS    s    r   )rf   c                 S   s   g | ]}d   |¡‘qS )rM   )r[   rQ  r%   r%   r&   rS    s    ú?)rQ   r›   rb   rR   Úsortr   r[   )r8   rb   Ú	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 )NrF   ©rW  )rÐ   rI  rN  rZ  )r8   rS   rb   r   r  rW  ÚcsrL  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ä   )rA   ry   r]  rO   rP   r@  )r8   rS   rb   r   r  rW  rc   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[  )rA   r   rO   rP   r   r!   rS   r^  r   rW  Ú_inject_signature)r8   r1   rb   rz   r%   r%   r&   r5   0  s   


ÿzHmacV1Auth.add_authc                 C   s
   t ddS )NTr~   r   r¥   r%   r%   r&   rC  ;  rD   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   rA   rt   )r8   r1   rz   Úauth_headerr%   r%   r&   r_  >  s   
zHmacV1Auth._inject_signature)NNr?   )r9   r:   r;   rT  rC   r@  rI  rN  rP  rZ  r]  r^  r5   rC  r_  r%   r%   r%   r&   r%  ¢  s    
'
	
ÿ
ÿ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?   )rA   r  )r8   rA   r  r%   r%   r&   rC   Y  s   
zHmacV1QueryAuth.__init__c                 C   s   t tt ¡ t| jƒ ƒƒS r?   )r0   rð   ru   r  r¥   r%   r%   r&   rC  ]  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 )Nrm   rI   r}   ÚExpiresrJ  )rA  r	  é   rN   r   r  r  r  )	rA   rt   r   r   rÎ   r   r   r!   r   )	r8   r1   rz   r  Ú
header_keyrH  r  r  r  r%   r%   r&   r_  `  s    
€
z!HmacV1QueryAuth._inject_signatureN)r9   r:   r;   r{   r  rC   rC  r_  r%   r%   r%   r&   ra  L  s    
ra  c                   @   r3   )Ú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  rm   r   r)   r!  rz   )r´   r   rA   rt   ry   rZ   r]   r^   r-   r"  rX   r/   r@  )r8   r1   r#  r!  r  r%   r%   r&   r5   Š  s,   

ÿþ
zHmacV1PostAuth.add_authNr$  r%   r%   r%   r&   re    s    re  )Úv2Úv3Úv3httpsrú   zs3-queryzs3-presign-postzs3v4-presign-post)ÚCRT_AUTH_TYPE_MAPS)Úv4zv4-queryÚs3v4z
s3v4-query)=r]   rñ   rå   rÁ   rU   r-   r+  ru   Úcollections.abcr   Úemail.utilsr   Úhashlibr   r   Úoperatorr   Úbotocore.compatr   r	   r
   r   r   r   r   r   r   Úbotocore.exceptionsr   Úbotocore.utilsr   r   r   r   Ú	getLoggerr9   rO   rÆ   rÄ   rw   rç   r‘   r½   r»   r'   r2   r4   r=   r|   r„   rõ   r  r  r  r%  ra  re  ÚAUTH_TYPE_MAPSÚbotocore.crt.authri  r\   r%   r%   r%   r&   Ú<module>   sv   ,
ÿ=  6Q0 +5)ùüÿ