
    k7i                         S SK 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 r\" \5      rg)    N)Response)g)json)request)
LocalProxy)default_json_headers)ResourceProtector)OAuth1Errorc                   P    \ rS rSrSr SS jrSS jrS rS rS r	S	 r
SS
 jrSrg)r	      a  A protecting method for resource servers. Initialize a resource
protector with the these method:

1. query_client
2. query_token,
3. exists_nonce

Usually, a ``query_client`` method would look like (if using SQLAlchemy)::

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

A ``query_token`` method accept two parameters, ``client_id`` and ``oauth_token``::

    def query_token(client_id, oauth_token):
        return Token.query.filter_by(
            client_id=client_id, oauth_token=oauth_token
        ).first()

And for ``exists_nonce``, if using cache, we have a built-in hook to create this method::

    from authlib.integrations.flask_oauth1 import create_exists_nonce_func

    exists_nonce = create_exists_nonce_func(cache)

Then initialize the resource protector with those methods::

    require_oauth = ResourceProtector(
        app,
        query_client=query_client,
        query_token=query_token,
        exists_nonce=exists_nonce,
    )
Nc                 f    X l         X0l        X@l        Xl        U(       a  U R	                  U5        g g N)query_clientquery_token_exists_nonceappinit_app)selfr   r   r   exists_nonces        n/home/james-whalen/.local/lib/python3.13/site-packages/authlib/integrations/flask_oauth1/resource_protector.py__init__ResourceProtector.__init__2   s/     )&)MM#     c                     Ub  X l         Ub  X0l        Ub  X@l        UR                  R	                  S5      nU(       a!  [        U[        [        45      (       a  XPl        Xl	        g )N"OAUTH1_SUPPORTED_SIGNATURE_METHODS)
r   r   r   configget
isinstancelisttupleSUPPORTED_SIGNATURE_METHODSr   )r   r   r   r   r   methodss         r   r   ResourceProtector.init_app=   sW    # ,"*#!-**..!EFz'D%=99/6,r   c                 $    U R                  U5      $ r   )r   )r   	client_ids     r   get_client_by_id"ResourceProtector.get_client_by_idK   s      ++r   c                 N    U R                  UR                  UR                  5      $ r   )r   r%   token)r   r   s     r   get_token_credential&ResourceProtector.get_token_credentialN   s     1 17==AAr   c                     U R                   (       d  [        S5      eUR                  nUR                  nUR                  nU R                  XXE5      $ )Nz$"exists_nonce" function is required.)r   RuntimeError	timestampr%   r)   )r   noncer   r.   r%   r)   s         r   r   ResourceProtector.exists_nonceQ   sI    !!EFF%%	%%	!!%IEEr   c                     U R                  [        R                  [        R                  [        R                  R                  SS9[        R                  5      nUR                  [        l	        UR                  $ )NT)flat)
validate_request_reqmethodurlformto_dictheaders
credentialr    authlib_server_oauth1_credential)r   reqs     r   acquire_credential$ResourceProtector.acquire_credentialZ   sQ    ##KK499#4#4$#4#?
 .1^^*~~r   c                    ^  U 4S jnU$ )Nc                 J   >^  [         R                  " T 5      U U4S j5       nU$ )Nc                     >  TR                  5         T" U 0 UD6$ ! [         aP  n[        UR                  5       5      n[	        [
        R                  " U5      UR                  [        S9s S nA$ S nAff = f)N)statusr9   )	r=   r
   dictget_bodyr   r   dumpsstatus_coder   )argskwargserrorbodyfr   s       r   	decorated>ResourceProtector.__call__.<locals>.wrapper.<locals>.decoratedc   sn    ++- $)&)) #  01D#

4($00 4 s    
A5AA0*A50A5)	functoolswraps)rK   rL   r   s   ` r   wrapper+ResourceProtector.__call__.<locals>.wrapperb   s&    __Q
*  
* r    )r   scoperP   s   `  r   __call__ResourceProtector.__call__a   s    	  r   )r!   r   r   r   r   )NNNN)NNNr   )__name__
__module____qualname____firstlineno____doc__r   r   r&   r*   r   r=   rT   __static_attributes__rR   r   r   r	   r	      s4    !H KO	,BFr   r	   c                  .    [         R                  " S5      $ )Nr;   )r   r   rR   r   r   _get_current_credentialr]   u   s    55344r   )rN   flaskr   r   r   r   r4   werkzeug.localr   authlib.constsr   authlib.oauth1r	   _ResourceProtectorauthlib.oauth1.errorsr
   r]   current_credentialrR   r   r   <module>re      sC        ! % / B -d* dN5   78 r   