U
    bY                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZ G d	d
 d
Ze ZejZejZejZdS )    N)timegm)IterableMapping)datetime	timedeltatimezone)AnyDictListOptionalTypeUnion   )api_jws)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorMissingRequiredClaimErrorc                   @   s  e Zd Zd ddZeeeeee	e f f dddZ
d!eeef eee ee eeej  edd	d
Zd"eeee	e  ee eeef dddZd#eeee	e  ee eeef dddZd$ddZdd Zdd Zdd Zdd Zdd Zdd ZdS )%PyJWTNc                 C   s   |d kri }|   || _d S N)_get_default_optionsoptions)selfr    r   //tmp/pip-unpacked-wheel-ivybibab/jwt/api_jwt.py__init__   s    zPyJWT.__init__)returnc                   C   s   ddddddg dS )NT)verify_signature
verify_exp
verify_nbf
verify_iat
verify_aud
verify_issrequirer   r   r   r   r   r      s    zPyJWT._get_default_optionsHS256)payloadkey	algorithmheadersjson_encoderr   c                 C   sp   t |tstd| }dD ](}t ||trt||  ||< qtj	|d|d
d}t
|||||S )NzJExpecting a mapping object, as JWT only supports JSON objects as payloads.)expiatnbf),:)
separatorsclszutf-8)
isinstancer   	TypeErrorcopygetr   r   utctimetuplejsondumpsencoder   )r   r(   r)   r*   r+   r,   Z
time_claimZjson_payloadr   r   r   r;   &   s     	
  zPyJWT.encode )jwtr)   
algorithmsr   r   c           
   
   K   s.  t |pi }|dd d|kr>|d |d kr>tjdtd |d s|dd |dd |d	d |d
d |dd |d r|stdtj|f|||d|}zt	|d }W n0 t
k
r } ztd| W 5 d }~X Y nX t|t std| j|}	| j||	f| ||d< |S )Nr    TverifyzThe `verify` argument to `decode` does nothing in PyJWT 2.0 and newer. The equivalent is setting `verify_signature` to False in the `options` dictionary. This invocation has a mismatch between the kwarg and the option entry.)categoryr!   Fr"   r#   r$   r%   z\It is required that you pass in a value for the "algorithms" argument when calling decode().)r)   r>   r   r(   zInvalid payload string: z-Invalid payload string: must be a json object)dict
setdefaultwarningswarnDeprecationWarningr   r   decode_completer9   loads
ValueErrorr4   r   _validate_claims)
r   r=   r)   r>   r   kwargsdecodedr(   eZmerged_optionsr   r   r   rF   B   sH     
zPyJWT.decode_completec                 K   s   | j ||||f|}|d S )Nr(   )rF   )r   r=   r)   r>   r   rJ   rK   r   r   r   decodey   s    zPyJWT.decoder   c                 K   s   t |tr| }t |tttd tfs0td| || t	t
jtjd }d|krp|d rp| ||| d|kr|d r| ||| d|kr|d r| ||| |d	 r| || |d
 r| || d S )Nz,audience must be a string, iterable, or None)tzr.   r#   r/   r"   r-   r!   r%   r$   )r4   r   total_secondsbytesstrtyper   r5   _validate_required_claimsr   r   nowr   utcr8   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r   r(   r   audienceissuerleewayrJ   rT   r   r   r   rI      s     
zPyJWT._validate_claimsc                 C   s(   |d D ]}| |d krt|qd S )Nr&   )r7   r   )r   r(   r   Zclaimr   r   r   rS      s    zPyJWT._validate_required_claimsc                 C   s2   zt |d  W n tk
r,   tdY nX d S )Nr.   z)Issued At claim (iat) must be an integer.)intrH   r   )r   r(   rT   r]   r   r   r   rV      s    zPyJWT._validate_iatc                 C   sF   zt |d }W n tk
r,   tdY nX ||| krBtdd S )Nr/   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))r^   rH   r   r   )r   r(   rT   r]   r/   r   r   r   rW      s    zPyJWT._validate_nbfc                 C   sF   zt |d }W n tk
r,   tdY nX ||| k rBtdd S )Nr-   z/Expiration Time claim (exp) must be an integer.zSignature has expired)r^   rH   r   r   )r   r(   rT   r]   r-   r   r   r   rX      s    zPyJWT._validate_expc                    s   |d kr$d|ks|d sd S t dd|ks4|d s<td|d  t trT g t tsft dtdd  D rt dt|tr|g}t fdd|D rt dd S )NaudzInvalid audiencezInvalid claim format in tokenc                 s   s   | ]}t |t V  qd S r   )r4   rQ   ).0cr   r   r   	<genexpr>   s     z&PyJWT._validate_aud.<locals>.<genexpr>c                 3   s   | ]}| kV  qd S r   r   )r`   r_   Zaudience_claimsr   r   rb      s     )r   r   r4   rQ   listanyall)r   r(   r[   r   rc   r   rZ      s"    


zPyJWT._validate_audc                 C   s4   |d krd S d|krt d|d |kr0tdd S )NZisszInvalid issuer)r   r   )r   r(   r\   r   r   r   rY      s    zPyJWT._validate_iss)N)r'   NN)r<   NN)r<   NN)NNr   )__name__
__module____qualname__r   staticmethodr	   rQ   r   boolr
   r   r   r   r   r9   JSONEncoderr;   rF   rM   rI   rS   rV   rW   rX   rZ   rY   r   r   r   r   r      sX   
$   
   

:   

     
		r   ) r9   rC   calendarr   collections.abcr   r   r   r   r   typingr   r	   r
   r   r   r   r<   r   
exceptionsr   r   r   r   r   r   r   r   Z_jwt_global_objr;   rF   rM   r   r   r   r   <module>   s    $ Q