
    k7i                         S SK Jr  S SK Jr  S SK Jr  S SKJr  S SKJr  S SK	J
r  S SKJr  SS	KJr  SS
KJr  SSKJr  SSKJr   " S S\5      r
SS jrSS jrg)    )Response)json)request)import_stringgenerate_token)AuthorizationServer)BearerTokenGenerator   )FlaskJsonRequest)FlaskOAuth2Request)client_authenticated)token_revokedc                   p   ^  \ rS rSrSrSU 4S jjrSS jrS rS rS r	S r
S	 rS
 rS rS rS rSrU =r$ )r	      a  Flask implementation of :class:`authlib.oauth2.rfc6749.AuthorizationServer`.
Initialize it with ``query_client``, ``save_token`` methods and Flask
app instance::

    def query_client(client_id):
        return Client.query.filter_by(client_id=client_id).first()


    def save_token(token, request):
        if request.user:
            user_id = request.user.id
        else:
            user_id = None
        client = request.client
        tok = Token(client_id=client.client_id, user_id=user.id, **token)
        db.session.add(tok)
        db.session.commit()


    server = AuthorizationServer(app, query_client, save_token)
    # or initialize lazily
    server = AuthorizationServer()
    server.init_app(app, query_client, save_token)
c                 r   > [         TU ]  5         X l        X0l        S U l        Ub  U R                  U5        g g N)super__init___query_client_save_token_error_urisinit_app)selfappquery_client
save_token	__class__s       p/home/james-whalen/.local/lib/python3.13/site-packages/authlib/integrations/flask_oauth2/authorization_server.pyr   AuthorizationServer.__init__*   s8    )%?MM#     c                 ^    Ub  X l         Ub  X0l        U R                  UR                  5        g)z)Initialize later with Flask app instance.N)r   r   load_configconfig)r   r   r   r   s       r   r   AuthorizationServer.init_app2   s,    #!-!)$r!   c                     U R                  SU R                  U5      5        UR                  S5      U l        UR                  S5      U l        g )NdefaultOAUTH2_SCOPES_SUPPORTEDOAUTH2_ERROR_URIS)register_token_generatorcreate_bearer_token_generatorgetscopes_supportedr   )r   r$   s     r   r#   AuthorizationServer.load_config:   sF    %%t99&A	
 !'

+D E!::&9:r!   c                 $    U R                  U5      $ r   )r   )r   	client_ids     r   r    AuthorizationServer.query_clientA   s    !!),,r!   c                 $    U R                  X5      $ r   )r   )r   tokenr   s      r   r   AuthorizationServer.save_tokenD   s    //r!   c                     U R                   (       a0  [        U R                   5      nUR                  UR                  5      $ g r   )r   dictr,   error)r   r   r7   uriss       r   get_error_uri!AuthorizationServer.get_error_uriG   s3    (()D88EKK(( r!   c                      [        [        5      $ r   )r   	flask_reqr   r   s     r   create_oauth2_request)AuthorizationServer.create_oauth2_requestL   s    !),,r!   c                      [        [        5      $ r   )r   r<   r=   s     r   create_json_request'AuthorizationServer.create_json_requestO   s    	**r!   c                 l    [        U[        5      (       a  [        R                  " U5      n[	        X!US9$ )N)statusheaders)
isinstancer6   r   dumpsr   )r   status_codepayloadrE   s       r   handle_response#AuthorizationServer.handle_responseR   s*    gt$$jj)GWEEr!   c                     US:X  a  [         R                  " U /UQ70 UD6  g US:X  a  [        R                  " U /UQ70 UD6  g g )Nafter_authenticate_clientafter_revoke_token)r   sendr   )r   nameargskwargss       r   send_signalAuthorizationServer.send_signalW   sI    .. %%d<T<V<))t5d5f5 *r!   c                     UR                  SS5      n[        US5      nUR                  SS5      n[        US5      nUR                  S5      n[        U5      n[        X4U5      $ )aO  Create a generator function for generating ``token`` value. This
method will create a Bearer Token generator with
:class:`authlib.oauth2.rfc6750.BearerToken`.

Configurable settings:

1. OAUTH2_ACCESS_TOKEN_GENERATOR: Boolean or import string, default is True.
2. OAUTH2_REFRESH_TOKEN_GENERATOR: Boolean or import string, default is False.
3. OAUTH2_TOKEN_EXPIRES_IN: Dict or import string, default is None.

By default, it will not generate ``refresh_token``, which can be turn on by
configure ``OAUTH2_REFRESH_TOKEN_GENERATOR``.

Here are some examples of the token generator::

    OAUTH2_ACCESS_TOKEN_GENERATOR = "your_project.generators.gen_token"

    # and in module `your_project.generators`, you can define:


    def gen_token(client, grant_type, user, scope):
        # generate token according to these parameters
        token = create_random_token()
        return f"{client.id}-{user.id}-{token}"

Here is an example of ``OAUTH2_TOKEN_EXPIRES_IN``::

    OAUTH2_TOKEN_EXPIRES_IN = {
        "authorization_code": 864000,
        "urn:ietf:params:oauth:grant-type:jwt-bearer": 3600,
    }
OAUTH2_ACCESS_TOKEN_GENERATORT*   OAUTH2_REFRESH_TOKEN_GENERATORF0   OAUTH2_TOKEN_EXPIRES_IN)r,   create_token_generator!create_token_expires_in_generatorr
   )r   r$   confaccess_token_generatorrefresh_token_generatorexpires_confexpires_generators          r   r+   1AuthorizationServer.create_bearer_token_generator]   sn    B zz94@!7b!Azz:EB"8r"Bzz";<=lK#"=N
 	
r!   )r   r   r   r-   )NNN)NN)__name__
__module____qualname____firstlineno____doc__r   r   r#   r   r   r9   r>   rA   rJ   rS   r+   __static_attributes____classcell__)r   s   @r   r	   r	      sE    2%;-0)
-+F
6+
 +
r!   r	   Nc                    ^ [        U [        5      (       a  [        U 5      $ 0 mTR                  [        R
                  5        [        U [        5      (       a  TR                  U 5        U4S jnU$ )Nc                 D   > TR                  U[        R                  5      $ r   )r,   r
   DEFAULT_EXPIRES_IN)client
grant_typedatas     r   
expires_in5create_token_expires_in_generator.<locals>.expires_in   s    xx
$8$K$KLLr!   )rF   strr   updater
   GRANT_TYPES_EXPIRES_INr6   )expires_in_confrp   ro   s     @r   r\   r\      sZ    /3''_--DKK$;;</4((O$M r!   c                    ^ [        U 5      (       a  U $ [        U [        5      (       a  [        U 5      $ U SL a  U4S jnU$ g )NTc                     > [        T5      $ r   r   )rQ   rR   lengths     r   token_generator/create_token_generator.<locals>.token_generator   s    !&))r!   )callablerF   rr   r   )token_generator_confrx   ry   s    ` r   r[   r[      sI    $%%##&,,122		%	*  
&r!   r   )rW   )flaskr   r   r   r<   werkzeug.utilsr   authlib.common.securityr   authlib.oauth2r	   _AuthorizationServerauthlib.oauth2.rfc6750r
   requestsr   r   signalsr   r   r\   r[    r!   r   <module>r      s@      & ( 2 F 7 & ( ) "x
. x
vr!   