U
    ù¹cá  ã                   @   sú   d dl Z d dlZd dlmZ d dlmZmZ z 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-unpacked-wheel-eh6jf6x0/jwt/api_jwt.pyÚ_get_default_options   s    ÷zPyJWT._get_default_optionsÚHS256Nc                    sn   t |tƒstdƒ‚dD ](}t | |¡tƒrt||  ¡ ƒ||< qtj|d|d� 	d¡}t
t| ƒ 	|||||¡S )NzJExpecting a mapping object, as JWT only supports JSON objects as payloads.)ÚexpÚiatÚnbf)ú,ú:)Ú
separatorsÚclsúutf-8)Ú
isinstancer   Ú	TypeErrorÚgetr   r   ÚutctimetupleÚjsonÚdumpsÚencodeÚsuperr   )ÚselfÚpayloadÚkeyÚ	algorithmÚheadersZjson_encoderZ
time_claimZjson_payload©Ú	__class__r#   r$   r5   (   s&    
ýü
    ÿzPyJWT.encodeÚ Tc              
      sÞ   |r|st  dt¡ |  |¡\}}}}|d kr8d|i}n| d|¡ tt| ƒj|f|||dœ|—Ž}	zt 	|	 d¡¡}W n. t
k
r¦ }
 ztd|
 ƒ‚W 5 d }
~
X Y nX t|tƒsºtdƒ‚|rÚt| j|ƒ}| j||f|Ž |S )Nz�It 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.r   )r9   Ú
algorithmsÚoptionsr.   zInvalid payload string: %sz-Invalid payload string: must be a json object)ÚwarningsÚwarnÚDeprecationWarningÚ_loadÚ
setdefaultr6   r   Údecoder3   ÚloadsÚ
ValueErrorr   r/   r   r   r@   Ú_validate_claims)r7   Zjwtr9   Úverifyr?   r@   Úkwargsr8   Ú_ÚdecodedÚeZmerged_optionsr<   r#   r$   rF   D   s8    ü

ÿ  ÿÿ
zPyJWT.decoder   c                 K   sþ   d|kr$|  dd¡|d< t dt¡ t|tƒr6| ¡ }t|ttd ƒt	fƒsRt
dƒ‚|  ||¡ tt ¡  ¡ ƒ}d|krŽ|  d¡rŽ|  |||¡ d|kr®|  d	¡r®|  |||¡ d
|krÎ|  d¡rÎ|  |||¡ |  d¡rä|  ||¡ |  d¡rú|  ||¡ 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   )r1   rA   rB   rC   r/   r   Útotal_secondsr   Útyper   r0   Ú_validate_required_claimsr   r   Úutcnowr2   Ú_validate_iatÚ_validate_nbfÚ_validate_expÚ_validate_issÚ_validate_aud)r7   r8   r@   ÚaudienceÚissuerÚleewayrK   Únowr#   r#   r$   rI   l   s*    þ


zPyJWT._validate_claimsc                 C   sd   |  d¡r |  d¡d kr tdƒ‚|  d¡r@|  d¡d kr@tdƒ‚|  d¡r`|  d¡d kr`tdƒ‚d S )Nr    r'   r!   r(   r"   r)   )r1   r   )r7   r8   r@   r#   r#   r$   rQ   Ž   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   )r7   r8   r[   rZ   r#   r#   r$   rS   ˜   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   )r7   r8   r[   rZ   r)   r#   r#   r$   rT   ž   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   )r7   r8   r[   rZ   r'   r#   r#   r$   rU   §   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 ƒƒrˆtdƒ‚t|tƒr˜|g}t‡ fdd„|D ƒƒs¶t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 r^   r#   )r_   r]   ©Zaudience_claimsr#   r$   ra   Ë   s     )r   r   r/   r   ÚlistÚany)r7   r8   rX   r#   rb   r$   rW   ±   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   )r7   r8   rY   r#   r#   r$   rV   Î   s    zPyJWT._validate_iss)r&   NN)r>   TNN)NNr   )Ú__name__Ú
__module__Ú__qualname__Zheader_typeÚstaticmethodr%   r5   rF   rI   rQ   rS   rT   rU   rW   rV   Ú__classcell__r#   r#   r<   r$   r      s*   
   û    û(  ÿ
"
	
r   )'r3   rA   Ú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_objr5   rF   Zregister_algorithmZunregister_algorithmZget_unverified_headerr#   r#   r#   r$   Ú<module>   s(    $ D