
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
kZ                 @   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 ddl	m
Z
 ddl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 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)IterableMapping)datetime	timedelta   )PyJWS)	Algorithmget_default_algorithms)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   /usr/lib/python3.6/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,:)Z
separatorsclszutf-8)r"   r#   r$   )r%   r&   )
isinstancer   	TypeErrorgetr   r   utctimetuplejsondumpsencodesuperr   )selfpayloadkey	algorithmZheadersZjson_encoderZ
time_claimZjson_payload)	__class__r   r   r.   #   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   )r2   
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
setdefaultr/   r   decoder,   loads
ValueErrorr   r(   r   r   r7   _validate_claims)r0   Zjwtr2   Zverifyr6   r7   kwargsr1   Zsigning_inputheaderZ	signatureZdecodedeZmerged_options)r4   r   r   r=   :   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   )r*   r8   r9   r:   r(   r   Ztotal_secondsr   typer   r)   _validate_required_claimsr   r   Zutcnowr+   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r0   r1   r7   audienceissuerleewayrA   nowr   r   r   r@   ]   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$   )r*   r   )r0   r1   r7   r   r   r   rE      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.)intr?   r   )r0   r1   rN   rM   r   r   r   rF      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))rO   r?   r   r   )r0   r1   rN   rM   r$   r   r   r   rG      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)rO   r?   r   r   )r0   r1   rN   rM   r"   r   r   r   rH      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   )rQ   rP   )audience_claimsr   r   rS      s    )r   r   r(   r   listany)r0   r1   rK   r   )rT   r   rJ      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   )r0   r1   rL   r   r   r   rI      s    zPyJWT._validate_iss)r!   NN)r5   TNN)NNr   )__name__
__module____qualname__Zheader_typestaticmethodr    r.   r=   r@   rE   rF   rG   rH   rJ   rI   __classcell__r   r   )r4   r   r      s    # 
!
	
r   )!r,   r8   Zcalendarr   collectionsr   r   r   r   Zapi_jwsr   r6   r	   r
   compatr   
exceptionsr   r   r   r   r   r   r   Zutilsr   r   Z_jwt_global_objr.   r=   Zregister_algorithmZunregister_algorithmZget_unverified_headerr   r   r   r   <module>   s"   $ 9