
     h:                         d dl 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 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Z G d d          ZdS )    N)	timedelta)OptionalTypeUnion)gettext_lazy)InvalidAlgorithmErrorInvalidTokenError
algorithms   )TokenBackendError)format_lazy)PyJWKClientPyJWKClientErrorTF>	   ES256ES384ES512HS256HS384HS512RS256RS384RS512c            	           e Zd Z	 	 	 	 	 	 	 ddedeeeef         dee	e
j                          fdZd Zdefd	Zd
 Zd ZddZdS )TokenBackendN jwk_urlleewayjson_encoderc	                     |                      |           || _        || _        || _        || _        || _        t          r|rt          |          nd | _        nd | _        || _	        || _
        d S )N)_validate_algorithm	algorithmsigning_keyverifying_keyaudienceissuerJWK_CLIENT_AVAILABLEr   jwks_clientr   r   )	selfr!   r"   r#   r$   r%   r   r   r   s	            ]/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/rest_framework_simplejwt/backends.py__init__zTokenBackend.__init__!   s     	  +++"&*  	$7>H{7333DD#D(    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     r)   r    z TokenBackend._validate_algorithm<   s    
 ...#A@AA9MM   
888AV8#GHH)    9888r+   returnc                 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   r.   type)r(   s    r)   
get_leewayzTokenBackend.get_leewayM   s    ;Q''''c5\22 	T[1111Y// 
	;#c  %%	   r+   c                     | 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 or expired)
r!   
startswithr"   r'   get_signing_key_from_jwtkeyr   r   r.   r#   )r(   tokenexs      r)   get_verifying_keyzTokenBackend.get_verifying_key^   s    >$$T** 	$## 	RR'@@GGKK# R R R'*G(H(HIIrQR !!s   A	 	
A5A00A5c                    |                                 }| 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%   jwtencoder"   r!   r   r4   bytesdecode)r(   payloadjwt_payloadr?   s       r)   rG   zTokenBackend.encodej   s     llnn=$!%K;"!%K
n*	
 
 
 eU## 	)<<(((r+   Tc                 j   	 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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 specifiedr;   )rF   rI   rA   r!   r$   r%   r8   r   r   r.   r	   )r(   r?   verifyr@   s       r)   rI   zTokenBackend.decode   s    	N:&&u-- N+{(("&-t";(.     % 	N 	N 	N#A&C$D$DEE2M  	N 	N 	N#A&C$D$DEE2M	Ns$   AA 
B2&BB2B--B2)Nr   NNNNN)T)__name__
__module____qualname__strr   r6   r5   r   r   r   jsonJSONEncoderr*   r    r8   rA   rG   rI    r+   r)   r   r       s         /39=) ) ) eS)+,) tD$456) ) ) )6  "I    "
" 
" 
"  ,N N N N N Nr+   r   )rU   datetimer   typingr   r   r   rF   django.utils.translationr   r.   r   r	   r
   
exceptionsr   utilsr   r   r   r&   ImportErrorr-   r   rW   r+   r)   <module>r^      s@          ( ( ( ( ( ( ( ( ( ( 



 6 6 6 6 6 6 D D D D D D D D D D ) ) ) ) ) )      !11111111 ! ! ! !
 
 
 xN xN xN xN xN xN xN xN xN xNs   
A A
A