U
    ³.¬b®Œ  ã                   @   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(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.ƒ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;¡ ne9 <e1e3e2e4d/œ¡ dS )0é    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_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#   ú1/tmp/pip-unpacked-wheel-7df6wvge/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    


r0   c                   @   s   e Zd ZdZdd„ ZdS )Ú
BaseSignerFc                 C   s   t dƒ‚d S )NÚadd_auth)ÚNotImplementedError©Úselfr/   r#   r#   r$   r2   i   s    zBaseSigner.add_authN)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONr2   r#   r#   r#   r$   r1   f   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   s
   || _ d S ©N©Úcredentials©r5   r=   r#   r#   r$   Ú__init__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Únewr=   Ú
secret_keyÚencoder   Úsortedr.   r   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr-   )r5   r/   ÚparamsÚsplitrL   Ústring_to_signZlhmacÚpairsÚkeyÚvalueZ
quoted_keyZquoted_valueÚqsZb64r#   r#   r$   Úcalc_signatureu   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SignatureMethodZ	TimestampZSecurityTokenrD   )r=   r   r(   r\   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenrc   )r5   r/   r\   rb   Ú	signaturer#   r#   r$   r2   ‘   s    
zSigV2Auth.add_authN)r6   r7   r8   Ú__doc__r?   rc   r2   r#   r#   r#   r$   r:   m   s   r:   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	SigV3Authc                 C   s
   || _ d S r;   r<   r>   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'   rB   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)r=   r   Úheadersr   rk   rP   rQ   rR   rS   r   rW   r
   rZ   r[   rf   r-   )r5   r/   Únew_hmacZencoded_signaturerl   r#   r#   r$   r2   ®   s(    


 ÿÿ
zSigV3Auth.add_authN)r6   r7   r8   r?   r2   r#   r#   r#   r$   rn   ª   s   rn   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;   )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¡ ¡ }nt  || d¡t¡ ¡ }|S r&   )rP   rQ   rS   r   Ú	hexdigestrZ   )r5   r`   Ú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	   rs   ÚitemsÚlowerÚSIGNED_HEADERS_BLACKLISTr%   r    )r5   r/   Z
header_mapÚnamera   Ú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    r4   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-_.~rF   rH   rI   )r)   r   r€   rU   r   r.   rT   rV   )r5   r\   Úkey_val_pairsr`   ra   Ú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 )NrE   rI   rH   )Úqueryr]   Ú	partitionrU   rT   rV   )	r5   Úpartsrˆ   r‰   Úpairr`   Ú_ra   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©r5   r#   r$   Ú	<genexpr>!  s    z.SigV4Auth.canonical_headers.<locals>.<genexpr>ú:rA   )rT   ÚsetrV   Úget_allrU   r   )r5   r…   rs   Zsorted_header_namesr`   ra   r#   r•   r$   Úcanonical_headers  s    ÿzSigV4Auth.canonical_headersc                 C   s   d  | ¡ ¡S )Nú )rV   r]   )r5   ra   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>ú;)rT   r˜   rV   )r5   r…   rs   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)r5   r/   Ú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 ]}| |¡ 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   ÚiterrW   r{   r¨   ÚEMPTY_SHA256_HASH)r5   r/   Úrequest_bodyÚpositionZread_chunksizerŸ   ÚchunkZ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   r4   r#   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 )NrA   úX-Amz-Content-SHA256)rN   ÚupperÚ_normalize_url_pathr   r    rL   rU   rˆ   r…   rš   rž   rs   r¹   rV   )r5   r/   ZcrrL   r…   Zbody_checksumr#   r#   r$   Úcanonical_request\  s    




zSigV4Auth.canonical_requestc                 C   s   t t|ƒdd}|S )Nz/~rF   )r   r   )r5   rL   Z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_requestr@   )r=   rf   rU   r£   rv   rw   rV   ©r5   r/   Úscoper#   r#   r$   rÅ   o  s    

zSigV4Auth.scopec                 C   sH   g }|  |jd dd… ¡ |  | j¡ |  | j¡ |  d¡ d |¡S rÀ   )rU   r£   rv   rw   rV   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'   rA   )rU   r£   rÆ   r   rS   r{   rV   )r5   r/   r¿   Ústsr#   r#   r$   r^     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}   )r=   rR   r   rS   r£   rv   rw   )r5   r^   r/   r`   Zk_dateZk_regionZ	k_serviceZ	k_signingr#   r#   r$   rl   ‹  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)r=   r   ÚdatetimeÚutcnowrh   ÚSIGV4_TIMESTAMPr£   Ú_modify_request_before_signingr¿   rJ   rK   r^   rl   Ú_inject_signature_to_request)r5   r/   Údatetime_nowr¿   r^   rl   r#   r#   r$   r2   •  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…   rU   rž   rV   rs   )r5   r/   rl   Ú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Ð   rr   rº   Tr¼   )rs   Ú_set_necessary_date_headersr=   rk   r£   r   r¬   r4   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 )Nro   rÁ   ú
X-Amz-Date)
rs   rÊ   Ústrptimer£   rÌ   r   ÚintÚcalendarÚtimegmÚ	timetuple)r5   r/   Zdatetime_timestampr#   r#   r$   rÒ   ¿  s    
 ÿÿ



z%SigV4Auth._set_necessary_date_headersN)F)r6   r7   r8   rm   r9   r?   r   r…   rˆ   r†   r‡   rš   r‘   rž   r§   r¹   r«   r¿   r¾   rÅ   rÆ   r^   rl   r2   rÎ   rÍ   rÒ   r#   r#   r#   r$   ru   Æ   s0   




ru   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Í   rs   r¹   r4   ©Ú	__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»   rs   rÚ   r«   )r5   r/   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#   ©r5   rL   r#   r#   r$   r¾     s    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 ƒ  |||¡ || _d S r;   )rÚ   r?   Ú_expires)r5   r=   ry   rz   Ú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-SignedHeadersrr   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>rE   rI   r   é   é   é   )rs   r   rž   r…   rÅ   r£   rå   r=   rk   r   r    r   r‹   r€   r\   rW   r(   r0   r   r   )r5   r/   Ú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    )r5   r/   rl   r#   r#   r$   rÎ   S  s    z+SigV4QueryAuth._inject_signature_to_request)r6   r7   r8   Ú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¾   f  s    z$S3SigV4QueryAuth._normalize_url_pathc                 C   s   t S r;   )r¬   r4   r#   r#   r$   r¹   j  s    zS3SigV4QueryAuth.payloadN)r6   r7   r8   rm   r¾   r¹   r#   r#   r#   r$   rõ   Z  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Ë   rh   rÌ   r£   r   rÅ   rU   r=   rk   rX   rY   r+   ÚdumpsrS   r-   rl   )r5   r/   rÏ   Úfieldsrû   rù   r#   r#   r$   r2   z  s:    


ÿþ
zS3SigV4PostAuth.add_authN©r6   r7   r8   rm   r2   r#   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taggingÚrestoreZstorageClassZnotificationZreplicationZ	analyticsZmetricsZ	inventoryÚselectzselect-typezobject-lockNc                 C   s
   || _ d S r;   r<   rx   r#   r#   r$   r?   Ì  s    zHmacV1Auth.__init__c                 C   s>   t j| jj d¡td}| | d¡¡ t| ¡ ƒ 	¡  
d¡S )Nr'   rB   )rP   rQ   r=   rR   rS   r   rW   r
   rZ   r[   r-   )r5   r^   rt   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ç   Údatero   FTrE   rA   )Ú	_get_dater   rU   r[   rV   )r5   rs   Zinteresting_headersÚhoiZihÚfoundr`   Ú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—   rA   )r   r»   rV   r™   rT   ÚkeysrU   )r5   rs   r
  Úcustom_headersr`   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)rM   r   )r5   Ú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 )	NrI   c                 S   s   g | ]}|  d d¡‘qS )rH   rì   )r]   ©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   )r`   c                 S   s   g | ]}d   |¡‘qS )rH   )rV   r  r#   r#   r$   r    s     ú?)rL   r‹   r]   rM   Úsortr   rV   )r5   r]   Ú	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 )NrA   ©r  )r½   r  r  r  )r5   rN   r]   rs   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É   )r=   rk   r  rJ   rK   r  )r5   rN   r]   rs   ræ   r  r^   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  )r=   r   rJ   rK   r   r    rN   r   rs   r  Ú_inject_signature)r5   r/   r]   rl   r#   r#   r$   r2   0  s    


   ÿzHmacV1Auth.add_authc                 C   s
   t ddS )NTrp   r   r•   r#   r#   r$   r	  ;  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—   )rs   r=   rf   )r5   r/   rl   Úauth_headerr#   r#   r$   r!  >  s    
zHmacV1Auth._inject_signature)NN)N)NN)NN)r6   r7   r8   r  r?   r  r  r  r  r  r  r   r2   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;   )r=   rå   )r5   r=   ræ   r#   r#   r$   r?   Y  s    zHmacV1QueryAuth.__init__c                 C   s   t tt ¡ t| jƒ ƒƒS r;   )r.   rÕ   rg   rå   r•   r#   r#   r$   r	  ]  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 )Nrd   rD   ro   ZExpiresr  )r  rç   é   rI   r   rì   rí   rî   )	r=   rf   rs   r   r»   r   r   r    r   )	r5   r/   rl   rð   Z
header_keyr  rñ   rò   ró   r#   r#   r$   r!  `  s    

z!HmacV1QueryAuth._inject_signatureN)r6   r7   r8   rm   rô   r?   r	  r!  r#   r#   r#   r$   r#  L  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ù   rd   rú   r'   rû   rl   )r£   r   r=   rf   rk   rU   rX   rY   r+   rü   rS   r-   r  )r5   r/   rý   rû   rù   r#   r#   r$   r2   Š  s,    

ÿþ
zHmacV1PostAuth.add_authNrþ   r#   r#   r#   r$   r%    s   r%  )Zv2Zv3Zv3httpsrÞ   zs3-queryzs3-presign-postzs3v4-presign-post)ÚCRT_AUTH_TYPE_MAPS)Zv4zv4-queryZs3v4z
s3v4-query)=rX   rÖ   rÊ   r°   rP   r+   r  rg   Úcollections.abcr   Úemail.utilsr   Úhashlibr   r   Úoperatorr   Zbotocore.compatr   r	   r
   r   r   r   r   r   r   Zbotocore.exceptionsr   Zbotocore.utilsr   r   r   r   Ú	getLoggerr6   rJ   rµ   r³   ri   rÌ   r‚   r¬   rª   r%   r0   r1   r:   rn   ru   rÙ   rã   rõ   rö   rÿ   r#  r%  ZAUTH_TYPE_MAPSZbotocore.crt.authr&  rW   r#   r#   r#   r$   Ú<module>   sz   ,
ÿý=  6Q0 +5)ùüÿ