o
    ³©iÇ€  ã                   @   sF  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T d dlZddlmZ d	Zd
ZdZddgZe e¡Zefdd„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Ze ddgƒZ!G d d!„ d!eƒZ"G d"d#„ d#e"ƒZ#G d$d%„ d%eƒZ$G d&d'„ d'e$ƒZ%dS )(é    N)Údatetimeé   )Úutils)ÚClientError)ÚurlquoteÚto_bytesÚis_py2)Ú*)ÚStaticCredentialsProviderÚv1Úv2Úv4úcontent-typeúcontent-md5c                 C   sv   |t krt d | ¡¡ t|  ¡ | ¡ ƒS |tkr*t d | ¡¡ t|  ¡ | ¡ ƒS t d | ¡¡ t|  ¡ | ¡ ƒ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_version© r   ú=/home/ubuntu/.local/lib/python3.10/site-packages/oss2/auth.pyÚ	make_auth   s   r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚAuthBaseuP   ç”¨äºŽä¿å­˜ç”¨æˆ·AccessKeyIdã€AccessKeySecretï¼Œä»¥åŠè®¡ç®—ç­¾åçš„å¯¹è±¡ã€‚c                 C   s
   || _ d S ©N)Úcredentials_provider)Úselfr!   r   r   r   Ú__init__$   ó   
zAuthBase.__init__c                 C   sR  | j  ¡ }| ¡ r| ¡ |d< tt ¡ ƒ| }d||f }g }	|rC| ¡ }
|
D ]\}}|dkrB|dkrB|dkrB|dkrB|	 ||f¡ q'|	jdd„ d	 d
}|	D ]\}}|d||f 7 }qO|r`|ni }t|ƒd | | }t	 
d |¡¡ t t| ¡ ƒt|ƒtj¡}t | ¡ ¡}| ¡ |d< t|ƒ|d< ||d< |d d dd„ | ¡ D ƒ¡ S )Núsecurity-tokenz/%s/%sÚOSSAccessKeyIdÚ	SignatureÚExpiresÚSecurityTokenc                 S   ó   | d S ©Nr   r   ©Úer   r   r   Ú<lambda>7   ó    z)AuthBase._sign_rtmp_url.<locals>.<lambda>©ÚkeyÚ z%s:%s
Ú
z(Sign Rtmp url: string to be signed = {0}ú?ú&c                 s   ó    | ]
\}}t ||ƒV  qd S r    ©Ú_param_to_quoted_query©Ú.0ÚkÚvr   r   r   Ú	<genexpr>H   ó   € z*AuthBase._sign_rtmp_url.<locals>.<genexpr>)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_paramsrC   r;   r<   Úcanon_params_strÚpÚstring_to_signÚhÚ	signaturer   r   r   Ú_sign_rtmp_url'   s2   
 € zAuthBase._sign_rtmp_urlc                 C   ó   dS ©Nr2   r   ©r"   r   r   r   r   J   ó   zAuthBase.auth_versionN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r^   r   r   r   r   r   r   "   s
    #r   c                   @   st   e Zd ZdZeg 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S )Ú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Ú
bucketInforD   Ú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                 C   sX   | j  ¡ }| ¡ r| ¡ |jt< t ¡ |jd< |  ||||¡}d | 	¡ |¡|jd< d S )NÚdatezOSS {0}:{1}Úauthorization)
r!   r?   r@   ÚheadersÚOSS_SECURITY_TOKENr   Ú	http_dateÚ_ProviderAuth__make_signaturer   rN   )r"   ÚreqrQ   r1   rU   r]   r   r   r   Ú_sign_requeste   s   
zProviderAuth._sign_requestc                 C   s˜   | j  ¡ }| ¡ r| ¡ |jd< tt ¡ ƒ| }t|ƒ|jd< |  ||||¡}| 	¡ |jd< t|ƒ|jd< ||jd< |j
d d dd	„ |j ¡ D ƒ¡ S )
Nr%   r©   r&   r(   r'   r4   r5   c                 s   r6   r    r7   r9   r   r   r   r=   }   r>   z)ProviderAuth._sign_url.<locals>.<genexpr>)r!   r?   r@   rT   rA   rB   rF   r«   r®   rN   rP   rO   rC   )r"   r¯   rQ   r1   rS   rU   rV   r]   r   r   r   Ú	_sign_urlo   s   

$zProviderAuth._sign_urlc                 C   s\   t r
|  |||¡}n|  |||¡}t d |¡¡ t t| 	¡ ƒt|ƒt
j¡}t | ¡ ¡S ©Nú)Make signature: string to be signed = {0})r   Ú!_ProviderAuth__get_string_to_signÚ _ProviderAuth__get_bytes_to_signr   r   r   rG   rH   r   rI   rJ   rK   r   rL   rM   )r"   r¯   rQ   r1   rU   r[   r\   r   r   r   Ú__make_signature   s   zProviderAuth.__make_signaturec           	      C   sj   |   |||¡}|  |¡}|j dd¡}|j dd¡}|j dd¡p'|j dd¡}d |j||||| g¡S )Nr   r2   r   ú
x-oss-dater©   r3   )Ú"_ProviderAuth__get_resource_stringÚ!_ProviderAuth__get_headers_stringr«   ÚgetrO   Úmethod)	r"   r¯   rQ   r1   Úresource_stringÚheaders_stringÚcontent_md5Úcontent_typer©   r   r   r   Ú__get_string_to_signŠ   s   
üz!ProviderAuth.__get_string_to_signc                 C   ól   |j }g }| ¡ D ]\}}| ¡ }| d¡r| ||f¡ q	|jdd„ d |r4d dd„ |D ƒ¡d S dS )	Núx-oss-c                 S   r*   r+   r   ©Úxr   r   r   r.   Ÿ   r/   z3ProviderAuth.__get_headers_string.<locals>.<lambda>r0   r3   c                 s   s     | ]\}}|d  | V  qdS )ú:Nr   r9   r   r   r   r=   ¢   ó   € z4ProviderAuth.__get_headers_string.<locals>.<genexpr>r2   ©r«   rC   ÚlowerÚ
startswithrD   rE   rO   ©r"   r¯   r«   Úcanon_headersr;   r<   Ú	lower_keyr   r   r   Ú__get_headers_string—   ó   
€z!ProviderAuth.__get_headers_stringc                 C   s*   |s
d|   |j¡ S d |||   |j¡¡S )Nú/z/{0}/{1}{2})Ú%_ProviderAuth__get_subresource_stringrT   r   ©r"   r¯   rQ   r1   r   r   r   Ú__get_resource_string¦   s   z"ProviderAuth.__get_resource_stringc                    sj   |sdS g }|  ¡ D ]\}}|ˆ jv r| ||f¡ q
|jdd„ d |r3dd ‡ fdd„|D ƒ¡ S dS )	Nr2   c                 S   r*   r+   r   r,   r   r   r   r.   µ   r/   z7ProviderAuth.__get_subresource_string.<locals>.<lambda>r0   r4   r5   c                 3   ó     | ]\}}ˆ   ||¡V  qd S r    )Ú_ProviderAuth__param_to_queryr9   ra   r   r   r=   ¸   rÆ   z8ProviderAuth.__get_subresource_string.<locals>.<genexpr>)rC   Ú_subresource_key_setrD   rE   rO   )r"   rT   Úsubresource_paramsr1   Úvaluer   ra   r   Ú__get_subresource_string¬   s   
€z%ProviderAuth.__get_subresource_stringc                 C   ó   |r|d | S |S ©Nú=r   ©r"   r;   r<   r   r   r   Ú__param_to_query¼   ó   zProviderAuth.__param_to_queryc           	      C   sŽ   |   |||¡ d¡}|  |¡}|j dd¡ d¡}|j dd¡ d¡}|j dd¡ d¡p6|j dd¡ d¡}d |j d¡||||| g¡S )Núutf-8r   r2   r   r·   r©   ó   
)r¸   ÚencodeÚ _ProviderAuth__get_headers_bytesr«   rº   rO   r»   )	r"   r¯   rQ   r1   Úresource_bytesÚheaders_bytesr¾   r¿   r©   r   r   r   Ú__get_bytes_to_signÂ   s   
(üz ProviderAuth.__get_bytes_to_signc                 C   rÁ   )	NrÂ   c                 S   r*   r+   r   rÃ   r   r   r   r.   ×   r/   z2ProviderAuth.__get_headers_bytes.<locals>.<lambda>r0   rà   c                 s   s(    | ]\}}t |ƒd  t |ƒ V  qdS )ó   :N©r   r9   r   r   r   r=   Ú   ó   €& z3ProviderAuth.__get_headers_bytes.<locals>.<genexpr>ó    rÇ   rÊ   r   r   r   Ú__get_headers_bytesÏ   rÎ   z ProviderAuth.__get_headers_bytesc                 C   ó   t S r    )ÚAUTH_VERSION_1ra   r   r   r   r   Þ   rb   zProviderAuth.auth_versionN)rc   rd   re   rf   Ú	frozensetrÕ   r°   r±   r®   r´   r¹   r¸   rÐ   rÔ   rµ   râ   r   r   r   r   r   rg   M   s     ÿ
rg   c                       ó    e Zd ZdZ‡ fdd„Z‡  ZS )r   u   ç­¾åç‰ˆæœ¬1
    c                    ó&   t | ¡ | ¡ ƒ}tt| ƒ |¡ d S r    )r
   r   Úsuperr   r#   ©r"   r   r   r!   ©Ú	__class__r   r   r#   ä   ó   zAuth.__init__©rc   rd   re   rf   r#   Ú__classcell__r   r   rò   r   r   á   s    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚAnonymousAuthuè   ç”¨äºŽåŒ¿åè®¿é—®ã€‚

    .. note::
        åŒ¿åç”¨æˆ·åªèƒ½è¯»å–public-readçš„Bucketï¼Œæˆ–åªèƒ½è¯»å–ã€å†™å…¥public-read-writeçš„Bucketã€‚
        ä¸èƒ½è¿›è¡ŒServiceã€Bucketç›¸å…³çš„æ“ä½œï¼Œä¹Ÿä¸èƒ½ç½—åˆ—æ–‡ä»¶ç­‰ã€‚
    c                 C   s   d S r    r   rÑ   r   r   r   r°   ð   rb   zAnonymousAuth._sign_requestc                 C   s$   |j d d dd„ |j ¡ D ƒ¡ S )Nr4   r5   c                 s   r6   r    r7   r9   r   r   r   r=   ô   r>   z*AnonymousAuth._sign_url.<locals>.<genexpr>)rP   rO   rT   rC   ©r"   r¯   rQ   r1   rS   r   r   r   r±   ó   ó   $zAnonymousAuth._sign_urlc                 C   s    |d d  dd„ | ¡ D ƒ¡ S )Nr4   r5   c                 s   r6   r    r7   r9   r   r   r   r=   ÷   r>   z/AnonymousAuth._sign_rtmp_url.<locals>.<genexpr>)rO   rC   ©r"   rP   rQ   rR   rS   rT   r   r   r   r^   ö   s    zAnonymousAuth._sign_rtmp_urlc                 C   r_   r`   r   ra   r   r   r   r   ù   rb   zAnonymousAuth.auth_versionN)rc   rd   re   rf   r°   r±   r^   r   r   r   r   r   r÷   é   s    r÷   c                   @   s<   e Zd ZdZefdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )Ú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                 C   sV   t  d |¡¡ t|||ƒ}|tkrt|ƒ| _d S |tkr$t|ƒ| _d S t	|ƒ| _d S )NzSInit StsAuth: access_key_id: {0}, access_key_secret: ******, security_token: ******)
r   r   r   r
   r   ÚProviderAuthV2Ú_StsAuth__authr   ÚProviderAuthV4rg   )r"   r   r   Úsecurity_tokenr   r!   r   r   r   r#     s   zStsAuth.__init__c                 C   s   | j  |||¡ d S r    )rý   r°   rÑ   r   r   r   r°     ó   zStsAuth._sign_requestc                 C   s   | j  ||||¡S r    )rý   r±   rø   r   r   r   r±     s   zStsAuth._sign_urlc                 C   s   | j  |||||¡S r    )rý   r^   rú   r   r   r   r^     r   zStsAuth._sign_rtmp_urlc                 C   s
   | j  ¡ S r    )rý   r   ra   r   r   r   r     r$   zStsAuth.auth_versionN)
rc   rd   re   rf   rì   r#   r°   r±   r^   r   r   r   r   r   rû   ý   s    
rû   c                 C   s&   |rt | dƒd t |dƒ S t | dƒS )Nr2   rÛ   )r   )r;   r<   r   r   r   r8   !  s   
r8   c                 C   s†   t | ƒ} d}| D ]8}t|tƒrt|ƒ}n|}|dkr|dks2|dkr&|dks2|dkr.|dks2|dv r7||7 }q|d	 t|ƒ¡7 }q|S )
Nr2   ÚAÚZÚaÚzÚ0Ú9©Ú_ú-ú~Ú.ú%{0:02X}©r   Ú
isinstancerA   Úchrr   Úord)Úraw_textÚresÚbÚcr   r   r   Úv2_uri_encode(  s   

 
r  Úrangezif-modified-sincec                   @   st   e Zd ZdZddd„Zd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S )rü   uá   ç­¾åç‰ˆæœ¬2ï¼Œé»˜è®¤æž„é€ å‡½æ•°åŒçˆ¶ç±»AuthBaseï¼Œéœ€è¦ä¼ é€’credentials_provider
    ä¸Žç‰ˆæœ¬1çš„åŒºåˆ«åœ¨ï¼š
    1. ä½¿ç”¨SHA256ç®—æ³•ï¼Œå…·æœ‰æ›´é«˜çš„å®‰å…¨æ€§
    2. å‚æ•°è®¡ç®—åŒ…å«æ‰€æœ‰çš„HTTPæŸ¥è¯¢å‚æ•°
    Nc                 C   s˜   | j  ¡ }| ¡ r| ¡ |jt< |du rt}|  ||¡}t ¡ |jd< |  	|||||¡}|r?d 
| ¡ d |¡|¡|jd< dS d 
| ¡ |¡|jd< dS )õ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!   r?   r@   r«   r¬   Ú_DEFAULT_ADDITIONAL_HEADERSÚ'_ProviderAuthV2__get_additional_headersr   r­   Ú_ProviderAuthV2__make_signaturer   rN   rO   )r"   r¯   rQ   r1   Úin_additional_headersrU   Úadditional_headersr]   r   r   r   r°   E  s   

ÿzProviderAuthV2._sign_requestc           
      C   sÒ   | j  ¡ }| ¡ r| ¡ |jd< |du rtƒ }|  ||¡}tt ¡ ƒ| }t|ƒ|j	d< d|jd< t|ƒ|jd< | 
¡ |jd< |rId |¡|jd	< |  |||||¡}	|	|jd
< |jd d dd„ |j ¡ D ƒ¡ 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%   Nr©   ÚOSS2úx-oss-signature-versionúx-oss-expireszx-oss-access-key-idr  úx-oss-additional-headersúx-oss-signaturer4   r5   c                 s   r6   r    r7   r9   r   r   r   r=   †  r>   z+ProviderAuthV2._sign_url.<locals>.<genexpr>)r!   r?   r@   rT   Úsetr  rA   rB   rF   r«   rN   rO   r  rP   rC   )
r"   r¯   rQ   r1   rS   r  rU   r  rV   r]   r   r   r   r±   b  s    


$zProviderAuthV2._sign_urlc                 C   s`   t r|  ||||¡}n|  ||||¡}t d |¡¡ t t| 	¡ ƒt|ƒt
j¡}t | ¡ ¡S r²   )r   Ú#_ProviderAuthV2__get_string_to_signÚ"_ProviderAuthV2__get_bytes_to_signr   r   r   rG   rH   r   rI   rJ   Úsha256r   rL   rM   )r"   r¯   rQ   r1   r  rU   r[   r\   r   r   r   r¶   ˆ  s   zProviderAuthV2.__make_signaturec                 C   ó2   t dd„ |D ƒƒ}t dd„ |j ¡ D ƒƒ}||@ S )Nc                 s   ó    | ]}|  ¡ V  qd S r    ©rÈ   ©r:   r\   r   r   r   r=   –  ó   € z:ProviderAuthV2.__get_additional_headers.<locals>.<genexpr>c                 s   r)  r    r*  ©r:   r;   r   r   r   r=   —  r,  ©r$  r«   Úkeys©r"   r¯   r  r  Úkeys_in_headerr   r   r   Ú__get_additional_headers“  ó   z'ProviderAuthV2.__get_additional_headersc                 C   sˆ   |j }|j dd¡}|j dd¡}|j dd¡}|  ||¡}	d t|ƒ¡}
|  |||¡}|d | d | d | d |	 |
 d | S )Nr   r2   r   r©   r  r3   )r»   r«   rº   Ú._ProviderAuthV2__get_canonicalized_oss_headersrO   ÚsortedÚ$_ProviderAuthV2__get_resource_string©r"   r¯   rQ   r1   Úadditional_header_listÚverbr¾   r¿   r©   Úcanonicalized_oss_headersr  rW   r   r   r   rÀ   ›  s8   ÿÿþþýýüûûúz#ProviderAuthV2.__get_string_to_signc                 C   sB   |rt d| d | ƒ}nt dƒ}t d ||¡¡ ||  |¡ S )NrÏ   zencoded_uri={0} key={1})r  r   Úinfor   Ú-_ProviderAuthV2__get_canonalized_query_string)r"   r¯   rQ   r1   Úencoded_urir   r   r   rÒ   ­  s
   z$ProviderAuthV2.__get_resource_stringc                    s`   i }|j  ¡ D ]\}}t|ƒ|t|ƒ< q|sdS t| ¡ dd„ d}dd ‡ fdd„|D ƒ¡ S )	Nr2   c                 S   r*   r+   r   r,   r   r   r   r.   ¿  r/   z?ProviderAuthV2.__get_canonalized_query_string.<locals>.<lambda>r0   r4   r5   c                 3   rÓ   r    )Ú_ProviderAuthV2__param_to_queryr9   ra   r   r   r=   À  rÆ   z@ProviderAuthV2.__get_canonalized_query_string.<locals>.<genexpr>)rT   rC   r  r5  rO   ©r"   r¯   Úencoded_paramsÚparamr×   Úsorted_paramsr   ra   r   Ú__get_canonalized_query_string·  s   z-ProviderAuthV2.__get_canonalized_query_stringc                 C   rÙ   rÚ   r   rÜ   r   r   r   rÝ   Â  rÞ   zProviderAuthV2.__param_to_queryc                 C   ód   g }|j  ¡ D ]\}}| ¡ }| d¡s||v r| ||f¡ q|jdd„ d d dd„ |D ƒ¡S )õs   
        :param additional_headers: å°å†™çš„headersåˆ—è¡¨, å¹¶ä¸”è¿™äº›headerséƒ½ä¸ä»¥'x-oss-'ä¸ºå‰ç¼€.
        rÂ   c                 S   r*   r+   r   rÃ   r   r   r   r.   Ó  r/   z@ProviderAuthV2.__get_canonicalized_oss_headers.<locals>.<lambda>r0   r2   c                 s   ó(    | ]}|d  d |d  d V  qdS ©r   rÅ   r   r3   Nr   ©r:   r<   r   r   r   r=   Õ  rè   zAProviderAuthV2.__get_canonicalized_oss_headers.<locals>.<genexpr>rÇ   ©r"   r¯   r  rË   r;   r<   rÌ   r   r   r   Ú__get_canonicalized_oss_headersÈ  ó   €z.ProviderAuthV2.__get_canonicalized_oss_headersc                 C   s¬   |j  d¡}|j dd¡ d¡}|j dd¡ d¡}|j dd¡ d¡}|  ||¡}	d t|ƒ¡ d¡}
|  |||¡ d¡}|d | d | d | d |	 |
 d | S )Nrß   r   r2   r   r©   r  rà   )r»   rá   r«   rº   Ú4_ProviderAuthV2__get_canonicalized_oss_headers_bytesrO   r5  r6  r7  r   r   r   rå   ×  s8   ÿÿþþýýüûûúz"ProviderAuthV2.__get_bytes_to_signc                 C   rD  )rE  rÂ   c                 S   r*   r+   r   rÃ   r   r   r   r.   ô  r/   zFProviderAuthV2.__get_canonicalized_oss_headers_bytes.<locals>.<lambda>r0   ré   c                 s   ó0    | ]}t |d  ƒd t |d ƒ d V  qdS ©r   ræ   r   rà   Nrç   rH  r   r   r   r=   ö  ó   €. zGProviderAuthV2.__get_canonicalized_oss_headers_bytes.<locals>.<genexpr>rÇ   rI  r   r   r   Ú%__get_canonicalized_oss_headers_bytesé  rK  z4ProviderAuthV2.__get_canonicalized_oss_headers_bytesc                 C   rë   r    )r   ra   r   r   r   r   ø  rb   zProviderAuthV2.auth_versionr    )rc   rd   re   rf   r°   r±   r  r  r%  r6  r<  r>  r4  r&  rL  r   r   r   r   r   rü   ?  s    

&
rü   c                       rî   )r   u–   ç­¾åç‰ˆæœ¬2ï¼Œä¸Žç‰ˆæœ¬1çš„åŒºåˆ«åœ¨ï¼š
    1. ä½¿ç”¨SHA256ç®—æ³•ï¼Œå…·æœ‰æ›´é«˜çš„å®‰å…¨æ€§
    2. å‚æ•°è®¡ç®—åŒ…å«æ‰€æœ‰çš„HTTPæŸ¥è¯¢å‚æ•°
    c                    rï   r    )r
   r   rð   r   r#   rñ   rò   r   r   r#      rô   zAuthV2.__init__rõ   r   r   rò   r   r   û  ó    r   c                   @   sÌ   e Zd ZdZd1d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d/d0„ ZdS )2rþ   uO  ç­¾åç‰ˆæœ¬4ï¼Œé»˜è®¤æž„é€ å‡½æ•°åŒçˆ¶ç±»AuthBaseï¼Œéœ€è¦ä¼ é€’credentials_provider
    ä¸Žç‰ˆæœ¬2çš„åŒºåˆ«åœ¨ï¼š
    1. v4 ç­¾åè§„åˆ™å¼•å…¥äº†scopeæ¦‚å¿µï¼ŒSignToString(å¾…ç­¾åä¸²) å’Œ SigningKey ï¼ˆç­¾åå¯†é’¥ï¼‰éƒ½éœ€è¦åŒ…å« regionä¿¡æ¯
    2. èµ„æºè·¯å¾„é‡Œçš„ / ä¸åšè½¬ä¹‰ã€‚   queryé‡Œçš„ / éœ€è¦è½¬ä¹‰ä¸º %2F
    Nc                 C   sÌ   |j du r	tdƒ‚| j ¡ }| ¡ r| ¡ |jt< t ¡ }| 	d¡}|dd… }||jd< d|jd< |  
|¡}	| ¡ d |  ||¡ }
|  ||||	||¡}d	 |
|¡}|	r_|d
 d |	¡¡ }||jd< dS )r  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!   r?   r@   r«   r¬   r   ÚutcnowÚstrftimeÚ._ProviderAuthV4__get_additional_signed_headersrN   Ú_ProviderAuthV4__get_scopeÚ_ProviderAuthV4__make_signaturer   rO   )r"   r¯   rQ   r1   r  rU   Únow_datetimeÚnow_datetime_iso8601Únow_dateÚadditional_signed_headersÚ
credentialr]   rª   r   r   r   r°     s"   






zProviderAuthV4._sign_requestc                 C   sø   | j  ¡ }| ¡ r| ¡ |jd< |du rtƒ }|  ||¡}|  |¡}t ¡ }| 	d¡}	|	dd… }
|	|jd< t
|ƒ|jd< d|jd< | ¡ d	 |  |
|¡ |jd
< |r[|  |¡|jd< |  ||||||	¡}||jd< |jd d dd„ |j ¡ D ƒ¡ S )r  zx-oss-security-tokenNrR  rS  r·   r!  zOSS4-HMAC-SHA256r   rÏ   zx-oss-credentialr"  r#  r4   r5   c                 s   r6   r    r7   r9   r   r   r   r=   P  r>   z+ProviderAuthV4._sign_url.<locals>.<genexpr>)r!   r?   r@   rT   r$  Ú'_ProviderAuthV4__get_additional_headersrY  r   rW  rX  rF   rN   rZ  Ú8_ProviderAuthV4__get_canonical_additional_signed_headersr[  rP   rO   rC   )r"   r¯   rQ   r1   rS   r  rU   r  r\  r]  r^  r]   r   r   r   r±   ,  s&   





$zProviderAuthV4._sign_urlc                 C   sŒ   t r|  ||||¡}|  |||¡}n|  ||||¡}|  |||¡}|  |||¡}	t |	t|ƒt	j
¡ ¡ }
t d |¡¡ t d |¡¡ |
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_keyrG   rH   r   rJ   r'  Ú	hexdigestr   r   r   )r"   r¯   rQ   r1   r_  rU   Ú	date_timeÚcanonical_requestr[   Úsigning_keyr]   r   r   r   r¶   R  s   zProviderAuthV4.__make_signaturec                 C   r(  )Nc                 s   r)  r    r*  r+  r   r   r   r=   d  r,  z:ProviderAuthV4.__get_additional_headers.<locals>.<genexpr>c                 s   r)  r    r*  r-  r   r   r   r=   e  r,  r.  r0  r   r   r   r2  a  r3  z'ProviderAuthV4.__get_additional_headersc                 C   sT   |d u rd S g }|D ]}|  ¡ }| d¡st |¡s| |¡ q
|jdd„ d |S )NrÂ   c                 S   r*   r+   r   rÃ   r   r   r   r.   q  r/   z@ProviderAuthV4.__get_additional_signed_headers.<locals>.<lambda>r0   )rÈ   rÉ   ÚDEFAULT_SIGNED_HEADERSÚ__contains__rD   rE   )r"   r  r«   r;   r1   r   r   r   Ú__get_additional_signed_headersi  s   
€z.ProviderAuthV4.__get_additional_signed_headersc                 C   s&   |rd| d | }nd}|   |d¡S )NrÏ   T)Ú_ProviderAuthV4__v4_uri_encode)r"   rQ   r1   r=  r   r   r   Ú__get_canonical_urit  s   z"ProviderAuthV4.__get_canonical_uric                 C   rÙ   rÚ   r   rÜ   r   r   r   rÝ   {  rÞ   zProviderAuthV4.__param_to_queryc                    sd   i }|j  ¡ D ]\}}ˆ  |d¡|ˆ  |d¡< q|sdS t| ¡ dd„ d}d ‡ fdd„|D ƒ¡S )	NFr2   c                 S   r*   r+   r   r,   r   r   r   r.   ‰  r/   z6ProviderAuthV4.__get_canonical_query.<locals>.<lambda>r0   r5   c                 3   rÓ   r    )Ú_ProviderAuthV4__param_to_queryr9   ra   r   r   r=   Š  rÆ   z7ProviderAuthV4.__get_canonical_query.<locals>.<genexpr>)rT   rC   ro  r5  rO   r?  r   ra   r   Ú__get_canonical_query  s   z$ProviderAuthV4.__get_canonical_queryc                 C   s>   |d ur|  d¡rdS t |¡rdS |d ur| |¡rdS dS )NrÂ   TF)rÉ   rl  rm  )r"   r1   r  r   r   r   Ú__is_sign_headerŒ  s   

zProviderAuthV4.__is_sign_headerc                 C   ó^   g }|j  ¡ D ]\}}| ¡ }|  ||¡r| ||f¡ q|jdd„ d d dd„ |D ƒ¡S )Nc                 S   r*   r+   r   rÃ   r   r   r   r.   Ÿ  r/   z8ProviderAuthV4.__get_canonical_headers.<locals>.<lambda>r0   r2   c                 s   rF  rG  r   rH  r   r   r   r=      rè   z9ProviderAuthV4.__get_canonical_headers.<locals>.<genexpr>©r«   rC   rÈ   Ú_ProviderAuthV4__is_sign_headerrD   rE   rO   rI  r   r   r   Ú__get_canonical_headers™  ó   €z&ProviderAuthV4.__get_canonical_headersc                 C   rt  )Nc                 S   r*   r+   r   rÃ   r   r   r   r.   ¨  r/   z>ProviderAuthV4.__get_canonical_headers_bytes.<locals>.<lambda>r0   ré   c                 s   rM  rN  rç   rH  r   r   r   r=   ©  rO  z?ProviderAuthV4.__get_canonical_headers_bytes.<locals>.<genexpr>ru  rI  r   r   r   Ú__get_canonical_headers_bytes¢  rx  z,ProviderAuthV4.__get_canonical_headers_bytesc                 C   s   |d u rdS d  t|ƒ¡S )Nr2   r  )rO   r5  )r"   r  r   r   r   Ú)__get_canonical_additional_signed_headers«  s   z8ProviderAuthV4.__get_canonical_additional_signed_headersc                 C   s   |j  d¡r|j  dd¡S dS )NrU  r2   rT  )r«   rm  rº   ©r"   r¯   r   r   r   Ú__get_canonical_hash_payload°  s   z+ProviderAuthV4.__get_canonical_hash_payloadc                 C   s   |j p|jpdS r`   )Úcloudbox_idrV  r{  r   r   r   Ú__get_regionµ  s   zProviderAuthV4.__get_regionc                 C   s   |j S r    )Úproductr{  r   r   r   Ú__get_product¸  s   zProviderAuthV4.__get_productc                 C   s$   |d |   |¡ d |  |¡ d S )NrÏ   z/aliyun_v4_request)Ú_ProviderAuthV4__get_regionÚ_ProviderAuthV4__get_product)r"   r©   r¯   r   r   r   Ú__get_scope»  rù   zProviderAuthV4.__get_scopec                 C   sP   |j d |  ||¡ d |  |¡ d |  ||¡ d |  |¡ d |  |¡ S )Nr3   )r»   Ú"_ProviderAuthV4__get_canonical_uriÚ$_ProviderAuthV4__get_canonical_queryÚ&_ProviderAuthV4__get_canonical_headersrb  Ú+_ProviderAuthV4__get_canonical_hash_payload©r"   r¯   rQ   r1   r_  r   r   r   Ú__get_canonical_request¾  s&   
ÿÿþþ
ýýüüûz&ProviderAuthV4.__get_canonical_requestc                 C   s:   |d d… }d| d |   ||¡ d t t|ƒ¡ ¡  S ©NrS  zOSS4-HMAC-SHA256
r3   )rZ  rJ   r'  r   rh  )r"   r¯   rj  ri  r©   r   r   r   rÀ   Æ  s   ÿÿ
þþýz#ProviderAuthV4.__get_string_to_signc                 C   sd   t |jƒd t |  ||¡ƒ d t |  |¡ƒ d |  ||¡ d t |  |¡ƒ d t |  |¡ƒ S )Nrà   )r   r»   r„  r…  Ú,_ProviderAuthV4__get_canonical_headers_bytesrb  r‡  rˆ  r   r   r   Ú__get_canonical_request_bytesÍ  s&   ÿÿþþ
ýýüüûz,ProviderAuthV4.__get_canonical_request_bytesc                 C   s6   |d d… }d| d |   ||¡ d t |¡ ¡  S rŠ  )rZ  rJ   r'  rh  )r"   r¯   Úcanonical_request_bytesri  r©   r   r   r   Ú__get_string_to_sign_bytesÕ  s   ÿÿ
þþýz)ProviderAuthV4.__get_string_to_sign_bytesc           
      C   sŒ   |d d… }d|  ¡  }t t|ƒt|ƒtj¡}t | ¡ t|  |¡ƒtj¡}t | ¡ t|  |¡ƒtj¡}t | ¡ tdƒtj¡}	|	 ¡ S )NrS  Ú	aliyun_v4Úaliyun_v4_request)	rI   rG   rH   r   rJ   r'  rM   r  r‚  )
r"   r¯   rU   ri  r©   Ú
key_secretÚsigning_dateÚsigning_regionÚsigning_productrk  r   r   r   Ú__get_signing_keyÜ  s   z ProviderAuthV4.__get_signing_keyc                 C   s    t |ƒ}d}|D ]E}t|tƒrt|ƒ}n|}|dkr|dks2|dkr&|dks2|dkr.|dks2|dv r7||7 }q|d	u rD|d
krD||7 }q|d t|ƒ¡7 }q|S )Nr2   r  r  r  r  r  r  r  TrÏ   r  r  )r"   r  ÚignoreSlashesr  r  r  r   r   r   Ú__v4_uri_encodeå  s   

 

zProviderAuthV4.__v4_uri_encodec                 C   rë   r    )r   ra   r   r   r   r   ù  rb   zProviderAuthV4.auth_versionr    )rc   rd   re   rf   r°   r±   r[  ra  rY  r„  rq  r…  rv  r†  r‹  rb  r‡  r  r‚  rZ  rc  rd  re  rf  rg  ro  r   r   r   r   r   rþ     s2    

!&			rþ   c                       rî   )r   u  ç­¾åç‰ˆæœ¬4ï¼Œä¸Žç‰ˆæœ¬2çš„åŒºåˆ«åœ¨ï¼š
    1. v4 ç­¾åè§„åˆ™å¼•å…¥äº†scopeæ¦‚å¿µï¼ŒSignToString(å¾…ç­¾åä¸²) å’Œ SigningKey ï¼ˆç­¾åå¯†é’¥ï¼‰éƒ½éœ€è¦åŒ…å« regionä¿¡æ¯
    2. èµ„æºè·¯å¾„é‡Œçš„ / ä¸åšè½¬ä¹‰ã€‚   queryé‡Œçš„ / éœ€è¦è½¬ä¹‰ä¸º %2F
    c                    rï   r    )r
   r   rð   r   r#   rñ   rò   r   r   r#     rô   zAuthV4.__init__rõ   r   r   rò   r   r   ü  rQ  r   )&rG   rJ   rB   r   r2   r   Ú
exceptionsr   Úcompatr   r   r   r«   rh   rU   r
   rì   r   r   rl  Ú	getLoggerrc   r   r   Úobjectr   rg   r   r÷   rû   r8   r  r$  r  rü   r   rþ   r   r   r   r   r   Ú<module>   sB   
+ $ÿ =
 x