3
\^                 @   s   d dl Z d dlZd dlmZ d dlmZmZ y d dlmZmZm	Z	m
Z
mZ W n ek
r`   Y nX 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mZ dd
lmZ G dd deZ e  Z!e!j"Z"e!j#Z#e!j$Z$e!j%Z%e!j&Z&dS )    N)timegm)datetime	timedelta)CallableDictListOptionalUnion   )PyJWS)	Algorithmget_default_algorithms)IterableMappingstring_types)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorMissingRequiredClaimError)
merge_dictc                   sv   e Zd ZdZedd Zd fdd	Zd f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  ZS )PyJWTZJWTc            
   C   s   dddddddddd	S )NTF)	verify_signature
verify_exp
verify_nbf
verify_iat
verify_aud
verify_issrequire_exprequire_iatrequire_nbf r#   r#   r#   ,/tmp/pip-build-8app2_gc/PyJWT/jwt/api_jwt.py_get_default_options   s    zPyJWT._get_default_optionsHS256Nc                sr   t |tstdx0d	D ](}t |j|trt|| j ||< qW tj|d
|dj	d}t
t| j	|||||S )NzJExpecting a mapping object, as JWT only supports JSON objects as payloads.expiatnbf,:)
separatorsclszutf-8)r'   r(   r)   )r*   r+   )
isinstancer   	TypeErrorgetr   r   utctimetuplejsondumpsencodesuperr   )selfpayloadkey	algorithmheadersZjson_encoderZ
time_claimZjson_payload)	__class__r#   r$   r4   (   s    


zPyJWT.encode Tc                s   |r| rt jd
t | j|\}}}}|d kr:d|i}n|jd| tt| j|f|||d|}	ytj	|	jd}W n. t
k
r }
 ztd|
 W Y d d }
~
X nX t|tstd|rt| j|}| j||f| |S )Nz.It is strongly recommended that you pass in a z;value for the "algorithms" argument when calling decode(). z4This argument will be mandatory in a future version.r   )r8   
algorithmsoptionszutf-8zInvalid payload string: %sz-Invalid payload string: must be a json objectziIt is strongly recommended that you pass in a value for the "algorithms" argument when calling decode(). zIt is strongly recommended that you pass in a value for the "algorithms" argument when calling decode(). This argument will be mandatory in a future version.)warningswarnDeprecationWarning_load
setdefaultr5   r   decoder2   loads
ValueErrorr   r.   r   r   r>   _validate_claims)r6   Zjwtr8   verifyr=   r>   kwargsr7   _decodedeZmerged_options)r;   r#   r$   rD   D   s*    
 


zPyJWT.decoder   c             K   s   d|kr$|j dd|d< tjdt t|tr6|j }t|ttd t	fsRt
d| j|| ttj j }d|kr|j dr| j||| d|kr|j d	r| j||| d
|kr|j dr| j||| |j dr| j|| |j dr| j|| d S )NZverify_expirationTr   zXThe verify_expiration parameter is deprecated. Please use verify_exp in options instead.z,audience must be a string, iterable, or Noner(   r   r)   r   r'   r   r   )r0   r?   r@   rA   r.   r   total_secondsr   typer   r/   _validate_required_claimsr   r   utcnowr1   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r6   r7   r>   audienceissuerleewayrI   nowr#   r#   r$   rG   l   s(    


zPyJWT._validate_claimsc             C   sd   |j dr |j dd kr td|j dr@|j dd kr@td|j dr`|j dd kr`tdd S )Nr    r'   r!   r(   r"   r)   )r0   r   )r6   r7   r>   r#   r#   r$   rO      s    zPyJWT._validate_required_claimsc             C   s2   yt |d  W n tk
r,   tdY nX d S )Nr(   z)Issued At claim (iat) must be an integer.)intrF   r   )r6   r7   rY   rX   r#   r#   r$   rQ      s    zPyJWT._validate_iatc             C   sF   y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))rZ   rF   r   r   )r6   r7   rY   rX   r)   r#   r#   r$   rR      s    zPyJWT._validate_nbfc             C   sF   y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)rZ   rF   r   r   )r6   r7   rY   rX   r'   r#   r#   r$   rS      s    zPyJWT._validate_expc                s   |d krd|krd S |d k	r,d|kr,t d|d krDd|krDtd|d  t tr\ g t tsntdtdd  D rtdt|tr|g}t fdd|D stdd S )NaudzInvalid audiencezInvalid claim format in tokenc             s   s   | ]}t |t V  qd S )N)r.   r   ).0cr#   r#   r$   	<genexpr>   s    z&PyJWT._validate_aud.<locals>.<genexpr>c             3   s   | ]}| kV  qd S )Nr#   )r\   r[   )audience_claimsr#   r$   r^      s    )r   r   r.   r   listany)r6   r7   rV   r#   )r_   r$   rU      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   )r6   r7   rW   r#   r#   r$   rT      s    zPyJWT._validate_iss)r&   NN)r<   TNN)NNr   )__name__
__module____qualname__Zheader_typestaticmethodr%   r4   rD   rG   rO   rQ   rR   rS   rU   rT   __classcell__r#   r#   )r;   r$   r      s"        # 
!
	
r   )'r2   r?   calendarr   r   r   typingr   r   r   r   r	   ImportErrorZapi_jwsr   r=   r   r   compatr   r   r   
exceptionsr   r   r   r   r   r   r   utilsr   r   Z_jwt_global_objr4   rD   Zregister_algorithmZunregister_algorithmZget_unverified_headerr#   r#   r#   r$   <module>   s(    $ D