
    "hjǀ                        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 ddlm	Z	m
Z
mZ ddl d dlZddlmZ d	Zd
ZdZddgZ ej(                  e      ZefdZ G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zd Zd Z e ddg      Z! G d de      Z" G d d e"      Z# G d! d"e      Z$ G d# d$e$      Z%y)%    N)datetime   )utils)ClientError)urlquoteto_bytesis_py2)*)StaticCredentialsProviderv1v2v4content-typecontent-md5c                    |t         k(  rLt        j                  dj                  |              t	        | j                         |j                               S |t        k(  rLt        j                  dj                  |              t        | j                         |j                               S t        j                  dj                  |              t        | j                         |j                               S )Nz;Init Auth V2: access_key_id: {0}, access_key_secret: ******z;Init Auth V4: access_key_id: {0}, access_key_secret: ******z;Init Auth v1: access_key_id: {0}, access_key_secret: ******)	AUTH_VERSION_2loggerdebugformatAuthV2stripAUTH_VERSION_4AuthV4Auth)access_key_idaccess_key_secretauth_versions      G/root/.hermes/SkillClaw/.venv/lib/python3.12/site-packages/oss2/auth.py	make_authr      s    ~%RYYZghim))+->-D-D-FGG~%RYYZghim))+->-D-D-FGGRYYZghiM'')+<+B+B+DEE    c                   "    e Zd ZdZd Zd Zd Zy)AuthBaseuP   用于保存用户AccessKeyId、AccessKeySecret，以及计算签名的对象。c                     || _         y N)credentials_provider)selfr%   s     r   __init__zAuthBase.__init__$   s
    $8!r    c                    | j                   j                         }|j                         r|j                         |d<   t        t	        j                               |z   }d|d|}g }	|rE|j                         }
|
D ]0  \  }}|dk7  s|dk7  s|dk7  s|dk7  s|	j                  ||f       2 |	j                  d        d	}|	D ]  \  }}||d
|dz  } |r|ni }t        |      dz   |z   |z   }t        j                  dj                  |             t        j                  t        |j                               t        |      t         j"                        }t%        j&                  |j)                               }|j+                         |d<   t        |      |d<   ||d<   |dz   dj-                  d |j                         D              z   S )Nsecurity-token/OSSAccessKeyId	SignatureExpiresSecurityTokenc                     | d   S Nr    es    r   <lambda>z)AuthBase._sign_rtmp_url.<locals>.<lambda>7   s
    ! r    key :
z(Sign Rtmp url: string to be signed = {0}?&c              3   :   K   | ]  \  }}t        ||        y wr$   _param_to_quoted_query.0kvs      r   	<genexpr>z*AuthBase._sign_rtmp_url.<locals>.<genexpr>H   s     #WTQ$:1a$@#W   )r%   get_credentialsget_security_tokeninttimeitemsappendsortstrr   r   r   hmacnewr   get_access_key_secrethashlibsha1r   b64encode_as_stringdigestget_access_key_idjoin)r&   urlbucket_namechannel_nameexpiresparamscredentialsexpiration_timecanonicalized_resourcecanonicalized_paramsrI   rA   rB   canon_params_strpstring_to_signh	signatures                     r   _sign_rtmp_urlzAuthBase._sign_rtmp_url'   s   //??A))+'2'E'E'GF#$diik*W4-8,!G!LLNE 81((Q+-=!y.UVZiUi(//A78 	!!n!5( 	3DAqQ 22	3 F"_-47GGJ``?FF~VW HHXk??ABH^D\^e^j^jk--ahhj9	);;=
?+)"+Sy388#WQWWY#WWWWr    c                      yNr7   r1   r&   s    r   r   zAuthBase.auth_versionJ       r    N)__name__
__module____qualname____doc__r'   rd   r   r1   r    r   r"   r"   "   s    Z9!XFr    r"   c                   f    e Zd ZdZ eg d      Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)ProviderAuthu]   签名版本1
    默认构造函数同父类AuthBase，需要传递credentials_provider
    )Xzresponse-content-typezresponse-content-languagezresponse-cache-controlloggingzresponse-content-encodingacluploadIduploads
partNumbergrouplinkdeletewebsitelocation
objectInfo
objectMetazresponse-expireszresponse-content-dispositioncors	lifecyclerestoreqosrefererstat
bucketInforJ   positionr)   livecompstatusvod	startTimeendTimezx-oss-processsymlinkcallbackcallback-vartagging
encryptionversions
versioning	versionIdpolicyrequestPaymentzx-oss-traffic-limitqosInfo
asyncFetchzx-oss-request-payer
sequential	inventoryinventoryIdzcontinuation-tokenr   r   wormwormId
wormExtendreplicationreplicationLocationreplicationProgresstransferAccelerationcname	metaQueryzx-oss-ac-source-ipzx-oss-ac-subnet-maskzx-oss-ac-vpc-idzx-oss-ac-forward-allowresourceGroupstyle	styleNamezx-oss-async-process
regionListzx-oss-write-get-object-responsebucketArchiveDirectReadhttpsConfigredundancyTransitionzx-oss-target-redundancy-typez"x-oss-redundancy-transition-taskidaccessPointaccessPointPolicypublicAccessBlockzx-oss-access-point-namerequesterQosInfoqosRequesterresourcePoolInforesourcePoolresourcePoolBucketsc                 ^   | j                   j                         }|j                         r!|j                         |j                  t        <   t        j                         |j                  d<   | j                  ||||      }dj                  |j                         |      |j                  d<   y )NdatezOSS {0}:{1}authorization)
r%   rE   rF   headersOSS_SECURITY_TOKENr   	http_date_ProviderAuth__make_signaturer   rT   )r&   reqrW   r6   r[   rc   s         r   _sign_requestzProviderAuth._sign_requeste   s    //??A))+.9.L.L.NCKK*+#oo/F))#{CM	'4';';K<Y<Y<[]f'gO$r    c                 0   | j                   j                         }|j                         r|j                         |j                  d<   t	        t        j
                               |z   }t        |      |j                  d<   | j                  ||||      }|j                         |j                  d<   t        |      |j                  d<   ||j                  d<   |j                  dz   dj                  d |j                  j                         D              z   S )	Nr)   r   r+   r-   r,   r:   r;   c              3   :   K   | ]  \  }}t        ||        y wr$   r=   r?   s      r   rC   z)ProviderAuth._sign_url.<locals>.<genexpr>}        'dA(>q!(D'drD   )r%   rE   rF   rZ   rG   rH   rL   r   r   rT   rV   rU   rI   )r&   r   rW   r6   rY   r[   r\   rc   s           r   	_sign_urlzProviderAuth._sign_urlo   s    //??A))++6+I+I+KCJJ'(diik*W4!/2F))#{CM	'2'D'D'F

#$ #O 4

9"+

;ww}sxx'dQTQ[Q[QaQaQc'ddddr    c                 t   t         r| j                  |||      }n| j                  |||      }t        j	                  dj                  |             t        j                  t        |j                               t        |      t        j                        }t        j                  |j                               S N)Make signature: string to be signed = {0})r	   !_ProviderAuth__get_string_to_sign _ProviderAuth__get_bytes_to_signr   r   r   rM   rN   r   rO   rP   rQ   r   rR   rS   )r&   r   rW   r6   r[   ra   rb   s          r   __make_signaturezProviderAuth.__make_signature   s    !66sKMN!55c;LN@GGWXHHXk??ABH^D\^e^j^jk((44r    c                 t   | j                  |||      }| j                  |      }|j                  j                  dd      }|j                  j                  dd      }|j                  j                  dd      xs |j                  j                  dd      }dj	                  |j
                  |||||z   g      S )Nr   r7   r   
x-oss-dater   r9   )"_ProviderAuth__get_resource_string!_ProviderAuth__get_headers_stringr   getrU   method)	r&   r   rW   r6   resource_stringheaders_stringcontent_md5content_typer   s	            r   __get_string_to_signz!ProviderAuth.__get_string_to_sign   s    44S+sK2237kkoomR8{{~r:{{|R0OCKKOOFB4Oyy#**%&(?:	< = 	=r    c                    |j                   }g }|j                         D ]:  \  }}|j                         }|j                  d      s(|j	                  ||f       < |j                  d        |rdj                  d |D              dz   S y)Nx-oss-c                     | d   S r0   r1   xs    r   r4   z3ProviderAuth.__get_headers_string.<locals>.<lambda>   
    1 r    r5   r9   c              3   2   K   | ]  \  }}|d z   |z     yw)r8   Nr1   r?   s      r   rC   z4ProviderAuth.__get_headers_string.<locals>.<genexpr>   s     CTQQWq[Cs   r7   r   rI   lower
startswithrJ   rK   rU   r&   r   r   canon_headersrA   rB   	lower_keys          r   __get_headers_stringz!ProviderAuth.__get_headers_string   s    ++MMO 	5DAq	I##H-$$i^4	5
 	~.99C]CCdJJr    c                     |sd| j                  |j                        z   S dj                  ||| j                  |j                              S )Nr*   z/{0}/{1}{2})%_ProviderAuth__get_subresource_stringrZ   r   r&   r   rW   r6   s       r   __get_resource_stringz"ProviderAuth.__get_resource_string   sF    66szzBBB ''S$:W:WX[XbXb:cddr    c                      |syg }|j                         D ]'  \  }}| j                  v s|j                  ||f       ) |j                  d        |rddj	                   fd|D              z   S y)Nr7   c                     | d   S r0   r1   r2   s    r   r4   z7ProviderAuth.__get_subresource_string.<locals>.<lambda>   s
    ad r    r5   r:   r;   c              3   H   K   | ]  \  }}j                  ||        y wr$   )_ProviderAuth__param_to_queryr@   rA   rB   r&   s      r   rC   z8ProviderAuth.__get_subresource_string.<locals>.<genexpr>   s"     !]$!Q$"7"71"=!]   ")rI   _subresource_key_setrJ   rK   rU   )r&   rZ   subresource_paramsr6   values   `    r   __get_subresource_stringz%ProviderAuth.__get_subresource_string   s|     ,,. 	8JCd///"))3,7	8 	N3!]J\!]]]]r    c                     |r|dz   |z   S |S N=r1   r&   rA   rB   s      r   __param_to_queryzProviderAuth.__param_to_query       s7Q;Hr    c                 (   | j                  |||      j                  d      }| j                  |      }|j                  j	                  dd      j                  d      }|j                  j	                  dd      j                  d      }|j                  j	                  dd      j                  d      xs+ |j                  j	                  dd      j                  d      }dj                  |j                  j                  d      |||||z   g      S )Nutf-8r   r7   r   r   r      
)r   encode _ProviderAuth__get_headers_bytesr   r   rU   r   )	r&   r   rW   r6   resource_bytesheaders_bytesr   r   r   s	            r   __get_bytes_to_signz ProviderAuth.__get_bytes_to_sign   s    33CcJQQRYZ005kkoomR8??H{{~r:AA'J{{|R077@oCKKOOTZ\^D_DfDfgnDozz3::,,W5%&'.8	: ; 	;r    c                    |j                   }g }|j                         D ]:  \  }}|j                         }|j                  d      s(|j	                  ||f       < |j                  d        |rdj                  d |D              dz   S y)Nr   c                     | d   S r0   r1   r   s    r   r4   z2ProviderAuth.__get_headers_bytes.<locals>.<lambda>   r   r    r5   r   c              3   V   K   | ]!  \  }}t        |      d z   t        |      z    # yw)   :Nr   r?   s      r   rC   z3ProviderAuth.__get_headers_bytes.<locals>.<genexpr>   s&     Y41ahqkD08A;>Ys   ')r    r   r   s          r   __get_headers_bytesz ProviderAuth.__get_headers_bytes   s    ++MMO 	5DAq	I##H-$$i^4	5
 	~.::Y=YY\aaar    c                     t         S r$   )AUTH_VERSION_1rg   s    r   r   zProviderAuth.auth_version       r    N)ri   rj   rk   rl   	frozensetr   r   r   r   r   r   r   r   r   r   r   r   r1   r    r   rn   rn   M   sT     %	h(he 	5=e ;r    rn   c                   "     e Zd ZdZ fdZ xZS )r   u   签名版本1
    c                 |    t        |j                         |j                               }t        t        |   |       y r$   )r   r   superr   r'   r&   r   r   r%   	__class__s       r   r'   zAuth.__init__   s3    89L9L9NPaPgPgPijdD"#78r    ri   rj   rk   rl   r'   __classcell__r  s   @r   r   r      s    9 9r    r   c                   (    e Zd ZdZd Zd Zd Zd Zy)AnonymousAuthu   用于匿名访问。

    .. note::
        匿名用户只能读取public-read的Bucket，或只能读取、写入public-read-write的Bucket。
        不能进行Service、Bucket相关的操作，也不能罗列文件等。
    c                      y r$   r1   r   s       r   r   zAnonymousAuth._sign_request   s    r    c                     |j                   dz   dj                  d |j                  j                         D              z   S )Nr:   r;   c              3   :   K   | ]  \  }}t        ||        y wr$   r=   r?   s      r   rC   z*AnonymousAuth._sign_url.<locals>.<genexpr>   r   rD   )rV   rU   rZ   rI   r&   r   rW   r6   rY   s        r   r   zAnonymousAuth._sign_url   s4    ww}sxx'dQTQ[Q[QaQaQc'ddddr    c                 Z    |dz   dj                  d |j                         D              z   S )Nr:   r;   c              3   :   K   | ]  \  }}t        ||        y wr$   r=   r?   s      r   rC   z/AnonymousAuth._sign_rtmp_url.<locals>.<genexpr>   s     #\TQ$:1a$@#\rD   )rU   rI   r&   rV   rW   rX   rY   rZ   s         r   rd   zAnonymousAuth._sign_rtmp_url   s&    Sy388#\V\\^#\\\\r    c                      yrf   r1   rg   s    r   r   zAnonymousAuth.auth_version   rh   r    N)ri   rj   rk   rl   r   r   rd   r   r1   r    r   r  r     s    e]r    r  c                   2    e Zd ZdZefdZd Zd Zd Zd Z	y)StsAuthuj  用于STS临时凭证访问。可以通过官方STS客户端获得临时密钥（AccessKeyId、AccessKeySecret）以及临时安全令牌（SecurityToken）。

    注意到临时凭证会在一段时间后过期，在此之前需要重新获取临时凭证，并更新 :class:`Bucket <oss2.Bucket>` 的 `auth` 成员变量为新
    的 `StsAuth` 实例。

    :param str access_key_id: 临时AccessKeyId
    :param str access_key_secret: 临时AccessKeySecret
    :param str security_token: 临时安全令牌(SecurityToken)
    :param str auth_version: 需要生成auth的版本，默认为AUTH_VERSION_1(v1)
    c                     t         j                  dj                  |             t        |||      }|t        k(  rt        |      | _        y |t        k(  rt        |      | _        y t        |      | _        y )NzSInit StsAuth: access_key_id: {0}, access_key_secret: ******, security_token: ******)
r   r   r   r   r   ProviderAuthV2_StsAuth__authr   ProviderAuthV4rn   )r&   r   r   security_tokenr   r%   s         r   r'   zStsAuth.__init__  si    jqqr  A  	B8HY[ij>)()=>DK^+()=>DK&';<DKr    c                 >    | j                   j                  |||       y r$   )r  r   r   s       r   r   zStsAuth._sign_request  s    !!#{C8r    c                 >    | j                   j                  ||||      S r$   )r  r   r  s        r   r   zStsAuth._sign_url  s    {{$$S+sGDDr    c                 @    | j                   j                  |||||      S r$   )r  rd   r  s         r   rd   zStsAuth._sign_rtmp_url  s     {{))#{L'SYZZr    c                 6    | j                   j                         S r$   )r  r   rg   s    r   r   zStsAuth.auth_version  s    {{''))r    N)
ri   rj   rk   rl   r   r'   r   r   rd   r   r1   r    r   r  r     s)    	 We 	=9E[*r    r  c                 V    |rt        | d      dz   t        |d      z   S t        | d      S )Nr7   r   )r   )rA   rB   s     r   r>   r>   !  s-    2$x2662r    c                     t        |       } d}| D ]e  }t        |t              rt        |      }n|}|dk\  r|dk  s|dk\  r|dk  s|dk\  r|dk  s|dv r||z  }I|d	j	                  t        |            z  }g |S )
Nr7   AZaz09_-~.%{0:02X}r   
isinstancerG   chrr   ord)raw_textresbcs       r   v2_uri_encoder5  (  s    !H
C 
-aAAAHcqCxAHSQ#X!/C*C1HC:$$SV,,C
- Jr    rangezif-modified-sincec                   \    e Zd ZdZddZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zy)r  u   签名版本2，默认构造函数同父类AuthBase，需要传递credentials_provider
    与版本1的区别在：
    1. 使用SHA256算法，具有更高的安全性
    2. 参数计算包含所有的HTTP查询参数
    Nc                    | j                   j                         }|j                         r!|j                         |j                  t        <   |t
        }| j                  ||      }t        j                         |j                  d<   | j                  |||||      }|r>dj                  |j                         dj                  |      |      |j                  d<   ydj                  |j                         |      |j                  d<   y)B  把authorization放入req的header里面

        :param req: authorization信息将会加入到这个请求的header里面
        :type req: oss2.http.Request

        :param bucket_name: bucket名称
        :param key: OSS文件名
        :param in_additional_headers: 加入签名计算的额外header列表
        Nr   z8OSS2 AccessKeyId:{0},AdditionalHeaders:{1},Signature:{2};r   z"OSS2 AccessKeyId:{0},Signature:{1})r%   rE   rF   r   r   _DEFAULT_ADDITIONAL_HEADERS'_ProviderAuthV2__get_additional_headersr   r   _ProviderAuthV2__make_signaturer   rT   rU   )r&   r   rW   r6   in_additional_headersr[   additional_headersrc   s           r   r   zProviderAuthV2._sign_requestE  s     //??A))+.9.L.L.NCKK*+ ($?!!::3@UV#oo/F))#{CASU`a	+e557BT9UW`a KK( ,P+V+VWbWtWtWv  yB  ,CCKK(r    c                    | j                   j                         }|j                         r|j                         |j                  d<   |
t	               }| j                  ||      }t        t        j                               |z   }t        |      |j                  d<   d|j                  d<   t        |      |j                  d<   |j                         |j                  d<   |rdj                  |      |j                  d<   | j                  |||||      }	|	|j                  d	<   |j                  d
z   dj                  d |j                  j                         D              z   S )q  返回一个签过名的URL

        :param req: 需要签名的请求
        :type req: oss2.http.Request

        :param bucket_name: bucket名称
        :param key: OSS文件名
        :param int expires: 返回的url将在`expires`秒后过期.
        :param in_additional_headers: 加入签名计算的额外header列表

        :return: a signed URL
        r)   r   OSS2x-oss-signature-versionx-oss-expireszx-oss-access-key-idr:  x-oss-additional-headersx-oss-signaturer:   r;   c              3   :   K   | ]  \  }}t        ||        y wr$   r=   r?   s      r   rC   z+ProviderAuthV2._sign_url.<locals>.<genexpr>  r   rD   )r%   rE   rF   rZ   setr<  rG   rH   rL   r   rT   rU   r=  rV   rI   )
r&   r   rW   r6   rY   r>  r[   r?  r\   rc   s
             r   r   zProviderAuthV2._sign_urlb  s7    //??A))++6+I+I+KCJJ'( ($'E!!::3@UVdiik*W4!/2F06

,-&)/&:

?#,7,I,I,K

()58XX>P5QCJJ12))#{CASU`a	(1

$%ww}sxx'dQTQ[Q[QaQaQc'ddddr    c                 x   t         r| j                  ||||      }n| j                  ||||      }t        j	                  dj                  |             t        j                  t        |j                               t        |      t        j                        }t        j                  |j                               S r   )r	   #_ProviderAuthV2__get_string_to_sign"_ProviderAuthV2__get_bytes_to_signr   r   r   rM   rN   r   rO   rP   sha256r   rR   rS   )r&   r   rW   r6   r?  r[   ra   rb   s           r   r   zProviderAuthV2.__make_signature  s    !66sKN`aN!55c;M_`N@GGWXHHXk??ABH^D\^e^l^lm((44r    c                     t        d |D              }t        d |j                  j                         D              }||z  S )Nc              3   <   K   | ]  }|j                           y wr$   r   r@   rb   s     r   rC   z:ProviderAuthV2.__get_additional_headers.<locals>.<genexpr>        Jq J   c              3   <   K   | ]  }|j                           y wr$   rO  r@   rA   s     r   rC   z:ProviderAuthV2.__get_additional_headers.<locals>.<genexpr>       C1QWWYCrR  rH  r   keysr&   r   r>  r?  keys_in_headers        r   __get_additional_headersz'ProviderAuthV2.__get_additional_headers  >     ! J4I JJC0@0@0BCC!N22r    c                    |j                   }|j                  j                  dd      }|j                  j                  dd      }|j                  j                  dd      }| j                  ||      }	dj	                  t        |            }
| j                  |||      }|dz   |z   dz   |z   dz   |z   dz   |	z   |
z   dz   |z   S )Nr   r7   r   r   r:  r9   )r   r   r   ._ProviderAuthV2__get_canonicalized_oss_headersrU   sorted$_ProviderAuthV2__get_resource_stringr&   r   rW   r6   additional_header_listverbr   r   r   canonicalized_oss_headersr?  r]   s               r   r   z#ProviderAuthV2.__get_string_to_sign  s    zzkkoomR8{{~r:{{vr*$($H$HNd$e! XXf-C&DE!%!;!;Cc!Rd{    &	&
 
 "&& ## 	#r    c                     |rt        d|z   dz   |z         }nt        d      }t        j                  dj                  ||             || j	                  |      z   S )Nr*   zencoded_uri={0} key={1})r5  r   infor   -_ProviderAuthV2__get_canonalized_query_string)r&   r   rW   r6   encoded_uris        r   r   z$ProviderAuthV2.__get_resource_string  sX    'k(9C(?#(EFK',K-44[#FGT@@EEEr    c                      i }|j                   j                         D ]  \  }}t        |      |t        |      <    |syt        |j                         d       }ddj	                   fd|D              z   S )Nr7   c                     | d   S r0   r1   r2   s    r   r4   z?ProviderAuthV2.__get_canonalized_query_string.<locals>.<lambda>  
    QqT r    r5   r:   r;   c              3   H   K   | ]  \  }}j                  ||        y wr$   )_ProviderAuthV2__param_to_queryr   s      r   rC   z@ProviderAuthV2.__get_canonalized_query_string.<locals>.<genexpr>  s"     Tdad33Aq9Tr   )rZ   rI   r5  r^  rU   r&   r   encoded_paramsparamr   sorted_paramss   `     r   __get_canonalized_query_stringz-ProviderAuthV2.__get_canonalized_query_string  su    JJ,,. 	HLE53@3GN=/0	H ~335>JSXXTmTTTTr    c                     |r|dz   |z   S |S r   r1   r   s      r   r   zProviderAuthV2.__param_to_query  r   r    c                    g }|j                   j                         D ]>  \  }}|j                         }|j                  d      s||v s,|j	                  ||f       @ |j                  d        dj                  d |D              S )s   
        :param additional_headers: 小写的headers列表, 并且这些headers都不以'x-oss-'为前缀.
        r   c                     | d   S r0   r1   r   s    r   r4   z@ProviderAuthV2.__get_canonicalized_oss_headers.<locals>.<lambda>  r   r    r5   r7   c              3   >   K   | ]  }|d    dz   |d   z   dz     ywr   r8   r   r9   Nr1   r@   rB   s     r   rC   zAProviderAuthV2.__get_canonicalized_oss_headers.<locals>.<genexpr>  &     GAqtczAaD(4/G   r   r&   r   r?  r   rA   rB   r   s          r   __get_canonicalized_oss_headersz.ProviderAuthV2.__get_canonicalized_oss_headers  s     KK%%' 	5DAq	I##H->P1P$$i^4	5
 	~.wwGGGGr    c                 :   |j                   j                  d      }|j                  j                  dd      j                  d      }|j                  j                  dd      j                  d      }|j                  j                  dd      j                  d      }| j	                  ||      }	dj                  t        |            j                  d      }
| j                  |||      j                  d      }|dz   |z   dz   |z   dz   |z   dz   |	z   |
z   dz   |z   S )Nr   r   r7   r   r   r:  r   )r   r   r   r   4_ProviderAuthV2__get_canonicalized_oss_headers_bytesrU   r^  r_  r`  s               r   r   z"ProviderAuthV2.__get_bytes_to_sign  s0   zz  )kkoomR8??H{{~r:AA'J{{vr*11':$($N$NsTj$k! XXf-C&DELLWU!%!;!;Cc!R!Y!YZa!be|  !   &	&
 
 "'' ## 	#r    c                    g }|j                   j                         D ]>  \  }}|j                         }|j                  d      s||v s,|j	                  ||f       @ |j                  d        dj                  d |D              S )rt  r   c                     | d   S r0   r1   r   s    r   r4   zFProviderAuthV2.__get_canonicalized_oss_headers_bytes.<locals>.<lambda>  r   r    r5   r    c              3   b   K   | ]'  }t        |d          dz   t        |d         z   dz    ) ywr   r   r   r   Nr   rx  s     r   rC   zGProviderAuthV2.__get_canonicalized_oss_headers_bytes.<locals>.<genexpr>  /     ^11-1>F^   -/r   r{  s          r   %__get_canonicalized_oss_headers_bytesz4ProviderAuthV2.__get_canonicalized_oss_headers_bytes  s     KK%%' 	5DAq	I##H->P1P$$i^4	5
 	~.xx^P]^^^r    c                     t         S r$   )r   rg   s    r   r   zProviderAuthV2.auth_version  r   r    r$   )ri   rj   rk   rl   r   r   r=  r<  rJ  r_  rf  rl  r]  rK  r~  r   r1   r    r   r  r  ?  sJ    
C:$eL	53#$F	UH#$_r    r  c                   "     e Zd ZdZ fdZ xZS )r   u   签名版本2，与版本1的区别在：
    1. 使用SHA256算法，具有更高的安全性
    2. 参数计算包含所有的HTTP查询参数
    c                 |    t        |j                         |j                               }t        t        |   |       y r$   )r   r   r  r   r'   r  s       r   r'   zAuthV2.__init__   3    89L9L9NPaPgPgPijfd$%9:r    r  r	  s   @r   r   r         ; ;r    r   c                       e Zd ZdZddZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r  uO  签名版本4，默认构造函数同父类AuthBase，需要传递credentials_provider
    与版本2的区别在：
    1. v4 签名规则引入了scope概念，SignToString(待签名串) 和 SigningKey （签名密钥）都需要包含 region信息
    2. 资源路径里的 / 不做转义。   query里的 / 需要转义为 %2F
    Nc                 ~   |j                   t        d      | j                  j                         }|j	                         r!|j	                         |j
                  t        <   t        j                         }|j                  d      }|dd }||j
                  d<   d|j
                  d<   | j                  |      }	|j                         dz   | j                  ||      z   }
| j                  ||||	||      }d	j                  |
|      }|	r#|d
j                  dj                  |	            z   }||j
                  d<   y)r9  Nz5The region should not be None in signature version 4.%Y%m%dT%H%M%SZ   r   UNSIGNED-PAYLOADx-oss-content-sha256r*   z.OSS4-HMAC-SHA256 Credential={0}, Signature={1}z, AdditionalHeaders={0}r:  r   )regionr   r%   rE   rF   r   r   r   utcnowstrftime._ProviderAuthV4__get_additional_signed_headersrT   _ProviderAuthV4__get_scope_ProviderAuthV4__make_signaturer   rU   )r&   r   rW   r6   r>  r[   now_datetimenow_datetime_iso8601now_dateadditional_signed_headers
credentialrc   r   s                r   r   zProviderAuthV4._sign_request  s3    ::UVV//??A))+.9.L.L.NCKK*+(+445EF'+$8L!.@*+$($H$HI^$_! 224s:T=M=MhX[=\\
))#{CAZ\gi}~	HOOPZ\ef$),E,L,LSXXVoMp,qqM'4O$r    c                    | j                   j                         }|j                         r|j                         |j                  d<   |
t	               }| j                  ||      }| j                  |      }t        j                         }|j                  d      }	|	dd }
|	|j                  d<   t        |      |j                  d<   d|j                  d<   |j                         d	z   | j                  |
|      z   |j                  d
<   |r| j                  |      |j                  d<   | j                  ||||||	      }||j                  d<   |j                  dz   dj!                  d |j                  j#                         D              z   S )rA  zx-oss-security-tokenNr  r  r   rD  zOSS4-HMAC-SHA256rC  r*   zx-oss-credentialrE  rF  r:   r;   c              3   :   K   | ]  \  }}t        ||        y wr$   r=   r?   s      r   rC   z+ProviderAuthV4._sign_url.<locals>.<genexpr>P  r   rD   )r%   rE   rF   rZ   rH  '_ProviderAuthV4__get_additional_headersr  r   r  r  rL   rT   r  8_ProviderAuthV4__get_canonical_additional_signed_headersr  rV   rU   rI   )r&   r   rW   r6   rY   r>  r[   r?  r  r  r  rc   s               r   r   zProviderAuthV4._sign_url,  sw    //??A))+1<1O1O1QCJJ-. ($'E!!::3@UV!AABTU(+445EF'+#7

< &)'l

?#0B

,-)4)F)F)H3)NQUQaQabjloQp)p

%&595c5cdv5wCJJ12))#{CASU`bvw	(1

$%ww}sxx'dQTQ[Q[QaQaQc'ddddr    c                    t         r(| j                  ||||      }| j                  |||      }n'| j                  ||||      }| j	                  |||      }| j                  |||      }	t        j                  |	t        |      t        j                        j                         }
t        j                  dj                  |             t        j                  dj                  |             |
S )Nz'Make signature: canonical_request = {0}r   )r	   &_ProviderAuthV4__get_canonical_request#_ProviderAuthV4__get_string_to_sign,_ProviderAuthV4__get_canonical_request_bytes)_ProviderAuthV4__get_string_to_sign_bytes _ProviderAuthV4__get_signing_keyrM   rN   r   rP   rL  	hexdigestr   r   r   )r&   r   rW   r6   r  r[   	date_timecanonical_requestra   signing_keyrc   s              r   r   zProviderAuthV4.__make_signatureR  s     $ < <S+sTm n!66s<MyYN $ B B3UXZs t!<<SBSU^_N,,S+yIHH[(>*BGNNS]]_	 	>EEFWXY@GGWXr    c                     t        d |D              }t        d |j                  j                         D              }||z  S )Nc              3   <   K   | ]  }|j                           y wr$   rO  rP  s     r   rC   z:ProviderAuthV4.__get_additional_headers.<locals>.<genexpr>d  rQ  rR  c              3   <   K   | ]  }|j                           y wr$   rO  rT  s     r   rC   z:ProviderAuthV4.__get_additional_headers.<locals>.<genexpr>e  rU  rR  rV  rX  s        r   rZ  z'ProviderAuthV4.__get_additional_headersa  r[  r    c                     |y g }|D ]K  }|j                         }|j                  d      r%t        j                  |      r;|j	                  |       M |j                  d        |S )Nr   c                     | d   S r0   r1   r   s    r   r4   z@ProviderAuthV4.__get_additional_signed_headers.<locals>.<lambda>q  s
    1Q4 r    r5   )r   r   DEFAULT_SIGNED_HEADERS__contains__rJ   rK   )r&   r>  r   rA   r6   s        r   __get_additional_signed_headersz.ProviderAuthV4.__get_additional_signed_headersi  sf     (& 	$A'')CNN8,0F0S0STW0Xs#	$ 	(r    c                 F    |rd|z   dz   |z   }nd}| j                  |d      S )Nr*   T)_ProviderAuthV4__v4_uri_encode)r&   rW   r6   rg  s       r   __get_canonical_uriz"ProviderAuthV4.__get_canonical_urit  s1    +c1C7KK##K66r    c                     |r|dz   |z   S |S r   r1   r   s      r   r   zProviderAuthV4.__param_to_query{  r   r    c                     i }|j                   j                         D ]*  \  }} j                  |d      | j                  |d      <   , |syt        |j                         d       }dj	                   fd|D              S )NFr7   c                     | d   S r0   r1   r2   s    r   r4   z6ProviderAuthV4.__get_canonical_query.<locals>.<lambda>  rj  r    r5   r;   c              3   H   K   | ]  \  }}j                  ||        y wr$   )_ProviderAuthV4__param_to_queryr   s      r   rC   z7ProviderAuthV4.__get_canonical_query.<locals>.<genexpr>  s"     N1--a3Nr   )rZ   rI   r  r^  rU   rm  s   `     r   __get_canonical_queryz$ProviderAuthV4.__get_canonical_query  s    JJ,,. 	dLE5AEAUAUV[]bAcN4//u=>	d ~335>JxxNNNNr    c                     |<|j                  d      ryt        j                  |      ry||j                  |      ryy)Nr   TF)r   r  r  )r&   r6   r?  s      r   __is_sign_headerzProviderAuthV4.__is_sign_header  sB    ?~~h'%2237!-2D2Q2QRU2Vr    c                    g }|j                   j                         D ];  \  }}|j                         }| j                  ||      s)|j	                  ||f       = |j                  d        dj                  d |D              S )Nc                     | d   S r0   r1   r   s    r   r4   z8ProviderAuthV4.__get_canonical_headers.<locals>.<lambda>  r   r    r5   r7   c              3   >   K   | ]  }|d    dz   |d   z   dz     ywrw  r1   rx  s     r   rC   z9ProviderAuthV4.__get_canonical_headers.<locals>.<genexpr>  ry  rz  r   rI   r   _ProviderAuthV4__is_sign_headerrJ   rK   rU   r{  s          r   __get_canonical_headersz&ProviderAuthV4.__get_canonical_headers  s}    KK%%' 	5DAq	I$$Y0BC$$i^4	5 	~.wwGGGGr    c                    g }|j                   j                         D ];  \  }}|j                         }| j                  ||      s)|j	                  ||f       = |j                  d        dj                  d |D              S )Nc                     | d   S r0   r1   r   s    r   r4   z>ProviderAuthV4.__get_canonical_headers_bytes.<locals>.<lambda>  r   r    r5   r    c              3   b   K   | ]'  }t        |d          dz   t        |d         z   dz    ) ywr  r   rx  s     r   rC   z?ProviderAuthV4.__get_canonical_headers_bytes.<locals>.<genexpr>  r  r  r  r{  s          r   __get_canonical_headers_bytesz,ProviderAuthV4.__get_canonical_headers_bytes  s~    KK%%' 	5DAq	I$$Y0BC$$i^4	5 	~.xx^P]^^^r    c                 <    |ydj                  t        |            S )Nr7   r:  )rU   r^  )r&   r?  s     r   )__get_canonical_additional_signed_headersz8ProviderAuthV4.__get_canonical_additional_signed_headers  s     %xx1233r    c                 r    |j                   j                  d      r|j                   j                  dd      S y)Nr  r7   r  )r   r  r   r&   r   s     r   __get_canonical_hash_payloadz+ProviderAuthV4.__get_canonical_hash_payload  s.    ;;##$:;;;??#92>>!r    c                 >    |j                   xs |j                  xs dS rf   )cloudbox_idr  r  s     r   __get_regionzProviderAuthV4.__get_region  s    2#**22r    c                     |j                   S r$   )productr  s     r   __get_productzProviderAuthV4.__get_product  s    {{r    c                 `    |dz   | j                  |      z   dz   | j                  |      z   dz   S )Nr*   z/aliyun_v4_request)_ProviderAuthV4__get_region_ProviderAuthV4__get_product)r&   r   r   s      r   __get_scopezProviderAuthV4.__get_scope  s7    czD--c22S84;M;Mc;RRUiiir    c                     |j                   dz   | j                  ||      z   dz   | j                  |      z   dz   | j                  ||      z   dz   | j	                  |      z   dz   | j                  |      z   S )Nr9   )r   "_ProviderAuthV4__get_canonical_uri$_ProviderAuthV4__get_canonical_query&_ProviderAuthV4__get_canonical_headersr  +_ProviderAuthV4__get_canonical_hash_payloadr&   r   rW   r6   r  s        r   __get_canonical_requestz&ProviderAuthV4.__get_canonical_request  s    zzD ''S9:<@A))#./156 ++C1JKL OSS ==>WX	Y \`	`
 0056 	6r    c                     |d d }d|z   dz   | j                  ||      z   dz   t        j                  t        |            j	                         z   S Nr  zOSS4-HMAC-SHA256
r9   )r  rP   rL  r   r  )r&   r   r  r  r   s        r   r   z#ProviderAuthV4.__get_string_to_sign  sf    !}( c*+-12 ~~h'89:DDFG 	Gr    c                 J   t        |j                        dz   t        | j                  ||            z   dz   t        | j                  |            z   dz   | j	                  ||      z   dz   t        | j                  |            z   dz   t        | j                  |            z   S )Nr   )r   r   r  r  ,_ProviderAuthV4__get_canonical_headers_bytesr  r  r  s        r   __get_canonical_request_bytesz,ProviderAuthV4.__get_canonical_request_bytes  s    

#e+00cBCDFKL223789;@A 11#7PQR UZZ FFG`ab	c fk	k
 99#>?@ 	@r    c                     |d d }d|z   dz   | j                  ||      z   dz   t        j                  |      j                         z   S r  )r  rP   rL  r  )r&   r   canonical_request_bytesr  r   s        r   __get_string_to_sign_bytesz)ProviderAuthV4.__get_string_to_sign_bytes  sa    !}( c*+-12 ~~56@@BC 	Cr    c                 d   |d d }d|j                         z   }t        j                  t        |      t        |      t        j
                        }t        j                  |j                         t        | j                  |            t        j
                        }t        j                  |j                         t        | j                  |            t        j
                        }t        j                  |j                         t        d      t        j
                        }	|	j                         S )Nr  	aliyun_v4aliyun_v4_request)	rO   rM   rN   r   rP   rL  rS   r  r  )
r&   r   r[   r  r   
key_secretsigning_datesigning_regionsigning_productr  s
             r   __get_signing_keyz ProviderAuthV4.__get_signing_key  s    !} !B!B!DD
xx 4htngnnU,"5"5"7$BSBSTWBX9Y[b[i[ij((>#8#8#:HTEWEWX[E\<]_f_m_mnhh557BU9VX_XfXfg!!##r    c                    t        |      }d}|D ]t  }t        |t              rt        |      }n|}|dk\  r|dk  s|dk\  r|dk  s|dk\  r|dk  s|dv r||z  }I|d	u r|d
k(  r||z  }X|dj	                  t        |            z  }v |S )Nr7   r!  r"  r#  r$  r%  r&  r'  Tr*   r,  r-  )r&   r1  ignoreSlashesr2  r3  r4  s         r   __v4_uri_encodezProviderAuthV4.__v4_uri_encode  s    H% 	1A!S!FSQ#X18SHca3G.Gq$&AHqz((Q00	1 
r    c                     t         S r$   )r   rg   s    r   r   zProviderAuthV4.auth_version  r   r    r$   )ri   rj   rk   rl   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r1   r    r   r  r    s    
5B$eL3	7	OH_4
"
3j6G@C$(r    r  c                   "     e Zd ZdZ fdZ xZS )r   u  签名版本4，与版本2的区别在：
    1. v4 签名规则引入了scope概念，SignToString(待签名串) 和 SigningKey （签名密钥）都需要包含 region信息
    2. 资源路径里的 / 不做转义。   query里的 / 需要转义为 %2F
    c                 |    t        |j                         |j                               }t        t        |   |       y r$   )r   r   r  r   r'   r  s       r   r'   zAuthV4.__init__  r  r    r  r	  s   @r   r   r     r  r    r   )&rM   rP   rH   r   r7   r   
exceptionsr   compatr   r   r	   r   ro   r[   r   r   r   r   r  	getLoggerri   r   r   objectr"   rn   r   r  r  r>   r5  rH  r;  r  r   r  r   r1   r    r   <module>r     s         # . .   2(-8 			8	$ >L 	F)v )VR8 Rh9< 9F ( *f  *H& "7#6#8 9 zX zx;^ ;uX un;^ ;r    