
    ?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y)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 )
OAuth2Tokenc                 :   t         |   |       d | _        d|v r+|d   r&t        t	        j
                  |d               | _        |Bt        t	        j
                  |            | _        | j                  | j                  | _        y y | j                  | _        y )Nscope)super__init__
_new_scopesetr	   scope_to_list
_old_scope)selfparams	old_scope	__class__s      S/var/www/openai/venv/lib/python3.12/site-packages/oauthlib/oauth2/rfc6749/tokens.pyr   zOAuth2Token.__init__   s     f!%"5"5fWo"FGDO !%"5"5i"@ADO& #'// '
 #ooDO    c                 4    | j                   | j                  k7  S N)r   r   r   s    r   scope_changedzOAuth2Token.scope_changed&   s    $//11r   c                 @    t        j                  | j                        S r   )r	   list_to_scoper   r   s    r   r   zOAuth2Token.old_scope*       ""4??33r   c                 ,    t        | j                        S r   )listr   r   s    r   
old_scopeszOAuth2Token.old_scopes.       DOO$$r   c                 @    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                 F    t        | j                  | j                  z
        S r   )r"   r   r   r   s    r   missing_scopeszOAuth2Token.missing_scopes:       DOOdoo566r   c                 F    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 4 4 % % 4 4 % % 7 7 7 7r   r   c                 Z   |j                         }t        j                  |      \  }}|j                         dk(  rt        j
                  }n/|j                         dk(  rt        j                  }nt        d      |
dk(  r<|xs7 dj                  t        j                  |	      t        j                               }n(t        j                         }t        j                         }t        |      \  }}}}}}|r	|dz   |z   }n|}|H|
dk(  rC|j                  d      }t         ||      j!                               dd	 j#                  d      }nd
}g }|
dk(  r|j%                  |       n"|j%                         |j%                  |       |j%                  |j                                |j%                  |       |j%                  |       |j%                  |       |
dk(  r|j%                  |       |j%                  |xs d
       dj'                  |      dz   }t)        |t*              r|j                  d      }t-        j.                  ||j                  d      |      }t        |j!                               dd	 j#                  d      }g }|j%                  d| z         |
dk7  r|j%                  dz         |j%                  d|z         |r|j%                  d|z         |r|j%                  d|z         |j%                  d|z         |xs i }dj'                  |      |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.
    
hmac-sha-1zhmac-sha-256zunknown hash algorithmr   z{}:{}?Nzutf-8 
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$-LL				>	1NN122z C(:(::(F*0*?*?*AC &&(%%'&.sm#CdCSj5( EQJ{{7#agnn./4;;GD DzEBEKK!!#$KKKKKKzHKK	r))D/D(K #sjj!88C++G4a8Ddkkm$Sb)009DF
MM-%'(zi"n%
MM,&'o01
j3&'
MM*t#$mG#yy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                 "    |xs 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   c                 *    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Ar   rm   )r{   rz   r|   s   `` r   r|   r|      s    B "!r   c                     d}d| j                   v rT| j                   j                  d      j                         }t        |      dk(  r|d   j	                         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.
    Nr8      r   bearerr   )rR   getsplitlenr;   rj   )rs   rM   split_headers      r   get_token_from_headerr      su     E'//)**?;AAC|!l1o&;&;&=&I OE L $$Lr   c                   $    e Zd ZdZddZd Zd Zy)	TokenBaserm   c                     t        d      )N&Subclasses must implement this method.NotImplementedError)r   rs   rt   s      r   __call__zTokenBase.__call__  s    !"J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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     s    ILLLr   r   c                   0    e Zd ZdZ	 	 ddZddZd Zd Zy)	BearerToken)request_validatortoken_generatorrefresh_token_generator
expires_inNc                 p    || _         |xs t        | _        |xs | j                  | _        |xs d| _        y )Ni  )r   ru   r   r   r   )r   r   r   r   r   s        r   r   zBearerToken.__init__  s<    !2.H2H#;t';'; 	$ %,r   c                    d|v rt        j                  dt               t        | j                        r| j	                  |      }n| j                  }||_        | j                  |      |dd}|j                  dj                  |j                        |d<   |rK|j                  r+| j                  j                  |      s|j                  |d<   n| j                  |      |d<   |j                  |j                  xs 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_type 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!MM V,. DOO$1JJ' !009$"
 >>% XXgnn5E'N%%..CCGL)0)>)>o&)-)E)Eg)No&W..4"55!!r   c                 f    t        |      }| j                  j                  ||j                  |      S )r   )r   r   validate_bearer_tokenr'   )r   rs   rM   s      r   r   zBearerToken.validate_requestQ  s2    
 &g.%%;;7>>7, 	,r   c                     |j                   j                  dd      j                  d      d   j                         dk(  ry|j                  yy)r   r8   r6   r   r   r   	      )rR   r   r   r;   rj   r   s     r   r   zBearerToken.estimate_typeZ  sK    
 ??399#>qAGGIXU!!-r   )NNNNr   )r-   r.   r/   r   r   r   r   r   rm   r   r   r   r     s(    I
 @D:>-("T,
r   r   )NNNr6   r3   Nr   r   )r6   r   )__doc__r<   rK   r   binasciir   urllib.parser   oauthlibr   oauthlib.commonr   r   r6   r	   dictr   rh   rk   rn   rp   ru   r|   r   r   r   rm   r   r   <module>r      s        !  ? *7$ *7\ "# &2"&jZ? 
?#"(L L*L) Lr   