
    rhe                        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h dj=                  ej>                        Z  G d d      Z!y# e$ r dZY 1w xY w)    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y)TokenBackendN	algorithmsigning_keyverifying_keyaudienceissuerjwk_urlleewayjson_encoderreturnc	                     | j                  |       || _        || _        || _        || _        || _        t        r|rt        |      nd | _        nd | _        || _	        || _
        y N)_validate_algorithmr    r!   r"   r#   r$   JWK_CLIENT_AVAILABLEr   jwks_clientr&   r'   )	selfr    r!   r"   r#   r$   r%   r&   r'   s	            t/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/rest_framework_simplejwt/backends.py__init__zTokenBackend.__init__)   sb     	  +"&* 7>{73DD#D(    c                 8    | j                  | j                        S r*   )_prepare_keyr!   r.   s    r/   prepared_signing_keyz!TokenBackend.prepared_signing_keyD   s      !1!122r1   c                 8    | j                  | j                        S r*   )r3   r"   r4   s    r/   prepared_verifying_keyz#TokenBackend.prepared_verifying_keyH   s      !3!344r1   keyc                     |t        t        j                  dd       s|S t        j                         j                  | j                        }|j                  |      S )Nget_algorithm_by_name)getattrjwtPyJWSr:   r    prepare_key)r.   r8   jws_algs      r/   r3   zTokenBackend._prepare_keyL   sG    ;gcii1H$OJ))+33DNNC""3''r1   c                     |t         vrt        t        t        d      |            |t        j
                  v r/t        j                  st        t        t        d      |            yy)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_algorithmS   sl    
 ..#A@A9M  
888AVAV#GH)  BW8r1   c                 L   | 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   rB   typer4   s    r/   
get_leewayzTokenBackend.get_leewayd   s~    ;;Q''c5\2T[[11Y/;;#c %	 r1   tokenc                    | j                   j                  d      r| j                  S | j                  r&	 | j                  j	                  |      j
                  S | j                  S # t        $ r}t        t        d            |d }~ww xY w)NHSToken is invalid)
r    
startswithr5   r-   get_signing_key_from_jwtr8   r   r   rB   r7   )r.   rL   es      r/   get_verifying_keyzTokenBackend.get_verifying_keyu   s    >>$$T*,,,F''@@GKKK *** $ F'*<(=>AEFs   $A& &	B	/BB	payloadc                 B   |j                         }| j                  | j                  |d<   | j                  | j                  |d<   t        j                  || j
                  | j                  | j                        }t        |t              r|j                  d      S |S )zL
        Returns an encoded token for the given payload dictionary.
        audiss)r    r'   zutf-8)copyr#   r$   r<   encoder5   r    r'   rG   bytesdecode)r.   rT   jwt_payloadrL   s       r/   rY   zTokenBackend.encode   s     lln==$!%K;;"!%K

%%nn**	
 eU#<<((r1   verifyc                    	 t        j                  || j                  |      | j                  g| j                  | 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 expiredrO   )r<   r[   rS   r    r#   r$   rK   r   r   rB   r
   r   r   )r.   rL   r]   rR   s       r/   r[   zTokenBackend.decode   s    	B::&&u- NN+{{("&--t";(.  % 	M#A&C$DE1L$ 	I*1-?+@AqH  	B#A&8$9:A	Bs0   A&A) )	C2BCB((C4C		C)N NNNNN)T)__name__
__module____qualname__strr   r   r   rI   rH   r   rJ   jsonJSONEncoderr0   r   r   r5   r7   r3   r+   rK   r   rS   dictrY   boolr[    r1   r/   r   r   (   sl    &*/3 $!%599=)) c]) 	)
 Xt+,) ) #) eS)T12) tD$4$456) 
)6 3c 3 3 5 5 5( (# (S T "I "
+u 
+ 
+d38n  ,BE B4 B4S> Br1   r   )"rg   collections.abcr   datetimer   	functoolsr   typingr   r   r   r<   django.utils.translationr	   rB   r
   r   r   r   
exceptionsr   r   tokensr   utilsr   r   r   r,   ImportErrorunionrC   rA   r   rk   r1   r/   <module>rv      s     $  % ' ' 
 6  D  !1
 %
(() IB IB!  ! !s   
A> >BB