U
    ç‘«jE  ã                	   @   sâ   d dl Z d dlmZ d dlmZ d dlmZmZ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 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)ÚIterable)Ú	timedelta)ÚAnyÚDictÚOptionalÚTypeÚUnion)Úgettext_lazy)ÚInvalidAlgorithmErrorÚInvalidTokenErrorÚ
algorithmsé   )ÚTokenBackendError)ÚToken)Úformat_lazy)ÚPyJWKClientÚPyJWKClientErrorTFZHS256ZHS384ZHS512ZRS256ZRS384ZRS512ZES256ZES384ZES512c                   @   s¾   e Zd Zdeee eeeedf ee ee eeee	df ee
ej  ddœ	dd„Zeddœdd„Ze	d	œd
d„Zeee dœdd„Zeeef edœdd„Zdeeeeef dœdd„ZdS )ÚTokenBackendNÚ )	Ú	algorithmÚsigning_keyÚverifying_keyÚaudienceÚissuerÚjwk_urlÚleewayÚjson_encoderÚreturnc	           	      C   sV   |   |¡ || _|| _|| _|| _|| _tr@|r8t|ƒ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"   úE/tmp/pip-unpacked-wheel-31gzfe9h/rest_framework_simplejwt/backends.pyÚ__init__#   s    
zTokenBackend.__init__)r   r   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)r   c                 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_leewayO   s    

ÿüÿzTokenBackend.get_leeway)Útokenr   c              
   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!   r-   Úexr"   r"   r#   Úget_verifying_key`   s     zTokenBackend.get_verifying_key)Úpayloadr   c                 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!   r3   Zjwt_payloadr-   r"   r"   r#   r6   l   s    



ü

zTokenBackend.encodeT)r-   Úverifyr   c              
   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.   )r5   r8   r2   r   r   r   r,   r
   r   r&   r   )r!   r-   r9   r1   r"   r"   r#   r8   ‚   s     þùzTokenBackend.decode)Nr   NNNNN)T)Ú__name__Ú
__module__Ú__qualname__Ústrr   r   r   r*   r)   r   r   ÚjsonÚJSONEncoderr$   r   r,   r   r2   r   r   r6   Úboolr8   r"   r"   r"   r#   r   "   s.          ÷ör   )r?   Úcollections.abcr   Údatetimer   Útypingr   r   r   r   r   r5   Zdjango.utils.translationr	   r&   r
   r   r   Ú
exceptionsr   Útokensr   Úutilsr   r   r   r   ÚImportErrorr%   r   r"   r"   r"   r#   Ú<module>   s2   
÷