o
    ³­Rh+  ã                   @   sÜ   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ G d	d
„ d
eƒZ							d dd„Zdd„ Zd!dd„Zd"dd„Zd#dd„Zdd„ Zdd„ ZG dd„ dƒZG dd„ deƒZdS )$zÿ
oauthlib.oauth2.rfc6749.tokens
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains methods for adding two types of access tokens to requests.

- Bearer https://tools.ietf.org/html/rfc6750
- MAC https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
é    N)Ú
b2a_base64)Úurlparse)Úcommon)Úadd_params_to_qsÚadd_params_to_urié   )Úutilsc                       sr   e Zd Zd‡ fdd„	Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZ‡  ZS )ÚOAuth2TokenNc                    sn   t ƒ  |¡ d | _| d¡rtt |d ¡ƒ| _|d ur1tt |¡ƒ| _| jd u r/| j| _d S d S | j| _d S )NÚscope)ÚsuperÚ__init__Ú
_new_scopeÚgetÚsetr   Úscope_to_listÚ
_old_scope)ÚselfÚparamsÚ	old_scope©Ú	__class__© ú`/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/oauthlib/oauth2/rfc6749/tokens.pyr      s   

ýzOAuth2Token.__init__c                 C   s   | j | jkS ©N)r   r   ©r   r   r   r   Úscope_changed&   ó   zOAuth2Token.scope_changedc                 C   ó   t  | j¡S r   )r   Úlist_to_scoper   r   r   r   r   r   *   r   zOAuth2Token.old_scopec                 C   ó
   t | jƒS r   )Úlistr   r   r   r   r   Ú
old_scopes.   ó   
zOAuth2Token.old_scopesc                 C   r   r   )r   r   r   r   r   r   r   r
   2   r   zOAuth2Token.scopec                 C   r   r   )r    r   r   r   r   r   Úscopes6   r"   zOAuth2Token.scopesc                 C   ó   t | j| j ƒS r   )r    r   r   r   r   r   r   Úmissing_scopes:   ó   zOAuth2Token.missing_scopesc                 C   r$   r   )r    r   r   r   r   r   r   Úadditional_scopes>   r&   zOAuth2Token.additional_scopesr   )Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   r   r!   r
   r#   r%   r'   Ú__classcell__r   r   r   r   r	      s     





r	   Ú ú
hmac-sha-1c                 C   s.  |  ¡ }t |¡\}}| ¡ dkrtj}n| ¡ dkrtj}ntdƒ‚|
dkr5|p3d t 	|	¡t
 ¡ ¡}nt
 ¡ }t
 ¡ }t|ƒ\}}}}}}|rO|d | n|}|durn|
dkrn| d¡}t||ƒ ¡ ƒdd	…  d¡}nd
}g }|
dkr|| |¡ n
| |¡ | |¡ | |  ¡ ¡ | |¡ | |¡ | |¡ |
dkr¥| |¡ | |pªd
¡ d |¡d }t|tƒr½| d¡}t || d¡|¡}t| ¡ ƒdd	…  d¡}g }| d|  ¡ |
dkrè| d| ¡ | d| ¡ |rø| d| ¡ |r| d| ¡ | d| ¡ |pi }d |¡|d< |S )a_  Add an `MAC Access Authentication`_ signature to headers.

    Unlike OAuth 1, this HMAC signature does not require inclusion of the
    request payload/body, neither does it use a combination of client_secret
    and token_secret but rather a mac_key provided together with the access
    token.

    Currently two algorithms are supported, "hmac-sha-1" and "hmac-sha-256",
    `extension algorithms`_ are not supported.

    Example MAC Authorization header, linebreaks added for clarity

    Authorization: MAC id="h480djs93hd8",
                       nonce="1336363200:dj83hs9s",
                       mac="bhCQXTVyfj5cmA9uKkPFx1zeOXM="

    .. _`MAC Access Authentication`: https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
    .. _`extension algorithms`: https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-7.1

    :param token:
    :param uri: Request URI.
    :param key: MAC given provided by token endpoint.
    :param http_method: HTTP Request method.
    :param nonce:
    :param headers: Request headers as a dictionary.
    :param body:
    :param ext:
    :param hash_algorithm: HMAC algorithm provided by token endpoint.
    :param issue_time: Time when the MAC credentials were issued (datetime).
    :param draft: MAC authentication specification version.
    :return: headers dictionary with the authorization field added.
    r.   zhmac-sha-256zunknown hash algorithmr   z{}:{}ú?Nzutf-8éÿÿÿÿr-   Ú
zMAC id="%s"zts="%s"z
nonce="%s"zbodyhash="%s"zext="%s"zmac="%s"z, ÚAuthorization)Úupperr   Úhost_from_uriÚlowerÚhashlibÚsha1Úsha256Ú
ValueErrorÚformatÚgenerate_ager   Úgenerate_nonceÚgenerate_timestampr   Úencoder   ÚdigestÚdecodeÚappendÚjoinÚ
isinstanceÚstrÚhmacÚnew)ÚtokenÚuriÚkeyÚhttp_methodÚnonceÚheadersÚbodyÚextÚhash_algorithmÚ
issue_timeÚdraftÚhostÚportÚhÚtsÚschÚnetÚpathÚparÚqueryÚfraÚrequest_uriÚbodyhashÚbaseÚbase_stringÚsignÚheaderr   r   r   Úprepare_mac_headerC   sb   (ÿ
 








rb   c                 C   ó   t |d| fgƒS )a  Add a `Bearer Token`_ to the request URI.
    Not recommended, use only if client can't use authorization header or body.

    http://www.example.com/path?access_token=h480djs93hd8

    .. _`Bearer Token`: https://tools.ietf.org/html/rfc6750

    :param token:
    :param uri:
    Úaccess_token)r   )rG   rH   r   r   r   Úprepare_bearer_uri­   s   re   c                 C   s   |pi }d|  |d< |S )zëAdd a `Bearer Token`_ to the request URI.
    Recommended method of passing bearer tokens.

    Authorization: Bearer h480djs93hd8

    .. _`Bearer Token`: https://tools.ietf.org/html/rfc6750

    :param token:
    :param headers:
    z	Bearer %sr2   r   )rG   rL   r   r   r   Úprepare_bearer_headers»   s   rf   c                 C   rc   )z¯Add a `Bearer Token`_ to the request body.

    access_token=h480djs93hd8

    .. _`Bearer Token`: https://tools.ietf.org/html/rfc6750

    :param token:
    :param body:
    rd   )r   )rG   rM   r   r   r   Úprepare_bearer_bodyË   s   
rg   Fc                 C   s   t  ¡ S )zp
    :param request: OAuthlib request.
    :type request: oauthlib.common.Request
    :param refresh_token:
    )r   Úgenerate_token)ÚrequestÚrefresh_tokenr   r   r   Úrandom_token_generatorØ   s   rk   c                    s   ‡ ‡fdd„}|S )z
    :param private_pem:
    c                    s   ˆ | _ t ˆ| ¡S r   )Úclaimsr   Úgenerate_signed_token)ri   ©ÚkwargsÚprivate_pemr   r   Úsigned_token_generatorå   s   z6signed_token_generator.<locals>.signed_token_generatorr   )rp   ro   rq   r   rn   r   rq   á   s   rq   c                 C   sP   d}d| j v r#| j  d¡ ¡ }t|ƒdkr!|d  ¡ dkr!|d }|S | j}|S )zç
    Helper function to extract a token from the request header.

    :param request: OAuthlib request.
    :type request: oauthlib.common.Request
    :return: Return the token or None if the Authorization header is malformed.
    Nr2   é   r   Úbearerr   )rL   r   ÚsplitÚlenr5   rd   )ri   rG   Úsplit_headerr   r   r   Úget_token_from_headerì   s   
þrw   c                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )Ú	TokenBaser   Fc                 C   ó   t dƒ‚)Nú&Subclasses must implement this method.©ÚNotImplementedError)r   ri   rj   r   r   r   Ú__call__  s   zTokenBase.__call__c                 C   ry   ©úb
        :param request: OAuthlib request.
        :type request: oauthlib.common.Request
        rz   r{   ©r   ri   r   r   r   Úvalidate_request  ó   zTokenBase.validate_requestc                 C   ry   r~   r{   r€   r   r   r   Úestimate_type  r‚   zTokenBase.estimate_typeN©F)r(   r)   r*   Ú	__slots__r}   r   rƒ   r   r   r   r   rx      s
    
rx   c                   @   s8   e Zd ZdZ		ddd„Zddd„Zdd	„ Zd
d„ ZdS )ÚBearerToken)Úrequest_validatorÚtoken_generatorÚrefresh_token_generatorÚ
expires_inNc                 C   s*   || _ |pt| _|p| j| _|pd| _d S )Ni  )r‡   rk   rˆ   r‰   rŠ   )r   r‡   rˆ   rŠ   r‰   r   r   r   r     s
   
ÿzBearerToken.__init__Fc                 K   s¨   d|v r
t  dt¡ t| jƒr|  |¡n| j}||_|  |¡|ddœ}|jdur0d |j¡|d< |rH|jrA| j	 
|¡sA|j|d< n|  |¡|d< | |jpNi ¡ t|ƒS )	zÁ
        Create a BearerToken, by default without refresh token.

        :param request: OAuthlib request.
        :type request: oauthlib.common.Request
        :param refresh_token:
        Ú
save_tokenzx`save_token` has been deprecated, it was not called internally.If you do, call `request_validator.save_token()` instead.ÚBearer)rd   rŠ   Ú
token_typeNú r
   rj   )ÚwarningsÚwarnÚDeprecationWarningÚcallablerŠ   rˆ   r#   rB   rj   r‡   Úrotate_refresh_tokenr‰   ÚupdateÚextra_credentialsr	   )r   ri   rj   ro   rŠ   rG   r   r   r   Úcreate_token$  s(   þý
	
ÿzBearerToken.create_tokenc                 C   s   t |ƒ}| j ||j|¡S )r   )rw   r‡   Úvalidate_bearer_tokenr#   )r   ri   rG   r   r   r   r   K  s   ÿzBearerToken.validate_requestc                 C   s6   |j  dd¡ d¡d  ¡ dkrdS |jdurdS dS )	r   r2   r-   rŽ   r   rs   é	   Né   )rL   r   rt   r5   rd   r€   r   r   r   rƒ   T  s
    
zBearerToken.estimate_type)NNNNr„   )r(   r)   r*   r…   r   r–   r   rƒ   r   r   r   r   r†     s    
ÿ
	'	r†   )NNNr-   r.   Nr   r   )r-   r„   )Ú__doc__r6   rE   r   Úbinasciir   Úurllib.parser   Úoauthlibr   Úoauthlib.commonr   r   r-   r   Údictr	   rb   re   rf   rg   rk   rq   rw   rx   r†   r   r   r   r   Ú<module>   s4    	.
ùj


	