
    logm                        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	m
Z
 d dlZd dlmZ d dlmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZ 	 d dlmZmZ dZn# e$ r dZY nw xY wh d                    ej                  Z  G d d          Z!dS )    N)Iterable)	timedelta)cached_property)AnyOptionalUnion)gettext_lazy)ExpiredSignatureErrorInvalidAlgorithmErrorInvalidTokenError
algorithms   )TokenBackendErrorTokenBackendExpiredToken)Token)format_lazy)PyJWKClientPyJWKClientErrorTF>	   ES256ES384ES512HS256HS384HS512RS256RS384RS512c                   |   e Zd Z	 	 	 	 	 	 	 ddedee         dedeeedf         dee         dee         d	eeee	df         d
ee
ej                          ddfdZedefd            Zedefd            Zdee         defdZdeddfdZde	fdZdedefdZdeeef         defdZddededeeef         fdZdS )TokenBackendN 	algorithmsigning_keyverifying_keyaudienceissuerjwk_urlleewayjson_encoderreturnc	                     |                      |           || _        || _        || _        || _        || _        t          r|rt          |          nd | _        nd | _        || _	        || _
        d S N)_validate_algorithmr!   r"   r#   r$   r%   JWK_CLIENT_AVAILABLEr   jwks_clientr'   r(   )	selfr!   r"   r#   r$   r%   r&   r'   r(   s	            \/var/www/html/nourish/venv/lib/python3.11/site-packages/rest_framework_simplejwt/backends.py__init__zTokenBackend.__init__)   s     	  +++"&*  	$7>H{7333DD#D(    c                 6    |                      | j                  S r+   )_prepare_keyr"   r/   s    r0   prepared_signing_keyz!TokenBackend.prepared_signing_keyD   s      !1222r2   c                 6    |                      | j                  S r+   )r4   r#   r5   s    r0   prepared_verifying_keyz#TokenBackend.prepared_verifying_keyH   s      !3444r2   keyc                     |t          t          j        dd           s|S t          j                                        | j                  }|                    |          S )Nget_algorithm_by_name)getattrjwtPyJWSr;   r!   prepare_key)r/   r9   jws_algs      r0   r4   zTokenBackend._prepare_keyL   sN    ;gci1H$OO;J)++33DNCC""3'''r2   c                     |t           vr*t          t          t          d          |                    |t          j        v r6t          j        s,t          t          t          d          |                    dS dS )z
        Ensure that the nominated algorithm is recognized, and that cryptography is installed for those
        algorithms that require it
        z Unrecognized algorithm type '{}'z/You must have cryptography installed to use {}.N)ALLOWED_ALGORITHMSr   r   _r   requires_cryptography
has_crypto)r/   r!   s     r0   r,   z TokenBackend._validate_algorithmS   s    
 ...#A@AA9MM   
888AV8#GHH)    9888r2   c                 V   | j         t          d          S t          | j         t          t          f          rt          | j                   S t          | j         t                    r| j         S t          t          t          d          t          | j                                       )Nr   )secondszIUnrecognized type '{}', 'leeway' must be of type int, float or timedelta.)	r'   r   
isinstanceintfloatr   r   rC   typer5   s    r0   
get_leewayzTokenBackend.get_leewayd   s    ;Q''''c5\22 	T[1111Y// 
	;#c  %%	   r2   tokenc                     | j                             d          r| j        S | j        rO	 | j                            |          j        S # t          $ r"}t          t          d                    |d }~ww xY w| j	        S )NHSToken is invalid)
r!   
startswithr6   r.   get_signing_key_from_jwtr9   r   r   rC   r8   )r/   rM   exs      r0   get_verifying_keyzTokenBackend.get_verifying_keyu   s    >$$T** 	-,, 	GG'@@GGKK# G G G'*<(=(=>>BFG **s   A	 	
A5A00A5payloadc                    |                                 }| j        
| j        |d<   | j        
| j        |d<   t          j        || j        | j        | j                  }t          |t                    r|
                    d          S |S )zL
        Returns an encoded token for the given payload dictionary.
        Naudiss)r!   r(   zutf-8)copyr$   r%   r=   encoder6   r!   r(   rH   bytesdecode)r/   rU   jwt_payloadrM   s       r0   rZ   zTokenBackend.encode   s     llnn=$!%K;"!%K
%n*	
 
 
 eU## 	)<<(((r2   Tverifyc                    	 t          j        ||                     |          | j        g| j        | j        |                                 | j        du|d          S # t          $ r"}t          t          d                    |d}~wt          $ r"}t          t          d                    |d}~wt          $ r"}t          t          d                    |d}~ww xY w)z
        Performs a validation of the given token and returns its payload
        dictionary.

        Raises a `TokenBackendError` if the token is malformed, if its
        signature check fails, or if its 'exp' claim indicates it has expired.
        N)
verify_audverify_signature)r   r$   r%   r'   optionszInvalid algorithm specifiedzToken is expiredrP   )r=   r\   rT   r!   r$   r%   rL   r   r   rC   r
   r   r   )r/   rM   r^   rS   s       r0   r\   zTokenBackend.decode   s   	C:&&u-- N+{(("&-t";(.     % 	N 	N 	N#A&C$D$DEE2M$ 	J 	J 	J*1-?+@+@AArI  	C 	C 	C#A&8$9$9::B	Cs0   AA 
C&BCB--C:CC)Nr    NNNNN)T)__name__
__module____qualname__strr   r   r   rJ   rI   r   rK   jsonJSONEncoderr1   r   r   r6   r8   r4   r,   rL   r   rT   dictrZ   boolr\    r2   r0   r   r   (   s        &*/3 $!%599=) )) c]) 	)
 Xt+,) ) #) eS)T12) tD$456) 
) ) ) )6 3c 3 3 3 _3 5 5 5 5 _5( (# ( ( ( (S T    "I    "
+u 
+ 
+ 
+ 
+ 
+d38n     ,C CE C4 C4S> C C C C C Cr2   r   )"rg   collections.abcr   datetimer   	functoolsr   typingr   r   r   r=   django.utils.translationr	   rC   r
   r   r   r   
exceptionsr   r   tokensr   utilsr   r   r   r-   ImportErrorunionrD   rB   r   rk   r2   r0   <module>rv      s    $ $ $ $ $ $       % % % % % % ' ' ' ' ' ' ' ' ' ' 



 6 6 6 6 6 6            D C C C C C C C            !11111111 ! ! ! !
 
 
 %
()) IC IC IC IC IC IC IC IC IC ICs   
A A! A!