o
    b                     @   s   d dl 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 d dlmZ G d	d
 d
eZdd ZeeZdS )    N)jsonResponse)request)_app_ctx_stack)
LocalProxy)default_json_headers)ResourceProtector)OAuth1Errorc                   @   sV   e Zd ZdZ		dddZ		dddZdd Zd	d
 Zdd Zdd Z	dddZ
dS )r   a  A protecting method for resource servers. Initialize a resource
    protector with the query_token method::

        from authlib.integrations.flask_oauth1 import ResourceProtector, current_credential
        from authlib.integrations.flask_oauth1 import create_exists_nonce_func
        from authlib.integrations.sqla_oauth1 import (
            create_query_client_func,
            create_query_token_func,
        )
        from your_project.models import Token, User, cache

        # you need to define a ``cache`` instance yourself

        require_oauth= ResourceProtector(
            app,
            query_client=create_query_client_func(db.session, OAuth1Client),
            query_token=create_query_token_func(db.session, OAuth1Token),
            exists_nonce=create_exists_nonce_func(cache)
        )
        # or initialize it lazily
        require_oauth = ResourceProtector()
        require_oauth.init_app(
            app,
            query_client=create_query_client_func(db.session, OAuth1Client),
            query_token=create_query_token_func(db.session, OAuth1Token),
            exists_nonce=create_exists_nonce_func(cache)
        )
    Nc                 C   s.   || _ || _|| _|| _|r| | d S d S N)query_clientquery_token_exists_nonceappinit_app)selfr   r   r   exists_nonce r   s/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/integrations/flask_oauth1/resource_protector.py__init__(   s   zResourceProtector.__init__c                 C   sX   |d ur|| _ |d ur|| _|d ur|| _|jd}|r't|ttfr'|| _|| _	d S )NZ"OAUTH1_SUPPORTED_SIGNATURE_METHODS)
r   r   r   configget
isinstancelisttupleZSUPPORTED_SIGNATURE_METHODSr   )r   r   r   r   r   methodsr   r   r   r   2   s   
zResourceProtector.init_appc                 C   s
   |  |S r
   )r   )r   	client_idr   r   r   get_client_by_idA   s   
z"ResourceProtector.get_client_by_idc                 C   s   |  |j|jS r
   )r   r   token)r   r   r   r   r   get_token_credentialD   s   z&ResourceProtector.get_token_credentialc                 C   s0   | j std|j}|j}|j}|  ||||S )Nz$"exists_nonce" function is required.)r   RuntimeError	timestampr   r   )r   noncer   r    r   r   r   r   r   r   G   s   zResourceProtector.exists_noncec                 C   s4   |  tjtjtjjddtj}tj}|j	|_
|j	S )NT)Zflat)Zvalidate_request_reqmethodurlformto_dictheadersr   topZ
credential authlib_server_oauth1_credential)r   reqctxr   r   r   acquire_credentialP   s   z$ResourceProtector.acquire_credentialc                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc               
      sb   z   W n# ty) } zt| }tt||jtdW  Y d }~S d }~ww  | i |S )N)statusr'   )	r,   r	   dictget_bodyr   r   dumpsstatus_coder   )argskwargserrorbody)fr   r   r   	decorated]   s   z>ResourceProtector.__call__.<locals>.wrapper.<locals>.decorated)	functoolswraps)r6   r7   r   )r6   r   wrapper\   s   z+ResourceProtector.__call__.<locals>.wrapperr   )r   scoper;   r   r:   r   __call__[   s   zResourceProtector.__call__)NNNN)NNNr
   )__name__
__module____qualname____doc__r   r   r   r   r   r,   r=   r   r   r   r   r      s    


	r   c                  C   s   t j} t| dd S )Nr)   )r   r(   getattr)r+   r   r   r   _get_current_credentialm   s   rC   )r8   Zflaskr   r   r   r"   r   Zwerkzeug.localr   Zauthlib.constsr   Zauthlib.oauth1r   Z_ResourceProtectorZauthlib.oauth1.errorsr	   rC   Zcurrent_credentialr   r   r   r   <module>   s    b