
_P_U                 @   s  d  d l  Z  d  d l Z d  d l 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 d d l m Z m Z d d	 l m Z m Z m Z m Z m Z m Z d d
 l m Z Gd 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)Mapping)datetime	timedelta   )PyJWS)	Algorithmget_default_algorithms)string_typestimedelta_total_seconds)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerError)
merge_dictc                   s   e  Z d  Z d Z e d d    Z d d d   f d d  Z d d	 d d   f d
 d  Z d d d d d  Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z   S)PyJWTZJWTc               C   s(   d d d d d d d d d d d d i S)NZverify_signatureT
verify_exp
verify_nbf
verify_iat
verify_aud
verify_iss r   r   r   -/usr/lib/python3/dist-packages/jwt/api_jwt.py_get_default_options   s    zPyJWT._get_default_optionsZHS256Nc                s   t  | t  s t d   xI d d d g D]8 } t  | j |  t  r+ t | | j    | | <q+ Wt j | d d
 d | j	 d	  } t
 t |   j	 | | | | |  S)NzJExpecting a mapping object, as JWT only supports JSON objects as payloads.expiatnbfZ
separators,:clszutf-8)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   |  j  |  \ } } }	 }
 t t |   j | | | | | |  } y t j | j d   } Wn5 t k
 r } z t d |   WYd  d  } ~ Xn Xt | t	  s t d   | r t
 |  j |  } |  j | | |  | S)Nzutf-8zInvalid payload string: %sz-Invalid payload string: must be a json object)_loadr)   r   decoder&   loads
ValueErrorr   r"   r   r   options_validate_claims)r*   Zjwtr,   Zverify
algorithmsr4   kwargsr+   Zsigning_inputheaderZ	signatureZdecodedeZmerged_options)r.   r   r   r1   8   s    #zPyJWT.decoder   c             K   sX  d | k r2 | j  d d  | d <t j d t  t | t  rM t |  } t | t t d   f  st t	 d   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  r5|  j | |  | j  d  rT|  j | |  d  S)NZverify_expirationTr   zJThe verify_expiration parameter is deprecated. Please use options instead.z!audience must be a string or Noner   r   r   r   r   r   r   )r$   warningswarnDeprecationWarningr"   r   r   r
   typer#   r   r   Zutcnowr%   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r*   r+   r4   audienceissuerleewayr7   nowr   r   r   r5   L   s&    	zPyJWT._validate_claimsc             C   sU   y t  | d  } Wn t k
 r4 t d   Yn X| | | k rQ t d   d  S)Nr   z)Issued At claim (iat) must be an integer.z.Issued At claim (iat) cannot be in the future.)intr3   r   r   )r*   r+   rF   rE   r   r   r   r   r>   k   s    zPyJWT._validate_iatc             C   sU   y t  | d  } Wn t k
 r4 t d   Yn X| | | k rQ t d   d  S)Nr   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))rG   r3   r   r   )r*   r+   rF   rE   r   r   r   r   r?   u   s    zPyJWT._validate_nbfc             C   sU   y t  | d  } Wn t k
 r4 t d   Yn X| | | k  rQ t d   d  S)Nr   z/Expiration Time claim (exp) must be an integer.zSignature has expired)rG   r3   r   r   )r*   r+   rF   rE   r   r   r   r   r@   ~   s    zPyJWT._validate_expc             C   s   | d  k r d | k r d  S| d  k	 r@ d | k r@ t  d   | d } t | t  rb | g } t | t  s} t  d   t d d   | D  r t  d   | | k r t  d   d  S)NZaudzNo audience claim in tokenz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>zInvalid audience)r   r"   r
   listany)r*   r+   rC   Zaudience_claimsr   r   r   rB      s    
	zPyJWT._validate_audc             C   sH   | d  k r d  Sd | k r( t  d   | d | k rD t  d   d  S)NZissz#Token does not contain an iss claimzInvalid issuer)r   )r*   r+   rD   r   r   r   rA      s    zPyJWT._validate_iss)__name__
__module____qualname__Zheader_typestaticmethodr   r(   r1   r5   r>   r?   r@   rB   rA   r   r   )r.   r   r      s   
	
r   ) r&   r:   Zcalendarr   collectionsr   r   r   Zapi_jwsr   r6   r   r	   compatr
   r   
exceptionsr   r   r   r   r   r   Zutilsr   r   Z_jwt_global_objr(   r1   Zregister_algorithmZunregister_algorithmZget_unverified_headerr   r   r   r   <module>   s    .					