
    &gl+                         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
e          Z	 	 	 	 	 	 	 ddZd ZddZddZddZd Zd Z G d d          Z G 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                        e Zd Zd
 fd	Zed             Zed             Zed             Zed             Zed             Z	ed             Z
ed	             Z xZS )OAuth2TokenNc                 ^   t                                          |           d | _        d|v r4|d         r,t          t	          j        |d                             | _        |=t          t	          j        |                    | _        | j        | j        | _        d S d S | j        | _        d S )Nscope)super__init__
_new_scopesetr	   scope_to_list
_old_scope)selfparams	old_scope	__class__s      P/var/www/api/venv/lib/python3.11/site-packages/oauthlib/oauth2/rfc6749/tokens.pyr   zOAuth2Token.__init__   s       f!%"5fWo"F"FGGDO !%"5i"@"@AADO& #'/ '&
 #oDOOO    c                 "    | j         | j        k    S N)r   r   r   s    r   scope_changedzOAuth2Token.scope_changed&   s    $/11r   c                 4    t          j        | j                  S r   )r	   list_to_scoper   r   s    r   r   zOAuth2Token.old_scope*       "4?333r   c                 *    t          | j                  S r   )listr   r   s    r   
old_scopeszOAuth2Token.old_scopes.       DO$$$r   c                 4    t          j        | j                  S r   )r	   r   r   r   s    r   r   zOAuth2Token.scope2   r    r   c                 *    t          | j                  S r   )r"   r   r   s    r   scopeszOAuth2Token.scopes6   r$   r   c                 :    t          | j        | j        z
            S r   )r"   r   r   r   s    r   missing_scopeszOAuth2Token.missing_scopes:       DOdo5666r   c                 :    t          | j        | j        z
            S r   )r"   r   r   r   s    r   additional_scopeszOAuth2Token.additional_scopes>   r*   r   r   )__name__
__module____qualname__r   propertyr   r   r#   r   r'   r)   r,   __classcell__)r   s   @r   r   r      s        . . . . . . 2 2 X2 4 4 X4 % % X% 4 4 X4 % % X% 7 7 X7 7 7 X7 7 7 7 7r   r    
hmac-sha-1c                 l   |                                 }t          j        |          \  }}|                                dk    rt          j        }n4|                                dk    rt          j        }nt          d          |
dk    r<|p8d                    t          j	        |	          t          j                              }n&t          j                    }t          j                    }t          |          \  }}}}}}|r	|dz   |z   }n|}|a|
dk    r[|                    d          }t           ||                                                    dd	                             d          }nd
}g }|
dk    r|                    |           n*|                    |           |                    |           |                    |                                            |                    |           |                    |           |                    |           |
dk    r|                    |           |                    |pd
           d                    |          dz   }t)          |t*                    r|                    d          }t-          j        ||                    d          |          }t          |                                          dd	                             d          }g }|                    d| z             |
dk    r|                    d|z             |                    d|z             |r|                    d|z             |r|                    d|z             |                    d|z             |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.
    r3   zhmac-sha-256zunknown hash algorithmr   z{}:{}?Nzutf-8r2   
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headers                              r   prepare_mac_headerrh   C   s   P ##%%K$S))JD$--L					>	1	1N1222zz C(::(F(F*0*?*A*AC C &((%''&.smm#CdC Sj5( EQJJ{{7##aaggnn..//4;;GDD DzzEBEKK!!##$$$KKKKKKzzHKK	r))D//D(K #s "jj!!8C++G44a88Ddkkmm$$SbS)0099DF
MM-%'(((zzi"n%%%
MM,&''' 2o0111
 (j3&'''
MM*t#$$$mG#yy00GONr   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   )rM   rN   s     r   prepare_bearer_urirk      s     S^U$;"=>>>r   c                     |pi }d| z  |d<   |S )zAdd 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 %sr8    )rM   rR   s     r   prepare_bearer_headersrn      s!     mG*U2GONr   c                 (    t          |d| fg          S )zAdd a `Bearer Token`_ to the request body.

    access_token=h480djs93hd8

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

    :param token:
    :param body:
    rj   )r   )rM   rS   s     r   prepare_bearer_bodyrp      s     D^U$;"=>>>r   Fc                 (    t          j                    S )zp
    :param request: OAuthlib request.
    :type request: oauthlib.common.Request
    :param refresh_token:
    )r   generate_token)requestrefresh_tokens     r   random_token_generatorru      s      """r   c                       fd}|S )z
    :param private_pem:
    c                 <    | _         t          j        |           S r   )claimsr   generate_signed_token)rs   kwargsprivate_pems    r   signed_token_generatorz6signed_token_generator.<locals>.signed_token_generator   s    +KAAAr   rm   )r{   rz   r|   s   `` r   r|   r|      s0    B B B B B B "!r   c                     d}d| j         v rf| j                             d                                          }t          |          dk    r&|d                                         dk    r|d         }n| 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.
    Nr8      r   bearerr   )rR   getsplitlenr;   rj   )rs   rM   split_headers      r   get_token_from_headerr      s{     E'/))**?;;AACC|!!l1o&;&;&=&=&I&I OE$Lr   c                   &    e Zd ZdZddZd Zd ZdS )	TokenBaserm   Fc                      t          d          )N&Subclasses must implement this method.NotImplementedError)r   rs   rt   s      r   __call__zTokenBase.__call__  s    !"JKKKr   c                      t          d          b
        :param request: OAuthlib request.
        :type request: oauthlib.common.Request
        r   r   r   rs   s     r   validate_requestzTokenBase.validate_request	      
 ""JKKKr   c                      t          d          r   r   r   s     r   estimate_typezTokenBase.estimate_type  r   r   NF)r-   r.   r/   	__slots__r   r   r   rm   r   r   r   r     sW        IL L L LL L LL L L L Lr   r   c                   2    e Zd ZdZ	 	 ddZd	dZd Zd ZdS )
BearerToken)request_validatortoken_generatorrefresh_token_generator
expires_inNc                 ^    || _         |pt          | _        |p| j        | _        |pd| _        d S )Ni  )r   ru   r   r   r   )r   r   r   r   r   s        r   r   zBearerToken.__init__  s=    !2.H2H#;t'; 	$ %,r   Fc                 
   d|v rt          j        dt                     t          | j                  r|                     |          }n| j        }||_        |                     |          |dd}|j        d                    |j                  |d<   |rD|j        r%| j	        
                    |          s|j        |d<   n|                     |          |d<   |                    |j        pi            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)rj   r   
token_typeN r   rt   )warningswarnDeprecationWarningcallabler   r   r'   rH   rt   r   rotate_refresh_tokenr   updateextra_credentialsr   )r   rs   rt   rz   r   rM   s         r   create_tokenzBearerToken.create_token'  s'    6!!M V,. . . DO$$ 	)11JJJ' !0099$"
 
 >% XXgn55E'N 	O% O.CCGLLO)0)>o&&)-)E)Eg)N)No&W.4"5555!!!r   c                 b    t          |          }| j                            ||j        |          S )r   )r   r   validate_bearer_tokenr'   )r   rs   rM   s      r   r   zBearerToken.validate_requestQ  s5    
 &g..%;;7>7, , 	,r   c                     |j                             dd                              d          d                                         dk    rdS |j        dS dS )	r   r8   r2   r   r   r   	   N   )rR   r   r   r;   rj   r   s     r   r   zBearerToken.estimate_typeZ  sX    
 ?3399#>>qAGGIIXUU1!-11r   )NNNNr   )r-   r.   r/   r   r   r   r   r   rm   r   r   r   r     sl        I
 @D:>- - - -(" (" (" ("T, , ,
 
 
 
 
r   r   )NNNr2   r3   Nr   r   )r2   r   )__doc__r<   rK   r   binasciir   urllib.parser   oauthlibr   oauthlib.commonr   r   r2   r	   dictr   rh   rk   rn   rp   ru   r|   r   r   r   rm   r   r   <module>r      s             ! ! ! ! ! !       ? ? ? ? ? ? ? ?      *7 *7 *7 *7 *7$ *7 *7 *7\ "# &2"&j j j jZ? ? ?    
? 
? 
? 
?# # # #" " "  (L L L L L L L L*L L L L L) L L L L Lr   