o
    ǯhm                     @   s   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 zd dlmZmZ dZW n eya   dZY nw h dejZ G d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                   @   s  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dZedefddZedefddZdee defddZdeddfddZde	fddZdedefddZdeeef defddZd$ded edeeef fd!d"ZdS )%TokenBackendN 	algorithmsigning_keyverifying_keyaudienceissuerjwk_urlleewayjson_encoderreturnc	           	      C   sV   |  | || _|| _|| _|| _|| _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&    r-   ^/var/www/Befach/backend/venv/lib/python3.10/site-packages/rest_framework_simplejwt/backends.py__init__)   s   

zTokenBackend.__init__c                 C      |  | jS r(   )_prepare_keyr    r,   r-   r-   r.   prepared_signing_keyD      z!TokenBackend.prepared_signing_keyc                 C   r0   r(   )r1   r!   r2   r-   r-   r.   prepared_verifying_keyH   r4   z#TokenBackend.prepared_verifying_keykeyc                 C   s4   |d u st tjdd s|S t | j}||S )Nget_algorithm_by_name)getattrjwtPyJWSr7   r   prepare_key)r,   r6   jws_algr-   r-   r.   r1   L   s   
zTokenBackend._prepare_keyc                 C   sD   |t vrtttd||tjv rt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   r-   r-   r.   r)   S   s   z TokenBackend._validate_algorithmc                 C   sZ   | j d u r
tddS t| j ttfrt| j d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>   typer2   r-   r-   r.   
get_leewayd   s   

zTokenBackend.get_leewaytokenc              
   C   sV   | j dr	| jS | jr(z| j|jW S  ty' } zttd|d }~ww | j	S )NHSToken is invalid)
r   
startswithr3   r+   get_signing_key_from_jwtr6   r   r   r>   r5   )r,   rG   exr-   r-   r.   get_verifying_keyu   s   zTokenBackend.get_verifying_keypayloadc                 C   s`   |  }| jdur| j|d< | jdur| j|d< tj|| j| j| jd}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#   r9   encoder3   r   r&   rB   bytesdecode)r,   rN   jwt_payloadrG   r-   r-   r.   rR      s   





zTokenBackend.encodeTverifyc              
   C   s   zt j|| || jg| j| j|  | jdu|ddW S  ty/ } ztt	d|d}~w t
yA } ztt	d|d}~w tyS } ztt	d|d}~w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 expiredrI   )r9   rT   rM   r   r"   r#   rF   r
   r   r>   r	   r   r   )r,   rG   rV   rL   r-   r-   r.   rT      s,   zTokenBackend.decode)Nr   NNNNN)T)__name__
__module____qualname__strr   r   r   rD   rC   r   rE   jsonJSONEncoderr/   r   r   r3   r5   r1   r)   rF   r   rM   dictrR   boolrT   r-   r-   r-   r.   r   (   sJ    	

$r   )"r^   collections.abcr   datetimer   	functoolsr   typingr   r   r   r9   django.utils.translationr   r>   r	   r
   r   r   
exceptionsr   r   tokensr   utilsr   r   r   r*   ImportErrorunionr?   r=   r   r-   r-   r-   r.   <module>   s*    
