U
    EZh_                     @   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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dgZ,dZ-dZ.dd Z/dd Z0G dd dZ1G dd de1Z2G dd de1Z3G dd de1Z4G d d! d!e1Z5G d"d# d#e5Z6G d$d% d%e6Z7G d&d' d'e7Z8G d(d) d)e7Z9G d*d+ d+e5Z:G d,d- d-e:Z;G d.d/ d/e5Z<G d0d1 d1e1Z=G d2d3 d3e=Z>G d4d5 d5e=Z?G d6d7 d7e2Z@d8d9 ZAe3e4e4e=e>e?e<e7e9e8e@d:ZBerVd d;lCmDZD eBEeD neBEe5e:e6e;d< d=d>d?d@dAZFdS )B    N)Mapping
formatdate)sha1sha256)
itemgetter)	HAS_CRTHTTPHeadersencodebytesensure_unicodeparse_qsquoteunquoteurlsplit
urlunsplit)NoAuthTokenErrorNoCredentialsErrorUnknownSignatureVersionError UnsupportedSignatureVersionError)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transfer-encodingz
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&   T/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/botocore/auth.py_host_from_urlL   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_dict_   s    


r3   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selfr2   r&   r&   r'   r5   p   s    zBaseSigner.add_authN)__name__
__module____qualname__REQUIRES_REGIONREQUIRES_TOKENr5   r&   r&   r&   r'   r4   l   s   r4   c                   @   s   e Zd ZdZdd ZdS )TokenSignerTc                 C   s
   || _ d S N)
auth_token)r8   r@   r&   r&   r'   __init__z   s    zTokenSigner.__init__N)r9   r:   r;   r=   rA   r&   r&   r&   r'   r>   t   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r8   rD   r&   r&   r'   rA      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newrD   
secret_keyencoder   sortedr1   r   appendjoinupdatebase64	b64encodedigeststripr0   )r8   r2   paramssplitrR   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SecurityTokenrJ   )rD   r   r+   rb   
access_keytimestrftimeISO8601gmtimetokenri   )r8   r2   rb   rh   	signaturer&   r&   r'   r5      s    
zSigV2Auth.add_authN)r9   r:   r;   __doc__rA   ri   r5   r&   r&   r&   r'   rB   ~   s   rB   c                   @   s   e Zd Zdd Zdd ZdS )	SigV3Authc                 C   s
   || _ d S r?   rC   rE   r&   r&   r'   rA      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*   rH   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rD   r   headersr   rr   rV   rW   rX   rY   r   r]   r
   r`   ra   rm   r0   )r8   r2   new_hmacZencoded_signaturers   r&   r&   r'   r5      s(    


 
zSigV3Auth.add_authN)r9   r:   r;   rA   r5   r&   r&   r&   r'   ru      s   ru   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?   )rD   _region_name_service_namer8   rD   service_nameregion_namer&   r&   r'   rA      s    zSigV4Auth.__init__Fc                 C   s:   |rt ||dt }nt ||dt }|S r)   )rV   rW   rY   r   	hexdigestr`   )r8   rf   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	   rz   itemslowerSIGNED_HEADERS_BLACKLISTr(   r#   )r8   r2   Z
header_mapnamerg   lnamer&   r&   r'   headers_to_sign   s    
zSigV4Auth.headers_to_signc                 C   s&   |j r| |j S | t|jS d S r?   )rb   _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|  qRd|}|S )Nz-_.~rL   rN   rO   )r,   r   r   r[   r   r1   rZ   r\   )r8   rb   key_val_pairsrf   rg   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 )NrK   rO   rN   )queryrc   	partitionr[   rZ   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>2  s    z.SigV4Auth.canonical_headers.<locals>.<genexpr>:rG   )rZ   setr\   get_allr[   r   )r8   r   rz   Zsorted_header_namesrf   rg   r&   r   r'   canonical_headers(  s    zSigV4Auth.canonical_headersc                 C   s   d | S )N )r\   rc   )r8   rg   r&   r&   r'   r   8  s    zSigV4Auth._header_valuec                 C   s    t dd t|D }d|S )Nc                 s   s   | ]}|   V  qd S r?   )r   ra   )r   nr&   r&   r'   r   A  s     z+SigV4Auth.signed_headers.<locals>.<genexpr>;)rZ   r   r\   )r8   r   rz   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   r2   checksum_context	algorithmr&   r&   r'   _is_streaming_checksum_payloadD  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 |rt| 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)r8   r2   request_bodypositionZread_chunksizer   chunkZhex_checksumr&   r&   r'   payloadI  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   c  s    z%SigV4Auth._should_sha256_sign_payloadc                 C   s   |j  g}| t|jj}|| || | | |}|| 	|d  || 
| d|jkr||jd }n
| |}|| d|S )NrG   X-Amz-Content-SHA256)rT   upper_normalize_url_pathr   r#   rR   r[   r   r   r   r   rz   r   r\   )r8   r2   crrR   r   Zbody_checksumr&   r&   r'   canonical_requestm  s    




zSigV4Auth.canonical_requestc                 C   s   t t|dd}|S )Nz/~rL   )r   r   )r8   rR   Znormalized_pathr&   r&   r'   r   |  s    zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}||jd dd  || j || j |d d|S N	timestampr      aws4_requestrF   )rD   rm   r[   r   r}   r~   r\   r8   r2   scoper&   r&   r'   r     s    

zSigV4Auth.scopec                 C   sH   g }| |jd dd  | | j | | j | d d|S r   )r[   r   r}   r~   r\   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*   rG   )r[   r   r   r   rY   r   r\   )r8   r2   r   stsr&   r&   r'   rd     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   )rD   rX   r   rY   r   r}   r~   )r8   rd   r2   rf   Zk_dateZk_regionZ	k_serviceZ	k_signingr&   r&   r'   rs     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:
%szStringToSign:
%szSignature:
%s)rD   r   datetimeutcnowro   SIGV4_TIMESTAMPr   _modify_request_before_signingr   rP   rQ   rd   rs   _inject_signature_to_request)r8   r2   datetime_nowr   rd   rs   r&   r&   r'   r5     s    




zSigV4Auth.add_authc                 C   sV   d|  | g}| |}|d| |  |d|  d||jd< |S )NzAWS4-HMAC-SHA256 Credential=zSignedHeaders=z
Signature=z, Authorization)r   r   r[   r   r\   rz   )r8   r2   rs   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   ry   r   Tr   )rz   _set_necessary_date_headersrD   rr   r   r!   r   r7   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 )Nrv   r   
X-Amz-Date)
rz   r   strptimer   r   r   intcalendartimegm	timetuple)r8   r2   Zdatetime_timestampr&   r&   r'   r     s    
 



z%SigV4Auth._set_necessary_date_headersN)F)r9   r:   r;   rt   r<   rA   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rd   rs   r5   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                    s2   t  | d|jkr|jd= | ||jd< d S )Nr   )superr   rz   r   r7   	__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rdS |j ddrdS t 	|S )Nclient_configs3r   zContent-MD5r   r   r   headerr   r   TZhas_streaming_inputF)
r   r!   getattrr,   r   r#   r   rz   r   r   )r8   r2   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&   r8   rR   r&   r&   r'   r     s    zS3SigV4Auth._normalize_url_path)r9   r:   r;   r   r   r   __classcell__r&   r&   r   r'   r     s   )r   c                       s8   e Zd ZdZ fddZ fddZ fddZ  ZS )S3ExpressAuthTc                   s   t  ||| || _d S r?   )r   rA   Z_identity_cache)r8   rD   r   r   identity_cacher   r&   r'   rA     s    zS3ExpressAuth.__init__c                    s   t  | d S r?   )r   r5   r7   r   r&   r'   r5   #  s    zS3ExpressAuth.add_authc                    s:   t  | d|jkr$| jj|jd< d|jkr6|jd= d S )Nzx-amz-s3session-tokenry   )r   r   rz   rD   rr   r7   r   r&   r'   r   &  s
    

z,S3ExpressAuth._modify_request_before_signing)r9   r:   r;   REQUIRES_IDENTITY_CACHErA   r5   r   r   r&   r&   r   r'   r     s   r   c                   @   s   e Zd ZdZdd ZdS )S3ExpressPostAuthTc                 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   x-amz-algorithmx-amz-credential
x-amz-dateX-Amz-S3session-Tokenr*   policyx-amz-signaturer   r   ro   r   r   r!   r   r[   rD   rr   r^   r_   r.   dumpsrY   r0   rs   r8   r2   r   fieldsr   r   r&   r&   r'   r5   2  s>    




zS3ExpressPostAuth.add_authN)r9   r:   r;   r   r5   r&   r&   r&   r'   r   /  s   r   c                       sJ   e Zd ZdZdZed fdd
Zdd Zdd	 Zd
d Zdd Z	  Z
S )S3ExpressQueryAuthi,  T)expiresc                   s   t  j||||d || _d S )N)r   r   rA   _expires)r8   rD   r   r   r   r   r   r&   r'   rA   `  s    	zS3ExpressQueryAuth.__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|_|rt|d }	|	 t| }
|}|d |d |d |
|d f}t||_
d S )Ncontent-type0application/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>  s      zES3ExpressQueryAuth._modify_request_before_signing.<locals>.<dictcomp>rK   rO   r            rz   r!   r   r   r   r   r   rD   rr   r   r#   r   r   r   rb   r]   r+   r3   r   r   )r8   r2   content_typeZblocklisted_content_typer   auth_paramsr$   query_string_parts
query_dictoperation_paramsnew_query_stringpnew_url_partsr&   r&   r'   r   q  s>    
z1S3ExpressQueryAuth._modify_request_before_signingc                 C   s   | j d| 7  _ d S Nz&X-Amz-Signature=r#   r8   r2   rs   r&   r&   r'   r     s    z/S3ExpressQueryAuth._inject_signature_to_requestc                 C   s   |S r?   r&   r   r&   r&   r'   r     s    z&S3ExpressQueryAuth._normalize_url_pathc                 C   s   t S r?   r   r7   r&   r&   r'   r     s    zS3ExpressQueryAuth.payload)r9   r:   r;   DEFAULT_EXPIRESr   rA   r   r   r   r   r   r&   r&   r   r'   r   \  s   	Ar   c                       s4   e Zd ZdZef fdd	Zdd Zdd Z  ZS )SigV4QueryAuth  c                    s   t  ||| || _d S r?   r   )r8   rD   r   r   r   r   r&   r'   rA     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|_|rt|d }	|	 t| }
|}|d |d |d |
|d f}t||_
d S )Nr   r   r   r   r  ry   Tr  c                 S   s   i | ]\}}||d  qS r  r&   r  r&   r&   r'   r    s      zASigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>rK   rO   r   r  r	  r
  r  )r8   r2   r  Zblacklisted_content_typer   r  r$   r  r  r  r  r  r  r&   r&   r'   r     s>    
z-SigV4QueryAuth._modify_request_before_signingc                 C   s   | j d| 7  _ d S r  r  r  r&   r&   r'   r     s    z+SigV4QueryAuth._inject_signature_to_request)r9   r:   r;   r  rA   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   !  s    z$S3SigV4QueryAuth._normalize_url_pathc                 C   s   t S r?   r  r7   r&   r&   r'   r   %  s    zS3SigV4QueryAuth.payloadN)r9   r:   r;   rt   r   r   r&   r&   r&   r'   r    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   r   r   r   r   r   r   r   x-amz-security-tokenr*   r   r   r   r   r&   r&   r'   r5   5  s:    



zS3SigV4PostAuth.add_authNr9   r:   r;   rt   r5   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?   rC   r   r&   r&   r'   rA     s    zHmacV1Auth.__init__c                 C   s>   t j| jjdtd}||d t| 	 
dS )Nr*   rH   )rV   rW   rD   rX   rY   r   r]   r
   r`   ra   r0   )r8   rd   r{   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   daterv   FTrK   rG   )	_get_dater   r[   ra   r\   )r8   rz   Zinteresting_headershoiZihfoundrf   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?   )ra   r   r&   r&   r'   r     s    z6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>r   rG   )r   r   r\   r   rZ   keysr[   )r8   rz   r)  custom_headersrf   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)rS   r   )r8   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 )	NrO   c                 S   s   g | ]}| d dqS )rN   r  )rc   r   ar&   r&   r'   
<listcomp>  s     z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d   j kr |qS r  )QSAOfInterestr2  r3  r   r&   r'   r5    s     r   )rf   c                 S   s   g | ]}d  |qS )rN   )r\   r3  r&   r&   r'   r5    s     ?)rR   r   rc   rS   sortr   r\   )r8   rc   	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 )NrG   r9  )r   r,  r0  r;  )r8   rT   rc   rz   r   r9  csr/  r&   r&   r'   canonical_string  s    
zHmacV1Auth.canonical_stringc                 C   sF   | j jr|d= | j j|d< | j||||d}td|  | |S )Nr  r<  zStringToSign:
)rD   rr   r>  rP   rQ   r%  )r8   rT   rc   rz   r   r9  rd   r&   r&   r'   get_signature  s       zHmacV1Auth.get_signaturec                 C   s\   | 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: r<  )rD   r   rP   rQ   r   r#   rT   r?  rz   r9  _inject_signature)r8   r2   rc   rs   r&   r&   r'   r5     s    


   zHmacV1Auth.add_authc                 C   s
   t ddS )NTrw   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   )rz   rD   rm   )r8   r2   rs   auth_headerr&   r&   r'   r@    s    
zHmacV1Auth._inject_signature)NN)N)NN)NN)r9   r:   r;   r6  rA   r%  r,  r0  r2  r;  r>  r?  r5   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?   )rD   r   )r8   rD   r   r&   r&   r'   rA     s    zHmacV1QueryAuth.__init__c                 C   s   t tt t| j S r?   )r1   r   rn   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 )Nrj   rJ   rv   ZExpiresr-  )r&  r      rO   r   r  r	  r
  )	rD   rm   rz   r   r   r   r   r#   r   )	r8   r2   rs   r  Z
header_keyr+  r  r  r  r&   r&   r'   r@    s    

z!HmacV1QueryAuth._inject_signatureN)r9   r:   r;   rt   r  rA   r(  r@  r&   r&   r&   r'   rB    s
   
rB  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   rj   r  r*   r   rs   )r   r!   rD   rm   rr   r[   r^   r_   r.   r   rY   r0   r%  )r8   r2   r   r   r   r&   r&   r'   r5   D  s,    


zHmacV1PostAuth.add_authNr  r&   r&   r&   r'   rD  ;  s   rD  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   rr   rz   )r8   r2   rA  r&   r&   r'   r5   k  s    

zBearerAuth.add_authNr  r&   r&   r&   r'   rE  c  s   rE  c                 C   sX   | D ]D}|dkrt |   S |t kr>t | }|tkrH|  S qt|dqt| dd S )Nsmithy.api#noAuth)signature_version)AUTH_TYPE_TO_SIGNATURE_VERSIONAUTH_TYPE_MAPSr   r   )Z
auth_traitZ	auth_typerG  r&   r&   r'   resolve_auth_typeu  s    
rJ  )Zv2Zv3Zv3httpsr   zs3-queryzs3-presign-postzs3v4-presign-postzv4-s3expresszv4-s3express-queryzv4-s3express-presign-postbearer)CRT_AUTH_TYPE_MAPS)v4zv4-queryZs3v4z
s3v4-queryrM  Zv4arK  none)zaws.auth#sigv4zaws.auth#sigv4azsmithy.api#httpBearerAuthrF  )Gr^   r   r   r   rV   r.   r!  rn   collections.abcr   email.utilsr   hashlibr   r   operatorr   Zbotocore.compatr   r	   r
   r   r   r   r   r   r   Zbotocore.exceptionsr   r   r   r   Zbotocore.utilsr   r   r   r   	getLoggerr9   rP   r   r   rp   r   r   r   r   r(   r3   r4   r>   rB   ru   r|   r   r   r   r   r  r  r  r  rB  rD  rE  rJ  rI  Zbotocore.crt.authrL  r]   rH  r&   r&   r&   r'   <module>   s   ,

=  6-hQ0 *5(
