o
    i                     @   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mZmZ d dlmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z% e&e'Z(d	Z)d
Z*dZ+dZ,g dZ-dZ.dZ/dd Z0dd Z1G dd dZ2G dd de2Z3G dd de2Z4G dd de2Z5G dd de2Z6G dd de6Z7G d d! d!e7Z8G d"d# d#e8Z9G d$d% d%e8Z:G d&d' d'e6Z;G d(d) d)e;Z<G d*d+ d+e6Z=G d,d- d-e2Z>G d.d/ d/e>Z?G d0d1 d1e>Z@G d2d3 d3e3ZAd4d5 ZBd6d7 ZCe4e5e5e>e?e@e=e8e:e9eAd8ZDer+d d9lEmFZF eDGeF n
eDGe6e;e7e<d: d;d<d=d>d?ZHd@dA eHI D ZJdS )B    N)Mapping
formatdate)sha1sha256)
itemgetter)HAS_CRTMD5_AVAILABLEHTTPHeadersencodebytesensure_unicodeget_current_datetimeparse_qsquoteunquoteurlsplit
urlunsplit)NoAuthTokenErrorNoCredentialsErrorUnknownSignatureVersionError UnsupportedSignatureVersionError)is_valid_ipv6_endpoint_urlnormalize_url_pathpercent_encode_sequenceZ@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   s\   t | }|j}t| rd| d}ddd}|jd ur,|j||jkr,| d|j }|S )N[]P   i  )httphttps:)r   hostnamer   portgetscheme)url	url_partshostZdefault_ports r(   D/home/app/Keep/.python/lib/python3.10/site-packages/botocore/auth.py_host_from_urlJ   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_dict]   s   


r5   c                   @   s   e Zd ZdZdZdd ZdS )
BaseSignerFc                 C   s   t d)Nadd_auth)NotImplementedErrorselfr4   r(   r(   r)   r7   n   s   zBaseSigner.add_authN)__name__
__module____qualname__REQUIRES_REGIONREQUIRES_TOKENr7   r(   r(   r(   r)   r6   j   s    r6   c                   @   s   e Zd ZdZ	 dd ZdS )TokenSignerTc                 C   
   || _ d S N)
auth_token)r:   rC   r(   r(   r)   __init__x      
zTokenSigner.__init__N)r;   r<   r=   r?   rD   r(   r(   r(   r)   r@   r   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   rA   rB   credentialsr:   rH   r(   r(   r)   rD      rE   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newrH   
secret_keyencoder   sortedr3   r   appendjoinupdatebase64	b64encodedigeststripr2   )r:   r4   paramssplitrV   string_to_signZlhmacpairskeyvalueZ
quoted_keyZquoted_valueqsZb64r(   r(   r)   calc_signature   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2ZSignatureVersionZ
HmacSHA256ZSignatureMethod	TimestampZSecurityTokenrN   )rH   r   r-   rf   
access_keytimestrftimeISO8601gmtimetokenrm   )r:   r4   rf   rl   	signaturer(   r(   r)   r7      s   
zSigV2Auth.add_authN)r;   r<   r=   __doc__rD   rm   r7   r(   r(   r(   r)   rF   |   s
    rF   c                   @   s   e Zd Zdd Zdd ZdS )	SigV3Authc                 C   rA   rB   rG   rI   r(   r(   r)   rD      rE   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,   rL   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rH   r   headersr   rv   rZ   r[   r\   r]   r   ra   r   rd   re   rq   r2   )r:   r4   new_hmacZencoded_signaturerw   r(   r(   r)   r7      s*   



zSigV3Auth.add_authN)r;   r<   r=   rD   r7   r(   r(   r(   r)   ry      s    ry   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 rB   )rH   _region_name_service_namer:   rH   service_nameregion_namer(   r(   r)   rD      s   
zSigV4Auth.__init__Fc                 C   s<   |rt ||dt }|S t ||dt }|S r+   )rZ   r[   r]   r   	hexdigestrd   )r:   rj   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%   )r:   r4   Z
header_mapnamerk   lnamer(   r(   r)   headers_to_sign   s   zSigV4Auth.headers_to_signc                 C   s"   |j r	| |j S | t|jS rB   )rf   _canonical_query_string_params_canonical_query_string_urlr   r%   r9   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-_.~rP   rR   rS   )r.   r   r   r_   r   r3   r^   r`   )r:   rf   key_val_pairsrj   rk   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 )NrO   rS   rR   )queryrg   	partitionr_   r^   r`   )	r:   partsr   r   pairrj   _rk   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 rB   )_header_value.0vr:   r(   r)   	<genexpr>0  s    

z.SigV4Auth.canonical_headers.<locals>.<genexpr>r    rK   )r^   setr`   get_allr_   r   )r:   r   r~   Zsorted_header_namesrj   rk   r(   r   r)   canonical_headers&  s   
zSigV4Auth.canonical_headersc                 C   s   d | S )N )r`   rg   )r:   rk   r(   r(   r)   r   6  s   zSigV4Auth._header_valuec                 C   s    t dd t|D }d|S )Nc                 s   s    | ]	}|   V  qd S rB   )r   re   )r   nr(   r(   r)   r   ?  s    z+SigV4Auth.signed_headers.<locals>.<genexpr>;)r^   r   r`   )r:   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)r:   r4   checksum_context	algorithmr(   r(   r)   _is_streaming_checksum_payloadB  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   iterra   r   r   EMPTY_SHA256_HASH)r:   r4   request_bodypositionZread_chunksizer   chunkZhex_checksumr(   r(   r)   payloadG  s&   


zSigV4Auth.payloadc                 C   s   |j dsdS |jddS )Nr   Tpayload_signing_enabled)r%   
startswithr   r#   r9   r(   r(   r)   r   a  s   z%SigV4Auth._should_sha256_sign_payloadc                 C   s   |j  g}| t|jj}|| || | | |}|| 	|d  || 
| d|jv r>|jd }n| |}|| d|S )NrK   X-Amz-Content-SHA256)rX   upper_normalize_url_pathr   r%   rV   r_   r   r   r   r   r~   r   r`   )r:   r4   crrV   r   Zbody_checksumr(   r(   r)   canonical_requestk  s   





zSigV4Auth.canonical_requestc                 C   s   t t|dd}|S )Nz/~rP   )r   r   )r:   rV   Znormalized_pathr(   r(   r)   r   z  s   zSigV4Auth._normalize_url_pathc                 C   sN   | j jg}||jd dd  || j || j |d d|S N	timestampr      aws4_requestrJ   )rH   rq   r_   r   r   r   r`   r:   r4   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,   rK   )r_   r   r   r   r]   r   r`   )r:   r4   r   stsr(   r(   r)   rh     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   )rH   r\   r   r]   r   r   r   )r:   rh   r4   rj   Zk_dateZk_regionZ	k_serviceZ	k_signingr(   r(   r)   rw     s   zSigV4Auth.signaturec                 C   s   | j d u rt t }|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)rH   r   r   rs   SIGV4_TIMESTAMPr   _modify_request_before_signingr   rT   rU   rh   rw   _inject_signature_to_request)r:   r4   datetime_nowr   rh   rw   r(   r(   r)   r7     s   



zSigV4Auth.add_authc                 C   sV   d|  | g}| |}|d| |  |d|  d||jd< |S )NzAWS4-HMAC-SHA256 Credential=zSignedHeaders=z
Signature=, Authorization)r   r   r_   r   r`   r~   )r:   r4   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_headersrH   rv   r   r#   r   r9   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~   datetimestrptimer   r   r   intcalendartimegm	timetuple)r:   r4   Zdatetime_timestampr(   r(   r)   r     s   




z%SigV4Auth._set_necessary_date_headersN)F)r;   r<   r=   rx   r>   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   rw   r7   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   r9   	__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   TZhas_streaming_inputF)
r   r#   getattrr.   r   r%   r   r~   r   r   )r:   r4   r   Z	s3_configZsign_payloadZchecksum_headerr   r   r   r(   r)   r     s&   


z'S3SigV4Auth._should_sha256_sign_payloadc                 C      |S rB   r(   r:   rV   r(   r(   r)   r        zS3SigV4Auth._normalize_url_path)r;   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                      t  ||| || _d S rB   )r   rD   Z_identity_cache)r:   rH   r   r   identity_cacher   r(   r)   rD        
zS3ExpressAuth.__init__c                    s   t  | d S rB   )r   r7   r9   r   r(   r)   r7   !  s   zS3ExpressAuth.add_authc                    s>   t  | d|jvr| jj|jd< d|jv r|jd= d S d S )Nzx-amz-s3session-tokenr}   )r   r   r~   rH   rv   r9   r   r(   r)   r   $  s   

z,S3ExpressAuth._modify_request_before_signing)r;   r<   r=   REQUIRES_IDENTITY_CACHErD   r7   r   r   r(   r(   r   r)   r     s
    r   c                   @      e Zd ZdZdd ZdS )S3ExpressPostAuthTc                 C   J  t  }|t|jd< i }|jdd d ur|jd }i }g }|jdd d ur9|jd }|dd d ur9|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   x-amz-algorithmx-amz-credential
x-amz-dateX-Amz-S3session-Tokenr,   policyx-amz-signaturer   rs   r   r   r#   r   r_   rH   rv   rb   rc   r0   dumpsr]   r2   rw   r:   r4   r   fieldsr   r   r(   r(   r)   r7   0  s>   



zS3ExpressPostAuth.add_authN)r;   r<   r=   r   r7   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   rD   _expires)r:   rH   r   r   r   r  r   r(   r)   rD   ^  s   	
zS3ExpressQueryAuth.__init__c                 C     |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-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      i | ]	\}}||d  qS r   r(   r   kr   r(   r(   r)   
<dictcomp>      zES3ExpressQueryAuth._modify_request_before_signing.<locals>.<dictcomp>rO   rS   r            r~   r#   r   r   r   r   r  rH   rv   r   r%   r   r   r   rf   ra   r-   r5   r   r   )r:   r4   content_typeZblocklisted_content_typer   auth_paramsr&   query_string_parts
query_dictoperation_paramsnew_query_stringpnew_url_partsr(   r(   r)   r   o  >   
z1S3ExpressQueryAuth._modify_request_before_signingc                 C      | j d| 7  _ d S Nz&X-Amz-Signature=r%   r:   r4   rw   r(   r(   r)   r        z/S3ExpressQueryAuth._inject_signature_to_requestc                 C   r   rB   r(   r   r(   r(   r)   r     r   z&S3ExpressQueryAuth._normalize_url_pathc                 C      t S rB   r   r9   r(   r(   r)   r        zS3ExpressQueryAuth.payload)r;   r<   r=   DEFAULT_EXPIRESr   rD   r   r   r   r   r   r(   r(   r   r)   r  Z  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                    r   rB   r  )r:   rH   r   r   r  r   r(   r)   rD     r   zSigV4QueryAuth.__init__c                 C   r	  )Nr
  r  r   r   r  r}   Tr  c                 S   r  r  r(   r  r(   r(   r)   r    r  zASigV4QueryAuth._modify_request_before_signing.<locals>.<dictcomp>rO   rS   r   r  r  r  r  )r:   r4   r  Zblacklisted_content_typer   r  r&   r  r  r  r  r  r   r(   r(   r)   r     r!  z-SigV4QueryAuth._modify_request_before_signingc                 C   r"  r#  r$  r%  r(   r(   r)   r     r&  z+SigV4QueryAuth._inject_signature_to_request)r;   r<   r=   r*  rD   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   rB   r(   r   r(   r(   r)   r     r   z$S3SigV4QueryAuth._normalize_url_pathc                 C   r'  rB   r(  r9   r(   r(   r)   r   #  r)  zS3SigV4QueryAuth.payloadN)r;   r<   r=   rx   r   r   r(   r(   r(   r)   r-    s    r-  c                   @   r   )S3SigV4PostAuthz
    Presigns a s3 post

    Implementation doc here:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
    c                 C   r   )Nr   r   r   r   r   r   r   r   x-amz-security-tokenr,   r   r   r  r  r(   r(   r)   r7   3  s:   


zS3SigV4PostAuth.add_authNr;   r<   r=   rx   r7   r(   r(   r(   r)   r.  +      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)$Z
accelerateZaclZcorsZdefaultObjectAcllocationloggingZ
partNumberr   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replicationr5  Z	analyticsZmetricsZ	inventoryselectzselect-typezobject-lockNc                 C   rA   rB   rG   r   r(   r(   r)   rD     rE   zHmacV1Auth.__init__c                 C   s>   t j| jjdtd}||d t| 	 
dS )Nr,   rL   )rZ   r[   rH   r\   r]   r   ra   r   rd   re   r2   )r:   rh   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   FTrO   rK   )	_get_dater   r_   re   r`   )r:   r~   Zinteresting_headershoiZihfoundrj   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 rB   )re   r   r(   r(   r)   r     s    
z6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>r    rK   )r   r   r`   r   r^   keysr_   )r:   r~   r>  custom_headersrj   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 )z(
        TODO: Do we need this?
        r  r   )rW   r   )r:   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 )	NrS   c                 S   s   g | ]}| d dqS )rR   r  rg   r   ar(   r(   r)   
<listcomp>  s    z1HmacV1Auth.canonical_resource.<locals>.<listcomp>c                    s$   g | ]}|d   j v r |qS r  )QSAOfInterestrG  rI  r   r(   r)   rK    s    r   )rj   c                 S   s   g | ]}d  |qS )rR   )r`   rI  r(   r(   r)   rK    s    ?)rV   r   rg   rW   sortr   r`   )r:   rg   	auth_pathbufZqsar(   r   r)   canonical_resource  s   	
zHmacV1Auth.canonical_resourcec                 C   sN   |  d }|| |d 7 }| |}|r||d 7 }|| j||d7 }|S )NrK   rO  )r   rA  rE  rQ  )r:   rX   rg   r~   r  rO  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   )rH   rv   rT  rT   rU   r:  )r:   rX   rg   r~   r  rO  rh   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  )rH   r   rT   rU   r   r%   rX   rU  r~   rO  _inject_signature)r:   r4   rg   rw   r(   r(   r)   r7     s   


zHmacV1Auth.add_authc                 C   s
   t ddS )NTr{   r   r   r(   r(   r)   r=    rE   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~   rH   rq   )r:   r4   rw   auth_headerr(   r(   r)   rV    s   
zHmacV1Auth._inject_signature)NNrB   )r;   r<   r=   rL  rD   r:  rA  rE  rG  rQ  rT  rU  r7   r=  rV  r(   r(   r(   r)   r2  [  s    
'
	

r2  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 rB   )rH   r  )r:   rH   r  r(   r(   r)   rD     s   
zHmacV1QueryAuth.__init__c                 C   s   t tt t| j S rB   )r3   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 rH|d  d| }|d	 |d
 |d ||d f}t||_d S )Nrn   rN   rz   ZExpiresrB  )r;  r
     rS   r   r  r  r  )	rH   rq   r~   r   r   r   r   r%   r   )	r:   r4   rw   r  Z
header_keyr@  r  r  r   r(   r(   r)   rV    s    

z!HmacV1QueryAuth._inject_signatureN)r;   r<   r=   rx   r*  rD   r=  rV  r(   r(   r(   r)   rX    s    
rX  c                   @   r   )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   rn   r/  r,   r   rw   )r   r#   rH   rq   rv   r_   rb   rc   r0   r  r]   r2   r:  )r:   r4   r  r   r   r(   r(   r)   r7   B  s,   


zHmacV1PostAuth.add_authNr0  r(   r(   r(   r)   rZ  9  s    rZ  c                   @   r   )
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 u rt d| j j }d|jv r|jd= ||jd< d S )NzBearer r   )rC   r   rv   r~   )r:   r4   rW  r(   r(   r)   r7   i  s   

zBearerAuth.add_authNr0  r(   r(   r(   r)   r[  a  r1  r[  c                 C   sR   | D ]!}|dkrt |   S |t v rt | }|tv r|  S qt|dt| d)Nsmithy.api#noAuthsignature_version)AUTH_TYPE_TO_SIGNATURE_VERSIONAUTH_TYPE_MAPSr   r   )Z
auth_traitZ	auth_typer^  r(   r(   r)   resolve_auth_types  s   

ra  c                    s   dd |D  dd | D }|rt d| |   } fddt|D }|D ]}|dkr4t|   S t|}|tv rA|  S q(tdt	 d)	Nc                 S   s   g | ]	}| d d qS #rH  r   r$   r(   r(   r)   rK    r  z2resolve_auth_scheme_preference.<locals>.<listcomp>c                 S   s   g | ]}|t vr|qS r(   )AUTH_PREF_TO_SIGNATURE_VERSIONre  r(   r(   r)   rK    
    z/Unsupported auth schemes in preference list: %rc                    s   g | ]}| v r|qS r(   r(   re  Zservice_supportedr(   r)   rK    rg  ZnoAuthr   r]  )
rT   rU   r   fromkeysrf  r#   r`  r   r`   r^   )Zpreference_listZauth_optionsunsupportedcombinedZprioritized_schemesr$   sig_versionr(   rh  r)   resolve_auth_scheme_preference  s,   

rm  )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-queryrq  Zv4aro  none)zaws.auth#sigv4zaws.auth#sigv4azsmithy.api#httpBearerAuthr\  c                 C   s    i | ]\}}| d d |qS rb  rH  )r   Zauth_schemerl  r(   r(   r)   r    s    r  )Krb   r   r   r   rZ   r0   r4  rr   collections.abcr   email.utilsr   hashlibr   r   operatorr   Zbotocore.compatr   r	   r
   r   r   r   r   r   r   r   r   Zbotocore.exceptionsr   r   r   r   Zbotocore.utilsr   r   r   	getLoggerr;   rT   r   r   rt   r   r   r   r   r*   r5   r6   r@   rF   ry   r   r   r   r   r  r+  r-  r.  r2  rX  rZ  r[  ra  rm  r`  Zbotocore.crt.authrp  ra   r_  r   rf  r(   r(   r(   r)   <module>   s   4

=  6-hQ0 *5(!

