o
    ,&ßaŠ  ã                   @   sì  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mZ d dl	Z	d dl
Z
d dlmZ d dl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 d dl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d„ Z)dd„ 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/ƒZ0G dd„ de/ƒZ1G dd „ d e1ƒZ2G d!d"„ d"e/ƒZ3G d#d$„ d$e,ƒZ4G d%d&„ d&e4ƒZ5G d'd(„ d(e4ƒZ6e-e.e.e4e5e6e3d)œZ7erêd d*l8m9Z9 e7 :e9¡ dS e7 :e/e1e0e2d+œ¡ dS ),é    N©Ú
formatdate)Úsha1Úsha256)Ú
itemgetter)ÚencodebytesÚensure_unicodeÚHTTPHeadersÚjsonÚparse_qsÚquoteÚsixÚunquoteÚurlsplitÚ
urlunsplitÚHAS_CRT)ÚNoCredentialsError)Ú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-PAYLOADc                 C   sF   t | ƒ}|j}dddœ}|jd ur!|j| |j¡kr!d||jf }|S )NéP   i»  )ÚhttpÚhttpsz%s:%d)r   ÚhostnameÚportÚgetÚscheme)ÚurlÚ	url_partsÚhostÚdefault_ports© r#   ú//usr/lib/python3/dist-packages/botocore/auth.pyÚ_host_from_url7   s   þ
r%   c                 C   s@   | j }t|tjƒrt | d¡¡}|S t|tjƒrt |¡}|S ©Núutf-8)ÚdataÚ
isinstancer   Úbinary_typer
   ÚloadsÚdecodeÚstring_types)Úrequestr(   r#   r#   r$   Ú_get_body_as_dictH   s   þ
r/   c                   @   ó   e Zd ZdZdd„ ZdS )Ú
BaseSignerFc                 C   s   t dƒ‚)NÚadd_auth)ÚNotImplementedError©Úselfr.   r#   r#   r$   r2   X   s   zBaseSigner.add_authN)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONr2   r#   r#   r#   r$   r1   U   s    r1   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©r5   r>   r#   r#   r$   Ú__init__a   ó   
zSigV2Auth.__init__c                 C   s  t  d¡ t|jƒ}|j}t|ƒdkrd}d|j|j|f }tj	| j
j d¡td�}g }t|ƒD ]*}|dkr7q0t || ¡}	t| d¡dd	�}
t|	 d¡d
d	�}| |
› d|› �¡ q0d |¡}||7 }t  d|¡ | | d¡¡ t | ¡ ¡ ¡  d¡}||fS )Nz$Calculating signature using v2 auth.r   ú/z	%s
%s
%s
r'   ©Ú	digestmodÚ	SignatureÚ ©Úsafez-_~ú=ú&zString to sign: %s)ÚloggerÚdebugr   r   ÚpathÚlenÚmethodÚnetlocÚhmacÚnewr>   Ú
secret_keyÚencoder   Úsortedr   Ú	text_typer   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr,   )r5   r.   ÚparamsÚsplitrM   Ústring_to_signÚlhmacÚpairsÚkeyÚvalueÚ
quoted_keyÚquoted_valueÚqsÚb64r#   r#   r$   Úcalc_signatured   s4   

þÿ
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ÚSecurityTokenrE   )r>   r   r(   r^   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenri   )r5   r.   r^   rg   Ú	signaturer#   r#   r$   r2   �   s   
zSigV2Auth.add_authN)r6   r7   r8   Ú__doc__r@   ri   r2   r#   r#   r#   r$   r:   \   s
    r:   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	SigV3Authc                 C   r;   r<   r=   r?   r#   r#   r$   r@   ›   rA   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¡f }d	|jv ra|jd	= ||jd	< d S )
NÚDateT©ÚusegmtúX-Amz-Security-Tokenr'   rC   z6AWS3-HTTPS AWSAccessKeyId=%s,Algorithm=%s,Signature=%srm   zX-Amzn-Authorization)r>   r   Úheadersr   rv   rQ   rR   rS   rT   r   rY   r   r\   r]   rq   r,   )r5   r.   Únew_hmacÚencoded_signaturerw   r#   r#   r$   r2   ž   s,   


ÿÿÿ
zSigV3Auth.add_authN)r6   r7   r8   r@   r2   r#   r#   r#   r$   ry   š   s    ry   c                   @   s¾   e Zd ZdZdZdd„ Zd/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d.S )0Ú	SigV4Authz+
    Sign a request with Signature V4.
    Tc                 C   s   || _ || _|| _d S r<   )r>   Ú_region_nameÚ_service_name©r5   r>   Úservice_nameÚregion_namer#   r#   r$   r@   º   s   
zSigV4Auth.__init__Fc                 C   s<   |rt  || d¡t¡ ¡ }|S t  || d¡t¡ ¡ }|S r&   )rQ   rR   rT   r   Ú	hexdigestr\   )r5   rc   Ú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   )r5   r.   Ú
header_mapÚnamerd   Úlnamer#   r#   r$   Úheaders_to_signÉ   s   €zSigV4Auth.headers_to_signc                 C   s"   |j r	|  |j ¡S |  t|jƒ¡S r<   )r^   Ú_canonical_query_string_paramsÚ_canonical_query_string_urlr   r   r4   r#   r#   r$   Úcanonical_query_stringÙ   s   z SigV4Auth.canonical_query_stringc                 C   sn   g }|D ]}t || ƒ}| t|dd�t|dd�f¡ qg }t|ƒD ]\}}| d||f ¡ q"d |¡}|S )Nz-_.~rG   ú%s=%srJ   )ÚstrrW   r   rU   rX   )r5   r^   Úkey_val_pairsrc   rd   Úsorted_key_valsr•   r#   r#   r$   r“   ã   s   
ÿ
z(SigV4Auth._canonical_query_string_paramsc           	      C   st   d}|j r8g }|j  d¡D ]}| d¡\}}}| ||f¡ qg }t|ƒD ]\}}| d||f ¡ q%d |¡}|S )NrF   rJ   rI   r–   )Úqueryr_   Ú	partitionrW   rU   rX   )	r5   Úpartsr•   r˜   Úpairrc   Ú_rd   r™   r#   r#   r$   r”   ò   s   
z%SigV4Auth._canonical_query_string_urlc                    sX   g }t t|ƒƒ}|D ]}d ‡ fdd„| |¡D ƒ¡}| d|t|ƒf ¡ 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©r5   r#   r$   Ú	<genexpr>  s   € z.SigV4Auth.canonical_headers.<locals>.<genexpr>ú%s:%sÚ
)rU   ÚsetrX   Úget_allrW   r   )r5   r’   r~   Úsorted_header_namesrc   rd   r#   r¤   r$   Úcanonical_headers  s   ÿ
zSigV4Auth.canonical_headersc                 C   s   d  | ¡ ¡S )Nú )rX   r_   )r5   rd   r#   r#   r$   r      s   zSigV4Auth._header_valuec                 C   s    t dd„ t|ƒD ƒƒ}d |¡S )Nc                 S   s   g | ]}|  ¡  ¡ ‘qS r#   )r�   r]   )r¢   Únr#   r#   r$   Ú
<listcomp>  ó    z,SigV4Auth.signed_headers.<locals>.<listcomp>ú;)rU   r¨   rX   )r5   r’   r~   r#   r#   r$   Úsigned_headers  s   ÿ
zSigV4Auth.signed_headersc                 C   s‚   |   |¡stS |j}|r7t|dƒr7| ¡ }t |jt¡}t	ƒ }t
|dƒD ]}| |¡ q$| ¡ }| |¡ |S |r?t	|ƒ ¡ S tS )NÚseekó    )Ú_should_sha256_sign_payloadÚUNSIGNED_PAYLOADÚbodyÚhasattrÚtellÚ	functoolsÚpartialÚreadÚPAYLOAD_BUFFERr   ÚiterrY   r‡   r²   ÚEMPTY_SHA256_HASH)r5   r.   Úrequest_bodyÚpositionÚread_chunksizeÚchecksumÚchunkÚhex_checksumr#   r#   r$   Úpayload  s"   
ÿ
zSigV4Auth.payloadc                 C   s   |j  d¡sdS |j dd¡S )Nr   TÚpayload_signing_enabled)r   Ú
startswithÚcontextr   r4   r#   r#   r$   r´   6  s   z%SigV4Auth._should_sha256_sign_payloadc                 C   sš   |j  ¡ g}|  t|jƒj¡}| |¡ | |  |¡¡ |  |¡}| |  	|¡d ¡ | |  
|¡¡ d|jv r>|jd }n|  |¡}| |¡ d |¡S )Nr§   úX-Amz-Content-SHA256)rO   ÚupperÚ_normalize_url_pathr   r   rM   rW   r•   r’   r«   r±   r~   rÅ   rX   )r5   r.   ÚcrrM   r’   Úbody_checksumr#   r#   r$   Úcanonical_request@  s   





zSigV4Auth.canonical_requestc                 C   s   t t|ƒdd�}|S )Nz/~rG   )r   r   )r5   rM   Únormalized_pathr#   r#   r$   rË   O  s   zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}| |jd dd… ¡ | | j¡ | | j¡ | d¡ d |¡S ©NÚ	timestampr   é   Úaws4_requestrB   )r>   rq   rW   rÈ   r‚   rƒ   rX   ©r5   r.   Úscoper#   r#   r$   rÕ   S  s   


zSigV4Auth.scopec                 C   sH   g }|  |jd dd… ¡ |  | j¡ |  | j¡ |  d¡ d |¡S rÐ   )rW   rÈ   r‚   rƒ   rX   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'   r§   )rW   rÈ   rÖ   r   rT   r‡   rX   )r5   r.   rÎ   Ústsr#   r#   r$   r`   c  s
   
zSigV4Auth.string_to_signc                 C   sd   | j j}|  d|  d¡|jd dd… ¡}|  || j¡}|  || j¡}|  |d¡}| j||dd�S )	NÚAWS4r'   rÑ   r   rÒ   rÓ   T)r‰   )r>   rS   r‹   rT   rÈ   r‚   rƒ   )r5   r`   r.   rc   Úk_dateÚk_regionÚ	k_serviceÚ	k_signingr#   r#   r$   rw   o  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)r>   r   ÚdatetimeÚutcnowrs   ÚSIGV4_TIMESTAMPrÈ   Ú_modify_request_before_signingrÎ   rK   rL   r`   rw   Ú_inject_signature_to_request)r5   r.   Údatetime_nowrÎ   r`   rw   r#   r#   r$   r2   x  s   




zSigV4Auth.add_authc                 C   sP   d|   |¡ g}|  |¡}| d|  |¡ ¡ | d| ¡ d |¡|jd< |S )NzAWS4-HMAC-SHA256 Credential=%szSignedHeaders=%szSignature=%sz, ÚAuthorization)rÕ   r’   rW   r±   rX   r~   )r5   r.   rw   Ú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_headersr>   rv   rÈ   r   rµ   r4   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 )Nrz   rÑ   ú
X-Amz-Date)
r~   rß   ÚstrptimerÈ   rá   r   ÚintÚcalendarÚtimegmÚ	timetuple)r5   r.   Údatetime_timestampr#   r#   r$   rç      s   

ÿ
ÿ
ÿ
z%SigV4Auth._set_necessary_date_headersN)F)r6   r7   r8   rx   r9   r@   r‹   r’   r•   r“   r”   r«   r    r±   rÅ   r´   rÎ   rË   rÕ   rÖ   r`   rw   r2   rã   râ   rç   r#   r#   r#   r$   r�   ´   s0    


	r�   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚS3SigV4Authc                    s6   t t| ƒ |¡ d|jv r|jd= |  |¡|jd< d S )NrÉ   )Úsuperrï   râ   r~   rÅ   r4   ©Ú	__class__r#   r$   râ   ³  s   
z*S3SigV4Auth._modify_request_before_signingc                    sx   |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t| ƒ |¡S )	NÚclient_configÚs3rÆ   r   zContent-MD5TÚhas_streaming_inputF)	rÈ   r   Úgetattrr   rÇ   r~   rð   rï   r´   )r5   r.   ró   Ú	s3_configÚsign_payloadrñ   r#   r$   r´   º  s   
z'S3SigV4Auth._should_sha256_sign_payloadc                 C   ó   |S r<   r#   ©r5   rM   r#   r#   r$   rË   Ü  ó   zS3SigV4Auth._normalize_url_path)r6   r7   r8   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 t| ƒ |||¡ || _d S r<   )rð   rý   r@   Ú_expires)r5   r>   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 ur3| jj|d< t	|j
ƒ}tdd„ t|j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}   c                 S   s   g | ]
\}}||d  f‘qS ©r   r#   )r¢   Úkr£   r#   r#   r$   r®   	  s    zASigV4QueryAuth._modify_request_before_signing.<locals>.<listcomp>T)Úkeep_blank_valuesrF   rJ   r   é   é   é   )r~   r   r±   r’   rÕ   rÈ   rÿ   r>   rv   r   r   Údictr   rš   rŒ   r^   rY   r(   r/   r   r   )r5   r.   Úcontent_typeÚblacklisted_content_typer±   Úauth_paramsr    Ú
query_dictÚoperation_paramsÚnew_query_stringÚpÚnew_url_partsr#   r#   r$   râ   ê  sF   ÿû
ÿÿÿ
z-SigV4QueryAuth._modify_request_before_signingc                 C   s   | j d| 7  _ d S )Nz&X-Amz-Signature=%s)r   ©r5   r.   rw   r#   r#   r$   rã   *  s   z+SigV4QueryAuth._inject_signature_to_request)r6   r7   r8   ÚDEFAULT_EXPIRESr@   râ   rã   rü   r#   r#   rñ   r$   rý   á  s    ÿ@rý   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Ë   <  rû   z$S3SigV4QueryAuth._normalize_url_pathc                 C   s   t S r<   )rµ   r4   r#   r#   r$   rÅ   @  s   zS3SigV4QueryAuth.payloadN)r6   r7   r8   rx   rË   rÅ   r#   r#   r#   r$   r  1  s    
r  c                   @   r0   )Ú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à   rs   rá   rÈ   r   rÕ   rW   r>   rv   rZ   r[   r
   ÚdumpsrT   r,   rw   )r5   r.   rä   Úfieldsr  r  r#   r#   r$   r2   O  s:   


ÿÿ
zS3SigV4PostAuth.add_authN©r6   r7   r8   rx   r2   r#   r#   r#   r$   r  H  s    r  c                   @   s|   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$   r@   …  rA   zHmacV1Auth.__init__c                 C   s>   t j| jj d¡td�}| | d¡¡ t| ¡ ƒ 	¡  
d¡S )Nr'   rC   )rQ   rR   r>   rS   rT   r   rY   r   r\   r]   r,   )r5   r`   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  Údaterz   FTrF   r§   )Ú	_get_dater�   rW   r]   rX   )r5   r~   Úinteresting_headersÚhoiÚihÚfoundrc   Ú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||| f ¡ 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¦   r§   )r�   rÇ   rX   r©   rU   ÚkeysrW   )r5   r~   r=  Úcustom_headersrc   r@  Ú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   )rN   r   )r5   Ú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 )	NrJ   c                 S   s   g | ]}|  d d¡‘qS )rI   r  )r_   ©r¢   Úar#   r#   r$   r®   Å  r¯   z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d  ˆ j v rˆ  |¡‘qS r  )ÚQSAOfInterestrH  rI  r¤   r#   r$   r®   Æ  s    ÿr   )rc   c                 S   s   g | ]}d   |¡‘qS )rI   )rX   rI  r#   r#   r$   r®   Ê  s    ú?)rM   rš   r_   rN   Úsortr   rX   )r5   r_   Ú	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 )Nr§   ©rN  )rÊ   rA  rF  rQ  )r5   rO   r_   r~   r   rN  ÚcsrD  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  rR  rÞ   )r>   rv   rT  rK   rL   r8  )r5   rO   r_   r~   r   rN  r`   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: %srR  )r>   r   rK   rL   r   r   rO   rU  r~   rN  Ú_inject_signature)r5   r.   r_   rw   r#   r#   r$   r2   å  s   



þzHmacV1Auth.add_authc                 C   s
   t dd�S )NTr{   r   r¤   r#   r#   r$   r;  ð  rA   zHmacV1Auth._get_datec                 C   s,   d|j v r	|j d= d| jj|f |j d< d S )Nrå   z	AWS %s:%s)r~   r>   rq   r  r#   r#   r$   rV  ó  s   
ÿzHmacV1Auth._inject_signature)NNr<   )r6   r7   r8   rK  r@   r8  rA  rF  rH  rQ  rT  rU  r2   r;  rV  r#   r#   r#   r$   r  v  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<   )r>   rÿ   )r5   r>   r   r#   r#   r$   r@     s   
zHmacV1QueryAuth.__init__c                 C   s   t tt ¡ t| jƒ ƒƒS r<   )r—   rê   rr   rÿ   r¤   r#   r#   r$   r;    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 rGd|d |f }|d	 |d
 |d ||d f}t|ƒ|_d S )Nrj   rE   rz   ÚExpiresrB  )r9  r  é   z%s&%sr   r  r  r  )	r>   rq   r~   r�   rÇ   r   r   r   r   )	r5   r.   rw   r  Ú
header_keyr@  r  r  r  r#   r#   r$   rV    s    
€
z!HmacV1QueryAuth._inject_signatureN)r6   r7   r8   rx   r  r@   r;  rV  r#   r#   r#   r$   rW     s    	rW  c                   @   r0   )Ú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  rj   r  r'   r  rw   )rÈ   r   r>   rq   rv   rW   rZ   r[   r
   r  rT   r,   r8  )r5   r.   r  r  r  r#   r#   r$   r2   :  s,   

ÿÿ
zHmacV1PostAuth.add_authNr  r#   r#   r#   r$   r[  2  s    r[  )Úv2Úv3Úv3httpsrô   zs3-queryzs3-presign-postzs3v4-presign-post)ÚCRT_AUTH_TYPE_MAPS)Úv4zv4-queryÚs3v4z
s3v4-query);rZ   rë   rß   r¹   Úemail.utilsr   Úhashlibr   r   rQ   r#  Úoperatorr   rr   Úbotocore.compatr   r   r	   r
   r   r   r   r   r   r   r   Úbotocore.exceptionsr   Úbotocore.utilsr   r   r   Ú	getLoggerr6   rK   r¾   r¼   rt   rá   rŽ   rµ   r%   r/   Úobjectr1   r:   ry   r�   rï   rý   r  r  r  rW  r[  ÚAUTH_TYPE_MAPSÚbotocore.crt.authr_  rY   r#   r#   r#   r$   Ú<module>   sl   4
ÿ> /P. 2'ùü