
    i[f                         d dl mZ d dlmZmZ d dlm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mZ  G d
 de	          ZddZddZdS )    )import_string)Responsejson)request)AuthorizationServer)BearerTokenGeneratorgenerate_token   )FlaskOAuth2RequestFlaskJsonRequest)client_authenticatedtoken_revokedc                   \     e Zd ZdZd fd	ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Z xZS )r   an  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)
    Nc                     t                                                       || _        || _        d | _        ||                     |           d S d S N)super__init___query_client_save_token_error_urisinit_app)selfappquery_client
save_token	__class__s       j/var/www/piapp/venv/lib/python3.11/site-packages/authlib/integrations/flask_oauth2/authorization_server.pyr   zAuthorizationServer.__init__)   sU    )%?MM# ?    c                    ||| _         ||| _        |                     d|                     |j                             |j                            d          | _        |j                            d          | _        dS )z)Initialize later with Flask app instance.NdefaultOAUTH2_SCOPES_SUPPORTEDOAUTH2_ERROR_URIS)r   r   register_token_generatorcreate_bearer_token_generatorconfiggetscopes_supportedr   )r   r   r   r   s       r   r   zAuthorizationServer.init_app1   sz    #!-D!)D%%i1S1STWT^1_1_``` #
/H I I:>>*=>>r   c                 ,    |                      |          S r   )r   )r   	client_ids     r   r   z AuthorizationServer.query_client<   s    !!),,,r   c                 .    |                      ||          S r   )r   )r   tokenr   s      r   r   zAuthorizationServer.save_token?   s    w///r   c                 p    | j         r.t          | j                   }|                    |j                  S d S r   )r   dictr'   error)r   r   r/   uriss       r   get_error_uriz!AuthorizationServer.get_error_uriB   s;     	)())D88EK(((	) 	)r   c                 *    t          t                    S r   )r   	flask_reqr   r   s     r   create_oauth2_requestz)AuthorizationServer.create_oauth2_requestG   s    !),,,r   c                 *    t          t                    S r   )r   r3   r4   s     r   create_json_requestz'AuthorizationServer.create_json_requestJ   s    	***r   c                 x    t          |t                    rt          j        |          }t	          |||          S )N)statusheaders)
isinstancer.   r   dumpsr   )r   status_codepayloadr:   s       r   handle_responsez#AuthorizationServer.handle_responseM   s8    gt$$ 	*j))GWEEEEr   c                 z    |dk    rt          j        | g|R i | d S |dk    rt          j        | g|R i | d S d S )Nafter_authenticate_clientafter_revoke_token)r   sendr   )r   nameargskwargss       r   send_signalzAuthorizationServer.send_signalR   sp    ... %d<T<<<V<<<<<)))t5d555f55555 *)r   c                    |                     dd          }t          |d          }|                     dd          }t          |d          }|                     d          }t          |          }t          |||          S )a  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%   z1AuthorizationServer.create_bearer_token_generatorX   s    @ zz94@@!7b!A!Azz:EBB"8r"B"Bzz";<<=lKK#"#
 
 	
r   )NNN)NN)__name__
__module____qualname____doc__r   r   r   r   r1   r5   r7   r?   rG   r%   __classcell__)r   s   @r   r   r      s         6     	? 	? 	? 	?- - -0 0 0) ) )
- - -+ + +F F F
6 6 6,
 ,
 ,
 ,
 ,
 ,
 ,
r   r   Nc                     t          | t                    rt          |           S i                     t          j                   t          | t                    r                    |            fd}|S )Nc                 D                         |t          j                  S r   )r'   r   DEFAULT_EXPIRES_IN)client
grant_typedatas     r   
expires_inz5create_token_expires_in_generator.<locals>.expires_in   s    xx
$8$KLLLr   )r;   strr   updater   GRANT_TYPES_EXPIRES_INr.   )expires_in_confr`   r_   s     @r   rO   rO      s    /3'' ._---DKK$;<<</4(( %O$$$M M M M M r   rJ   c                     t          |           r| S t          | t                    rt          |           S | du rfd}|S d S )NTc                  "    t                    S r   r	   )rE   rF   lengths     r   token_generatorz/create_token_generator.<locals>.token_generator   s    !&)))r   )callabler;   ra   r   )token_generator_confrg   rh   s    ` r   rN   rN      sn    $%% $##&,, 1222		%	%	* 	* 	* 	* 	* 
&	%r   r   )rJ   )werkzeug.utilsr   flaskr   r   r   r3   authlib.oauth2r   _AuthorizationServerauthlib.oauth2.rfc6750r   authlib.common.securityr
   requestsr   r   signalsr   r   rO   rN    r   r   <module>rt      s   ( ( ( ( ( (                 & & & & & &      8 7 7 7 7 7 2 2 2 2 2 2 : : : : : : : : 8 8 8 8 8 8 8 8w
 w
 w
 w
 w
. w
 w
 w
t   	 	 	 	 	 	r   