
    !io                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
Jr  S SKJrJr  S SKJr  S SKJrJrJrJrJrJrJrJrJrJrJr  S SKJrJrJ r J!r!  S SK"J#r#J$r$J%r%  \RL                  " \'5      r(S	r)S
r*Sr+Sr,/ SQr-Sr.Sr/S r0S r1 " S S5      r2 " S S\25      r3 " S S\25      r4 " S S\25      r5 " S S\25      r6 " S S\65      r7 " S S\75      r8 " S  S!\85      r9 " S" S#\85      r: " S$ S%\65      r; " S& S'\;5      r< " S( S)\65      r= " S* S+\25      r> " S, S-\>5      r? " S. S/\>5      r@ " S0 S1\35      rAS2 rBS3 rC\4\5\5\>\?\@\=\8\:\9\AS4.rD\(       a  S S5KEJFrF  \DR                  \F5        O\DR                  \6\;\7\<S6.5        S7S8S9S:S;.rH\HR                  5        V Vs0 s H  u  pU R                  S<5      S=   U_M     snn rKgs  snn f )>    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_sequence@e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855i   z%Y-%m-%dT%H:%M:%SZz%Y%m%dT%H%M%SZ)
connectionexpectz
keep-alivezproxy-authenticatezproxy-authorizationtetrailerztransfer-encodingupgradez
user-agentzx-amzn-trace-idzUNSIGNED-PAYLOADz"STREAMING-UNSIGNED-PAYLOAD-TRAILERc                     [        U 5      nUR                  n[        U 5      (       a  SU S3nSSS.nUR                  b:  UR                  UR	                  UR
                  5      :w  a  U SUR                   3nU$ )N[]P   i  )httphttps:)r   hostnamer   portgetscheme)url	url_partshostdefault_portss       L/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/botocore/auth.py_host_from_urlr1   Q   s    
 ID!#&&4&{M ~~!>>]..y/?/?@@V1Y^^,-DK    c                     U R                   n[        U[        5      (       a'  [        R                  " UR                  S5      5      nU$ [        U[        5      (       a  [        R                  " U5      nU$ Nutf-8)data
isinstancebytesjsonloadsdecodestr)requestr6   s     r0   _get_body_as_dictr>   d   sZ    
 <<D$zz$++g./ K 
D#		zz$Kr2   c                   "    \ rS rSrSrSrS rSrg)
BaseSignerq   Fc                     [        S5      e)Nadd_auth)NotImplementedErrorselfr=   s     r0   rC   BaseSigner.add_authu   s    !*--r2    N)__name__
__module____qualname____firstlineno__REQUIRES_REGIONREQUIRES_TOKENrC   __static_attributes__rH   r2   r0   r@   r@   q   s    ON.r2   r@   c                        \ rS rSrSr S rSrg)TokenSignery   Tc                     Xl         g N
auth_token)rF   rV   s     r0   __init__TokenSigner.__init__   s    $r2   rU   N)rI   rJ   rK   rL   rN   rW   rO   rH   r2   r0   rQ   rQ   y   s    N%r2   rQ   c                   *    \ rS rSrSrS rS rS rSrg)	SigV2Auth   z#
Sign a request with Signature V2.
c                     Xl         g rT   credentialsrF   r^   s     r0   rW   SigV2Auth.__init__       &r2   c                 F   [         R                  S5        [        UR                  5      nUR                  n[        U5      S:X  a  SnUR                   SUR                   SU S3n[        R                  " U R                  R                  R                  S5      [        S9n/ n[        U5       H`  nUS:X  a  M  [        X(   5      n	[!        UR                  S5      SS	9n
[!        U	R                  S5      S
S	9nUR#                  U
 SU 35        Mb     SR%                  U5      nX\-  n[         R                  SU5        UR'                  UR                  S5      5        [(        R*                  " UR-                  5       5      R/                  5       R1                  S5      nX4$ )Nz$Calculating signature using v2 auth.r   /
r5   	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;   )rF   r=   paramssplitro   string_to_signlhmacpairskeyvalue
quoted_keyquoted_valueqsb64s                 r0   calc_signatureSigV2Auth.calc_signature   s_   ;<%zzt9>D#NN+2ell^2dV2F''..w76
 &>C k!$Eszz'2<J g!6UCLLLJ<q78 " XXe_)>:^**734u||~.446==gFyr2   c                    U R                   c
  [        5       eUR                  (       a  UR                  nOUR                  nU R                   R                  US'   SUS'   SUS'   [
        R                  " [        [
        R                  " 5       5      US'   U R                   R                  (       a  U R                   R                  US'   U R                  X5      u  p4XBS'   U$ )	NAWSAccessKeyId2SignatureVersion
HmacSHA256SignatureMethod	TimestampSecurityTokenrg   )r^   r   r6   r   
access_keytimestrftimeISO8601gmtimetokenr   )rF   r=   r   r   	signatures        r0   rC   SigV2Auth.add_auth   s     #$&&<<\\F ^^F#'#3#3#>#> %(!"$0 !"mmGT[[]C{!!&*&6&6&<&<F?#++G<'{r2   r]   N)	rI   rJ   rK   rL   __doc__rW   r   rC   rO   rH   r2   r0   rZ   rZ      s    '8r2   rZ   c                        \ rS rSrS rS rSrg)	SigV3Auth   c                     Xl         g rT   r]   r_   s     r0   rW   SigV3Auth.__init__   ra   r2   c                    U R                   c
  [        5       eSUR                  ;   a  UR                  S	 [        SS9UR                  S'   U R                   R                  (       a@  SUR                  ;   a  UR                  S	 U R                   R                  UR                  S'   [
        R                  " U R                   R                  R                  S5      [        S9nUR                  UR                  S   R                  S5      5        [        UR                  5       5      R                  5       nSU R                   R                   SUR                  S5       3nS	UR                  ;   a  UR                  S		 XAR                  S	'   g )
NDateTusegmtX-Amz-Security-Tokenr5   re   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)r^   r   headersr   r   rs   rt   ru   rv   r   rz   r   r}   r~   r   r;   )rF   r=   new_hmacencoded_signaturer   s        r0   rC   SigV3Auth.add_auth   sJ   #$&&W__$'",D"9!!%8OO$:;6:6F6F6L6LGOO2388''..w76
 	/66w?@'(9:@@B()9)9)D)D(E F..?.F.Fw.O-PR 	 "W__4 672;./r2   r]   N)rI   rJ   rK   rL   rW   rC   rO   rH   r2   r0   r   r      s    '<r2   r   c                       \ rS rSrSrSrS rSS jrS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)	SigV4Auth   z#
Sign a request with Signature V4.
Tc                 (    Xl         X0l        X l        g rT   )r^   _region_name_service_namerF   r^   service_nameregion_names       r0   rW   SigV4Auth.__init__   s    & ()r2   c                     U(       a:  [         R                  " XR                  S5      [        5      R	                  5       nU$ [         R                  " XR                  S5      [        5      R                  5       nU$ r4   )rs   rt   rv   r   	hexdigestr}   )rF   r   msghexsigs        r0   _signSigV4Auth._sign   sW    ((3

7 3V<FFHC 
 ((3

7 3V<CCEC
r2   c                     [        5       nUR                  R                  5        H%  u  p4UR                  5       nU[        ;  d  M!  XBU'   M'     SU;  a  [        UR                  5      US'   U$ )zS
Select the headers from the request that need to be included
in the StringToSign.
r.   )r   r   itemslowerSIGNED_HEADERS_BLACKLISTr1   r,   )rF   r=   
header_mapnamer   lnames         r0   headers_to_signSigV4Auth.headers_to_sign   se    
 !]
"??002KDJJLE44$)5! 3 # "0!<Jvr2   c                     UR                   (       a  U R                  UR                   5      $ U R                  [        UR                  5      5      $ rT   )r   _canonical_query_string_params_canonical_query_string_urlr   r,   rE   s     r0   canonical_query_string SigV4Auth.canonical_query_string  s:    
 >>66w~~FF33HW[[4IJJr2   c           	      <   / n[        U[        5      (       a  UR                  5       nU H1  u  p4UR                  [	        USS9[	        [        U5      SS945        M3     / n[        U5       H  u  p4UR                  U SU 35        M     SR                  U5      nU$ )Nz-_.~ri   rk   rl   )r7   r   r   rx   r   r<   rw   ry   )rF   r   key_val_pairsr   r   sorted_key_valsr   s          r0   r   (SigV4Auth._canonical_query_string_params  s    fg&&\\^F JC  s(%E
*HI !  !/JC""cU!E7#34 0!$/!:%%r2   c                 :   SnUR                   (       a  / nUR                   R                  S5       H)  nUR                  S5      u  pVnUR                  XW45        M+     / n[	        U5       H  u  pWUR                  U SU 35        M     SR                  U5      nU$ )Nrh   rl   rk   )queryr   	partitionrx   rw   ry   )	rF   partsr   r   pairr   _r   r   s	            r0   r   %SigV4Auth._canonical_query_string_url  s    !#;;M))#. $s 3$$c\2 / !O %]3
&&#aw'78 4%(XXo%>"%%r2   c                    ^  / n[        [        U5      5      nU HL  nSR                  U 4S jUR                  U5       5       5      nUR	                  U S[        U5       35        MN     SR                  U5      $ )z
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   F   >#    U  H  nTR                  U5      v   M     g 7frT   )_header_value).0vrF   s     r0   	<genexpr>.SigV4Auth.canonical_headers.<locals>.<genexpr>7  s#      /K!""1%%/Ks   !r'   rd   )rw   setry   get_allrx   r   )rF   r   r   sorted_header_namesr   r   s   `     r0   canonical_headersSigV4Auth.canonical_headers-  sz     $S%9:&CHH />/F/Fs/K E NNcU!N5$9#:;<	 '
 yy!!r2   c                 @    SR                  UR                  5       5      $ )N )ry   r   )rF   r   s     r0   r   SigV4Auth._header_value=  s     xx&&r2   c                 Z    [        S [        U5       5       5      nSR                  U5      $ )Nc              3   \   #    U  H"  oR                  5       R                  5       v   M$     g 7frT   )r   r~   )r   ns     r0   r   +SigV4Auth.signed_headers.<locals>.<genexpr>F  s      I4Hq**4Hs   *,;)rw   r   ry   )rF   r   r   s      r0   signed_headersSigV4Auth.signed_headersE  s&    IC4HIIxx  r2   c                     UR                   R                  S0 5      nUR                  S5      n[        U[        5      =(       a    UR                  S5      S:H  $ )Nchecksumrequest_algorithminr   )contextr*   r7   dict)rF   r=   checksum_context	algorithms       r0   _is_streaming_checksum_payload(SigV4Auth._is_streaming_checksum_payloadI  sJ    "??..z2>$(()<=	)T*Oy}}T/Bi/OOr2   c                    U R                  U5      (       a  [        $ U R                  U5      (       d  [        $ UR                  nU(       a  [        US5      (       a  UR                  5       n[        R                  " UR                  [        5      n[        5       n[        US5       H  nUR                  U5        M     UR                  5       nUR                  U5        U$ U(       a  [        U5      R                  5       $ [         $ )Nseekr2   )r   "STREAMING_UNSIGNED_PAYLOAD_TRAILER_should_sha256_sign_payloadUNSIGNED_PAYLOADbodyhasattrtell	functoolspartialreadPAYLOAD_BUFFERr   iterrz   r   r   EMPTY_SHA256_HASH)rF   r=   request_bodypositionread_chunksizer   chunkhex_checksums           r0   payloadSigV4Auth.payloadN  s    ..w775511':: $#||GL&99#((*H&..!!>N xHnc2& 3#--/Lh' ,'1133$$r2   c                 |    UR                   R                  S5      (       d  gUR                  R                  SS5      $ )Nr&   Tpayload_signing_enabled)r,   
startswithr   r*   rE   s     r0   r   %SigV4Auth._should_sha256_sign_payloadh  s4    {{%%g..
 ""#<dCCr2   c                 D   UR                   R                  5       /nU R                  [        UR                  5      R
                  5      nUR                  U5        UR                  U R                  U5      5        U R                  U5      nUR                  U R                  U5      S-   5        UR                  U R                  U5      5        SUR                  ;   a  UR                  S   nOU R                  U5      nUR                  U5        SR                  U5      $ )Nrd   X-Amz-Content-SHA256)rq   upper_normalize_url_pathr   r,   ro   rx   r   r   r   r   r   r	  ry   )rF   r=   crro   r   body_checksums         r0   canonical_requestSigV4Auth.canonical_requestr  s    nn""$%''(=(B(BC
		$
		$--g67..w7
		$((9D@A
		$%%o67!W__4#OO,BCM LL1M
		- yy}r2   c                 ,    [        [        U5      SS9nU$ )Nz/~ri   )r   r   )rF   ro   normalized_paths      r0   r  SigV4Auth._normalize_url_path  s     24 8tDr2   c                 "   U R                   R                  /nUR                  UR                  S   SS 5        UR                  U R                  5        UR                  U R
                  5        UR                  S5        SR                  U5      $ N	timestampr      aws4_requestrc   )r^   r   rx   r   r   r   ry   rF   r=   scopes      r0   r   SigV4Auth.scope  sp    !!,,-W__[1!A67T&&'T''(^$xxr2   c                     / nUR                  UR                  S   SS 5        UR                  U R                  5        UR                  U R                  5        UR                  S5        SR	                  U5      $ r  )rx   r   r   r   ry   r  s      r0   credential_scopeSigV4Auth.credential_scope  sa    W__[1!A67T&&'T''(^$xxr2   c                    S/nUR                  UR                  S   5        UR                  U R                  U5      5        UR                  [        UR	                  S5      5      R                  5       5        SR                  U5      $ )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  r5   rd   )rx   r   r#  r   rv   r   ry   )rF   r=   r  stss       r0   r   SigV4Auth.string_to_sign  sl     ""

7??;/0

4((12

6+227;<FFHIyy~r2   c                 D   U R                   R                  nU R                  SU 3R                  5       UR                  S   SS 5      nU R                  X@R
                  5      nU R                  XPR                  5      nU R                  US5      nU R                  XqSS9$ )NAWS4r  r   r  r  T)r   )r^   ru   r   rv   r   r   r   )rF   r   r=   r   k_datek_region	k_service	k_signings           r0   r   SigV4Auth.signature  s    ))C5\!!#W__[%A!A%F
 ::f&7&78JJx););<	JJy.9	zz)z>>r2   c                    U R                   c
  [        5       e[        5       nUR                  [        5      UR
                  S'   U R                  U5        U R                  U5      n[        R                  S5        [        R                  SU5        U R                  X5      n[        R                  SU5        U R                  XA5      n[        R                  SU5        U R                  X5        g )Nr  z$Calculating signature using v4 auth.zCanonicalRequest:
%sStringToSign:
%szSignature:
%s)r^   r   r   r   SIGV4_TIMESTAMPr   _modify_request_before_signingr  rm   rn   r   r   _inject_signature_to_request)rF   r=   datetime_nowr  r   r   s         r0   rC   SigV4Auth.add_auth  s    #$&&+-'3'<'<_'M$ 	++G4 227;;<,.?@,,WH(.9NN>;	%y1))'=r2   c                     SU R                  U5       3/nU R                  U5      nUR                  SU R                  U5       35        UR                  SU 35        SR	                  U5      UR
                  S'   U$ )NzAWS4-HMAC-SHA256 Credential=zSignedHeaders=z
Signature=, Authorization)r   r   rx   r   ry   r   )rF   r=   r   auth_strr   s        r0   r4  &SigV4Auth._inject_signature_to_request  s~    24::g3F2GHI..w7T00ABC	
 	*YK01+/99X+>(r2   c                    SUR                   ;   a  UR                   S	 U R                  U5        U R                  R                  (       a@  SUR                   ;   a  UR                   S	 U R                  R                  UR                   S'   UR                  R                  SS5      (       d1  SUR                   ;   a  UR                   S	 [        UR                   S'   g g )Nr9  r   r  Tr  )r   _set_necessary_date_headersr^   r   r   r*   r   rE   s     r0   r3  (SigV4Auth._modify_request_before_signing  s    goo-0((1!!%8OO$:;6:6F6F6L6LGOO23""#<dCC%8OO$:;6FGOO23 Dr2   c                    SUR                   ;   a  UR                   S	 [        R                  R                  UR                  S   [        5      n[        [        [        R                  " UR                  5       5      5      5      UR                   S'   SUR                   ;   a  UR                   S	 g g SUR                   ;   a  UR                   S	 UR                  S   UR                   S'   g )Nr   r  
X-Amz-Date)
r   datetimestrptimer   r2  r   intcalendartimegm	timetuple)rF   r=   datetime_timestamps      r0   r=  %SigV4Auth._set_necessary_date_headers  s     W__$'!)!2!2!;!;,o" '1HOO$6$@$@$BCD'GOOF# w.OOL1 / w.OOL1,3OOK,HGOOL)r2   )r   r   r^   N)F)rI   rJ   rK   rL   r   rM   rW   r   r   r   r   r   r   r   r   r   r	  r   r  r  r   r#  r   r   rC   r4  r3  r=  rO   rH   r2   r0   r   r      s     O* K&"& " '!P
%4D
?>$GIr2   r   c                   :   ^  \ rS rSrU 4S jrU 4S jrS rSrU =r$ )S3SigV4Authi  c                    > [         TU ]  U5        SUR                  ;   a  UR                  S	 U R                  U5      UR                  S'   g )Nr  )superr3  r   r	  rF   r=   	__class__s     r0   r3  *S3SigV4Auth._modify_request_before_signing  sA    .w7!W__4 6726,,w2G./r2   c                 
  > UR                   R                  S5      n[        USS 5      nUc  0 nUR                  SS 5      nUb  U$ SnUR                   R                  S0 5      nUR                  S5      n[        U[        5      (       a  UR                  S5      S:X  a  US	   nUR
                  R                  S
5      (       a  XQR                  ;  a  gUR                   R                  SS5      (       a  g[        TU ]%  U5      $ )Nclient_configs3r  zContent-MD5r   r   r   headerr   r&   Thas_streaming_inputF)
r   r*   getattrr7   r   r,   r  r   rL  r   )	rF   r=   rQ  	s3_configsign_payloadchecksum_headerr   r   rN  s	           r0   r   'S3SigV4Auth._should_sha256_sign_payload  s      ++O<M46	 I !}}%>E# ("??..z2>$(()<=	i&&9==+>(+J'/O&&w//oo5 ??4e<< w27;;r2   c                     U$ rT   rH   rF   ro   s     r0   r  S3SigV4Auth._normalize_url_path      r2   rH   )	rI   rJ   rK   rL   r3  r   r  rO   __classcell__rN  s   @r0   rJ  rJ    s    H'<R r2   rJ  c                   D   ^  \ rS rSrSrU 4S jrU 4S jrU 4S jrSrU =r	$ )S3ExpressAuthi  Tc                2   > [         TU ]  XU5        X@l        g rT   )rL  rW   _identity_cache)rF   r^   r   r   identity_cacherN  s        r0   rW   S3ExpressAuth.__init__"  s     	K@-r2   c                 $   > [         TU ]  U5        g rT   )rL  rC   rM  s     r0   rC   S3ExpressAuth.add_auth(  s    !r2   c                    > [         TU ]  U5        SUR                  ;  a#  U R                  R                  UR                  S'   SUR                  ;   a  UR                  S	 g g )Nzx-amz-s3session-tokenr   )rL  r3  r   r^   r   rM  s     r0   r3  ,S3ExpressAuth._modify_request_before_signing+  sU    .w7"'//97;7G7G7M7MGOO34!W__4 67 5r2   )rc  )
rI   rJ   rK   rL   REQUIRES_IDENTITY_CACHErW   rC   r3  rO   r^  r_  s   @r0   ra  ra    s    "."8 8r2   ra  c                       \ rS rSrSrS rSrg)S3ExpressPostAuthi4  Tc                    [        5       nUR                  [        5      UR                  S'   0 nUR                  R	                  SS 5      b  UR                  S   n0 n/ nUR                  R	                  SS 5      b'  UR                  S   nUR	                  SS 5      b  US   nXTS'   SUS'   U R                  U5      US'   UR                  S   US'   UR                  SS05        UR                  SU R                  U5      05        UR                  SUR                  S   05        U R                  R                  b@  U R                  R                  US	'   UR                  S	U R                  R                  05        [        R                  " [        R                  " U5      R                  S
5      5      R                  S
5      US'   U R                  US   U5      US'   X1R                  S'   XAR                  S'   g )Nr  s3-presign-post-fieldss3-presign-post-policy
conditionsr&  x-amz-algorithmx-amz-credential
x-amz-dateX-Amz-S3session-Tokenr5   policyx-amz-signaturer   r   r2  r   r*   r   rx   r^   r   r{   r|   r9   dumpsrv   r;   r   rF   r=   r5  fieldsru  rp  s         r0   rC   S3ExpressPostAuth.add_auth7  s   +-'3'<'<_'M$??7>J__%=>F
??7>J__%=>Fzz,-9#L1
)|$6 !%)ZZ%8!"&{;|,.@AB-tzz'/BCD<)EFG!!-.2.>.>.D.DF*+($*:*:*@*@A
 "++JJv%%g.

&/ 	x %)NN6(3CW$M !4:014:01r2   rH   N)rI   rJ   rK   rL   rj  rC   rO   rH   r2   r0   rl  rl  4  s    "';r2   rl  c                   P   ^  \ rS rSrSrSr\S.U 4S jjrS rS rS r	S	 r
S
rU =r$ )S3ExpressQueryAuthia  i,  T)expiresc                2   > [         TU ]  UUUUS9  XPl        g )N)rd  rL  rW   _expires)rF   r^   r   r   rd  r~  rN  s         r0   rW   S3ExpressQueryAuth.__init__e  s*     	)	 	 	
  r2   c                 h   UR                   R                  S5      nSnX#:X  a  UR                   S	 U R                  U R                  U5      5      nSU R	                  U5      UR
                  S   U R                  US.nU R                  R                  b  U R                  R                  US'   [        UR                  5      n[        UR                  SS9nUR                  5        VV	s0 s H
  u  pXS	   _M     n
nn	UR                  (       a"  U
R                  UR                  5        0 Ul        S
nUR                   (       a!  U
R                  [#        U5      5        S
Ul        U
(       a  [%        U
5      S-   nU [%        U5       3nUnUS	   US   US   XS   4n['        U5      Ul
        g s  sn	nf )Ncontent-type0application/x-www-form-urlencoded; charset=utf-8r&  r  zX-Amz-AlgorithmzX-Amz-Credentialr@  zX-Amz-ExpireszX-Amz-SignedHeadersrt  Tkeep_blank_valuesr   rh   rl            r   r*   r   r   r   r   r  r^   r   r   r,   r   r   r   r   rz   r6   r>   r   r   )rF   r=   content_typeblocklisted_content_typer   auth_paramsr-   query_string_partskr   
query_dictoperation_paramsnew_query_stringpnew_url_partss                  r0   r3  1S3ExpressQueryAuth._modify_request_before_signingv  s    **>:> 	! 3/
 ,,T-A-A'-JK  2 $

7 3!//+6!]]#1
 !!-373C3C3I3IK/0 W[[)	 &iooN*<*B*B*DE*D$!a1g*D
E>>gnn-GN << /89GL6zBSH !8!E FG 	 1qtQqT+;qTB /A F   *F.c                 4    U=R                   SU 3-  sl         g Nz&X-Amz-Signature=r,   rF   r=   r   s      r0   r4  /S3ExpressQueryAuth._inject_signature_to_request       	*9+66r2   c                     U$ rT   rH   r[  s     r0   r  &S3ExpressQueryAuth._normalize_url_path  r]  r2   c                     [         $ rT   r   rE   s     r0   r	  S3ExpressQueryAuth.payload  
    
  r2   r  )rI   rJ   rK   rL   DEFAULT_EXPIRESrj  rW   r3  r4  r  r	  rO   r^  r_  s   @r0   r}  r}  a  s7    O"     "?0B7   r2   r}  c                   >   ^  \ rS rSrSr\4U 4S jjrS rS rSrU =r	$ )SigV4QueryAuthi    c                 2   > [         TU ]  XU5        X@l        g rT   r  )rF   r^   r   r   r~  rN  s        r0   rW   SigV4QueryAuth.__init__  s     	K@r2   c                 h   UR                   R                  S5      nSnX#:X  a  UR                   S	 U R                  U R                  U5      5      nSU R	                  U5      UR
                  S   U R                  US.nU R                  R                  b  U R                  R                  US'   [        UR                  5      n[        UR                  SS9nUR                  5        VV	s0 s H
  u  pXS	   _M     n
nn	UR                  (       a"  U
R                  UR                  5        0 Ul        S
nUR                   (       a!  U
R                  [#        U5      5        S
Ul        U
(       a  [%        U
5      S-   nU [%        U5       3nUnUS	   US   US   XS   4n['        U5      Ul
        g s  sn	nf )Nr  r  r&  r  r  r   Tr  r   rh   rl   r  r  r  r  )rF   r=   r  blacklisted_content_typer   r  r-   r  r  r   r  r  r  r  r  s                  r0   r3  -SigV4QueryAuth._modify_request_before_signing  s    **>:> 	! 3/
 ,,T-A-A'-JK  2 $

7 3!//+6!]]#1
 !!-262B2B2H2HK./ W[[)	 &iooN*<*B*B*DE*D$!a1g*D
E>>gnn-GN << /89GL6zBSH !8!E FG 	 1qtQqT+;qTB /A Fr  c                 4    U=R                   SU 3-  sl         g r  r  r  s      r0   r4  +SigV4QueryAuth._inject_signature_to_request  r  r2   r  )
rI   rJ   rK   rL   r  rW   r3  r4  rO   r^  r_  s   @r0   r  r    s#    O ?N ?0B7 7r2   r  c                   $    \ rS rSrSrS rS rSrg)S3SigV4QueryAuthi  zS3 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                     U$ rT   rH   r[  s     r0   r  $S3SigV4QueryAuth._normalize_url_path&  r]  r2   c                     [         $ rT   r  rE   s     r0   r	  S3SigV4QueryAuth.payload*  r  r2   rH   N)rI   rJ   rK   rL   r   r  r	  rO   rH   r2   r0   r  r    s    	 r2   r  c                       \ rS rSrSrS rSrg)S3SigV4PostAuthi2  zv
Presigns a s3 post

Implementation doc here:
http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
c                    [        5       nUR                  [        5      UR                  S'   0 nUR                  R	                  SS 5      b  UR                  S   n0 n/ nUR                  R	                  SS 5      b'  UR                  S   nUR	                  SS 5      b  US   nXTS'   SUS'   U R                  U5      US'   UR                  S   US'   UR                  SS05        UR                  SU R                  U5      05        UR                  SUR                  S   05        U R                  R                  b@  U R                  R                  US	'   UR                  S	U R                  R                  05        [        R                  " [        R                  " U5      R                  S
5      5      R                  S
5      US'   U R                  US   U5      US'   X1R                  S'   XAR                  S'   g )Nr  rn  ro  rp  r&  rq  rr  rs  x-amz-security-tokenr5   ru  rv  rw  ry  s         r0   rC   S3SigV4PostAuth.add_auth:  s   +-'3'<'<_'M$??7>J__%=>F
??7>J__%=>Fzz,-9#L1
)|$6 !%)ZZ%8!"&{;|,.@AB-tzz'/BCD<)EFG!!--1-=-=-C-CF)*5t7G7G7M7MNO "++JJv%%g.

&/ 	x %)NN6(3CW$M !4:014:01r2   rH   NrI   rJ   rK   rL   r   rC   rO   rH   r2   r0   r  r  2  s    %;r2   r  c                   r    \ rS rSr/ SQrSS jrS rS rS rS r	SS	 jr
 SS
 jr SS jrS rS rS rSrg)
HmacV1Authib  )$
accelerateaclcorsdefaultObjectAcllocationlogging
partNumberru  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                     Xl         g rT   r]   r   s       r0   rW   HmacV1Auth.__init__  ra   r2   c                 &   [         R                  " U R                  R                  R	                  S5      [
        S9nUR                  UR	                  S5      5        [        UR                  5       5      R                  5       R                  S5      $ )Nr5   re   )rs   rt   r^   ru   rv   r   rz   r   r}   r~   r;   )rF   r   r   s      r0   sign_stringHmacV1Auth.sign_string  sk    88''..w74
 	--g678??,-335<<WEEr2   c                 F   / SQn/ nSU;   a  US	 U R                  5       US'   U Hi  nSnU HD  nUR                  5       nX   c  M  Xt:X  d  M!  UR                  X   R                  5       5        SnMF     U(       a  MX  UR                  S5        Mk     SR	                  U5      $ )N)content-md5r  dater   FTrh   rd   )	_get_dater   rx   r~   ry   )rF   r   interesting_headershoiihfoundr   lks           r0   canonical_standard_headers%HmacV1Auth.canonical_standard_headers  s    EW..*%BEYY[<+JJw|1134 E	 
 5

2 & yy~r2   c                 b   / n0 nU H[  nUR                  5       nX   c  M  UR                  S5      (       d  M2  SR                  S UR                  U5       5       5      X5'   M]     [	        UR                  5       5      nU H  nUR                  U SX4    35        M     SR                  U5      $ )Nx-amz-r   c              3   @   #    U  H  oR                  5       v   M     g 7frT   )r~   )r   r   s     r0   r   6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>  s      2+?a		+?s   r'   rd   )r   r  ry   r   rw   keysrx   )rF   r   r  custom_headersr   r  sorted_header_keyss          r0   canonical_custom_headers#HmacV1Auth.canonical_custom_headers  s    CB|'==**), 2+2??3+?2 *N&	  $N$7$7$9:%CJJ#a 3456 &yy~r2   c                 J    [        U5      S:X  a  U$ US   [        US   5      4$ )z
TODO: Do we need this?
r  r   )rp   r   )rF   nvs     r0   	unquote_vHmacV1Auth.unquote_v  s+     r7a<IqE72a5>**r2   c                    Ub  UnOUR                   nUR                  (       a  UR                  R                  S5      nU Vs/ s H  oUR                  SS5      PM     nnU Vs/ s H(  oUS   U R                  ;   d  M  U R	                  U5      PM*     nn[        U5      S:  aR  UR                  [        S5      S9  U Vs/ s H  nSR                  U5      PM     nnUS-  nUSR                  U5      -  nU$ s  snf s  snf s  snf )Nrl   rk   r  r   )r   ?)	ro   r   r   QSAOfInterestr  rp   sortr   ry   )rF   r   	auth_pathbufqsaas         r0   canonical_resourceHmacV1Auth.canonical_resource  s      C**C;;++##C(C,/0Cq773?CC0+.+.aA$$:L:L2L!q!3   3x!|Z]+,/0Cqsxx{C0s
sxx}$
 1
 1s   C8$C=>C= Dc                     UR                  5       S-   nX`R                  U5      S-   -  nU R                  U5      nU(       a  XgS-   -  nX`R                  X%S9-  nU$ )Nrd   r  )r  r  r  r  )rF   rq   r   r   r~  r  csr  s           r0   canonical_stringHmacV1Auth.canonical_string  sg     \\^d"
--g6==66w?4''B
%%e%AA	r2   c                     U R                   R                  (       a  US	 U R                   R                  US'   U R                  XX5S9n[        R	                  SU5        U R                  U5      $ )Nr  r  r1  )r^   r   r  rm   rn   r  )rF   rq   r   r   r~  r  r   s          r0   get_signatureHmacV1Auth.get_signature  so     !!./.2.>.>.D.DG*+..7 / 
 	(.9//r2   c                 >   U R                   c  [        e[        R                  S5        [	        UR
                  5      n[        R                  SUR                  5        U R                  UR                  X!R                  UR                  S9nU R                  X5        g )Nz(Calculating signature using hmacv1 auth.zHTTP request method: %sr  )r^   r   rm   rn   r   r,   rq   r  r   r  _inject_signature)rF   r=   r   r   s       r0   rC   HmacV1Auth.add_auth  s|    #$$?@%.?&&NNE??g>O>O ' 
	 	w2r2   c                     [        SS9$ )NTr   r   rF   s    r0   r  HmacV1Auth._get_date  s    &&r2   c                     SUR                   ;   a  UR                   S	 SU R                  R                   SU 3nX1R                   S'   g )Nr9  zAWS r'   )r   r^   r   )rF   r=   r   auth_headers       r0   r	  HmacV1Auth._inject_signature  sG    goo- 0T--8899+F+6(r2   r]   )NNrT   )rI   rJ   rK   rL   r  rW   r  r  r  r  r  r  r  rC   r  r	  rO   rH   r2   r0   r  r  b  sN    %MN'F"+6 ?C	 ?C
0	3'7r2   r  c                   4    \ rS rSrSrSr\4S jrS rS rSr	g)	HmacV1QueryAuthi  z
Generates a presigned request for s3.

Spec from this document:

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
#RESTAuthenticationQueryStringAuth

r  c                     Xl         X l        g rT   )r^   r  )rF   r^   r~  s      r0   rW   HmacV1QueryAuth.__init__  s    &r2   c                 |    [        [        [        R                  " 5       [        U R                  5      -   5      5      $ rT   )r<   rC  r   r  r  s    r0   r  HmacV1QueryAuth._get_date  s&    3tyy{S%77899r2   c                    0 nU R                   R                  US'   X#S'   UR                   H\  nUR                  5       nUS:X  a  UR                  S   US'   M-  UR	                  S5      (       d  US;   d  MK  UR                  U   X5'   M^     [        U5      n[        UR                  5      nUS   (       a
  US    SU 3nUS	   US
   US   XgS   4n[        U5      Ul        g )Nr   rg   r   Expiresr  )r  r     rl   r   r  r  r  )	r^   r   r   r   r  r   r   r,   r   )	rF   r=   r   r  
header_keyr  r  r  r  s	            r0   r	  !HmacV1QueryAuth._inject_signature  s    
'+'7'7'B'B
#$"+;!//J!!#B V#(/(?
9% x((B 3 - ")!4
 *  3:> W[[!Q4 #$A$q)9(:;1qtQqT+;qTB /r2   )r  r^   N)
rI   rJ   rK   rL   r   r  rW   r  r	  rO   rH   r2   r0   r  r    s      O,;  :0r2   r  c                       \ rS rSrSrS rSrg)HmacV1PostAuthi@  z
Generates a presigned post for s3.

Spec from this document:

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
c                    0 nUR                   R                  SS 5      b  UR                   S   n0 n/ nUR                   R                  SS 5      b'  UR                   S   nUR                  SS 5      b  US   nXCS'   U R                  R                  US'   U R                  R                  b@  U R                  R                  US'   UR                  SU R                  R                  05        [        R                  " [        R                  " U5      R                  S5      5      R                  S5      US'   U R                  US   5      US'   X!R                   S'   X1R                   S'   g )	Nrn  ro  rp  r   r  r5   ru  r   )r   r*   r^   r   r   rx   r{   r|   r9   rx  rv   r;   r  )rF   r=   rz  ru  rp  s        r0   rC   HmacV1PostAuth.add_authI  sR   ??7>J__%=>F
??7>J__%=>Fzz,-9#L1
)|#'#3#3#>#> !!--1-=-=-C-CF)*5t7G7G7M7MNO "++JJv%%g.

&/ 	x #..vh/?@{4:014:01r2   rH   Nr  rH   r2   r0   r  r  @  s    ;r2   r  c                       \ rS rSrSrS rSrg)
BearerAuthih  z
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                     U R                   c
  [        5       eSU R                   R                   3nSUR                  ;   a  UR                  S	 X!R                  S'   g )NzBearer r9  )rV   r   r   r   )rF   r=   r  s      r0   rC   BearerAuth.add_authp  sP    ??""$$ 5 567goo-0+6(r2   rH   Nr  rH   r2   r0   r!  r!  h  s    7r2   r!  c                     U  H>  nUS:X  a  [         U   s  $ U[         ;   a  [         U   nU[        ;   a  Us  $ M7  [        US9e   [        U S9e)Nsmithy.api#noAuthsignature_version)AUTH_TYPE_TO_SIGNATURE_VERSIONAUTH_TYPE_MAPSr   r   )
auth_trait	auth_typer'  s      r0   resolve_auth_typer,  z  sa    	++1)<<88 >y I N2(( 3 /KK   +Z
HHr2   c                    U Vs/ s H  o"R                  S5      S   PM     nnU  Vs/ s H  nU[        ;  d  M  UPM     nnU(       a  [        R                  SU5        X-   n[        R                  U5       Vs/ s H  nX#;   d  M
  UPM     nnU H7  nUS:X  a  [        U   s  $ [        R                  U5      nU[        ;   d  M5  Us  $    [        SR                  [        U5      5      S9es  snf s  snf s  snf )N#z/Unsupported auth schemes in preference list: %rnoAuthr8  r&  )r   AUTH_PREF_TO_SIGNATURE_VERSIONrm   rn   r   fromkeysr*   r)  r   ry   rw   )preference_listauth_optionsr+   service_supportedunsupportedcombinedprioritized_schemessig_versions           r0   resolve_auth_scheme_preferencer:    s   =IJ\6c*2.\J &%F77 	%  
 ={	
 2H mmH--F& 	-   &X1&99488@.( & +))F+<$=> 5 Ks   C-C2C2:	C7C7)v2v3v3httpsrR  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-querys3v4z
s3v4-queryr@  v4ar>  none)zaws.auth#sigv4zaws.auth#sigv4azsmithy.api#httpBearerAuthr%  r.  r/  )Lr{   rD  rA  r   rs   r9   r  r   collections.abcr   email.utilsr   hashlibr   r   operatorr   botocore.compatr	   r
   r   r   r   r   r   r   r   r   r   botocore.exceptionsr   r   r   r   botocore.utilsr   r   r   	getLoggerrI   rm   r  r  r   r2  r   r   r   r1   r>   r@   rQ   rZ   r   r   rJ  ra  rl  r}  r  r  r  r  r  r  r!  r,  r:  r)  botocore.crt.authr?  rz   r(  r   r   r1  )auth_schemer9  s   00r0   <module>rN     s<           # "         
		8	$ G  
"  & %I "&
. .%* %:
 :z<
 <8JI
 JIZ3) 3l8K 8**; *;Ze  e PN7Y N7b ~  0-;i -;`f7 f7R20j 20j%;Z %;P7 7$
IB 

%(!,!2 4,-&*		
 !)	"  %C$H$H$J"$J  c2+$J"  "s   %!G