U
    cc:                  	   @   s   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 zd d	lmZmZ d
ZW n ek
r   dZY nX dddddddddh	ZG dd dZdS )    N)	timedelta)OptionalTypeUnion)gettext_lazy)InvalidAlgorithmErrorInvalidTokenError
algorithms   )TokenBackendError)format_lazy)PyJWKClientPyJWKClientErrorTFZHS256ZHS384ZHS512ZRS256ZRS384ZRS512ZES256ZES384ZES512c                   @   sd   e Zd Zdeeeeef ee	e
j  dddZdd Zedd	d
Zdd Zdd ZdddZdS )TokenBackendN )jwk_urlleewayjson_encoderc	           	      C   sV   |  | || _|| _|| _|| _|| _tr@|r8t|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    r   [/var/www/html/project/venv/lib/python3.8/site-packages/rest_framework_simplejwt/backends.py__init__!   s    
zTokenBackend.__init__c                 C   s@   |t krtttd||tjkr<tjs<tttd|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	   Zrequires_cryptographyZ
has_crypto)r   r   r   r   r   r   <   s     z TokenBackend._validate_algorithm)returnc                 C   s^   | j d krtddS t| j ttfr0t| j dS t| j trB| j S tttdt| j d S )Nr   )secondszIUnrecognized type '{}', 'leeway' must be of type int, float or timedelta.)	r   r   
isinstanceintfloatr   r   r!   type)r   r   r   r   
get_leewayM   s    

zTokenBackend.get_leewayc              
   C   s`   | j dr| jS | jrZz| j|jW S  tk
rX } zttd|W 5 d }~X Y nX | j	S )NZHSToken is invalid or expired)
r   
startswithr   r   Zget_signing_key_from_jwtkeyr   r   r!   r   )r   tokenexr   r   r   get_verifying_key^   s     zTokenBackend.get_verifying_keyc                 C   s`   |  }| jdk	r| j|d< | jdk	r0| j|d< tj|| j| j| jd}t|t	r\|
dS |S )zL
        Returns an encoded token for the given payload dictionary.
        NZaudZiss)r   r   zutf-8)copyr   r   jwtencoder   r   r   r$   bytesdecode)r   payloadZjwt_payloadr,   r   r   r   r1   j   s    





zTokenBackend.encodeTc              
   C   s   z8t j|| || jg| j| j|  | jdk	|ddW S  tk
rh } ztt	d|W 5 d}~X Y n0 t
k
r } ztt	d|W 5 d}~X Y nX dS )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)Z
verify_audZverify_signature)r	   r   r   r   optionszInvalid algorithm specifiedr)   )r0   r3   r.   r   r   r   r(   r   r   r!   r   )r   r,   verifyr-   r   r   r   r3      s     zTokenBackend.decode)Nr   NNNNN)T)__name__
__module____qualname__strr   r&   r%   r   r   r   jsonJSONEncoderr   r   r(   r.   r1   r3   r   r   r   r   r       s"          r   )r;   datetimer   typingr   r   r   r0   Zdjango.utils.translationr   r!   r   r   r	   
exceptionsr   utilsr   r   r   r   ImportErrorr    r   r   r   r   r   <module>   s.   
