o
    KÄjaš  ã                   @   s²   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deeeee	e f f fdd„ƒZ
			d'deeef d	ed
ee dee deeej  defdd„Z			d(ded	ede	e dedeeef f
dd„Z			d(ded	ede	e dedeeef 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dS )*ÚPyJWTNc                 C   s"   |d u ri }i |   ¡ ¥|¥| _d S ©N)Ú_get_default_optionsÚoptions)Úselfr   © r   ú-/usr/lib/python3/dist-packages/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_encoderc                 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,   Ú
time_claimÚjson_payloadr   r   r   r;   %   s   
	ÿ€ÿþzPyJWT.encodeÚ ÚjwtÚ
algorithmsr   c           
   
   K   s  |d u r	ddi}n|  dd¡ |d s1|  dd¡ |  dd¡ |  dd¡ |  dd¡ |  dd¡ |d r;|s;td	ƒ‚tj|f|||d
œ|¤Ž}z	t |d ¡}W n tyc } ztd| ƒ‚d }~ww t|tƒsmtdƒ‚i | j	¥|¥}	| j
||	fi |¤Ž ||d< |S )Nr    Tr!   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: %sz-Invalid payload string: must be a json object)Ú
setdefaultr   r   Údecode_completer9   ÚloadsÚ
ValueErrorr4   Údictr   Ú_validate_claims)
r   r?   r)   r@   r   ÚkwargsÚdecodedr(   ÚeÚmerged_optionsr   r   r   rB   A   sD   
ÿÿüû€ÿ
zPyJWT.decode_completec                 K   s    | j ||||fi |¤Ž}|d S )Nr(   )rB   )r   r?   r)   r@   r   rG   rH   r   r   r   Údecodeo   s   zPyJWT.decoder   c                 K   sÜ   t |tƒr	| ¡ }t |tttd ƒtfƒstdƒ‚|  ||¡ t	t
jtjd� ¡ ƒ}d|v r8|d r8|  |||¡ d|v rG|d rG|  |||¡ d|v rV|d rV|  |||¡ |d	 r`|  ||¡ |d
 rl|  ||¡ d S 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ÚleewayrG   rR   r   r   r   rF   z   s"   
ÿzPyJWT._validate_claimsc                 C   s(   |d D ]}|  |¡d u rt|ƒ‚qd S )Nr&   )r7   r   )r   r(   r   Úclaimr   r   r   rQ   –   s
   ÿÿzPyJWT._validate_required_claimsc                 C   s*   z	t |d ƒ W d S  ty   tdƒ‚w )Nr.   z)Issued At claim (iat) must be an integer.)ÚintrD   r   )r   r(   rR   r[   r   r   r   rT   ›   s
   ÿzPyJWT._validate_iatc                 C   s@   zt |d ƒ}W n ty   tdƒ‚w ||| krtdƒ‚d S )Nr/   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))r]   rD   r   r   )r   r(   rR   r[   r/   r   r   r   rU   ¡   ó   ÿÿzPyJWT._validate_nbfc                 C   s@   zt |d ƒ}W n ty   tdƒ‚w ||| k rtdƒ‚d S )Nr-   z/Expiration Time claim (exp) must be an integer.zSignature has expired)r]   rD   r   r   )r   r(   rR   r[   r-   r   r   r   rV   ª   r^   zPyJWT._validate_expc                    s²   |d u rd|vs|d sd S t dƒ‚d|vs|d stdƒ‚|d ‰ tˆ tƒr*ˆ g‰ tˆ tƒs3t dƒ‚tdd„ ˆ D ƒƒr@t dƒ‚t|tƒrH|g}t‡ fdd„|D ƒƒrWt dƒ‚d S )NÚaudzInvalid audiencezInvalid claim format in tokenc                 s   s   � | ]	}t |tƒ V  qd S r   )r4   rO   )Ú.0Úcr   r   r   Ú	<genexpr>Æ   s   € z&PyJWT._validate_aud.<locals>.<genexpr>c                 3   s   � | ]}|ˆ vV  qd S r   r   )r`   r_   ©Úaudience_claimsr   r   rb   Ì   s   € )r   r   r4   rO   ÚlistÚanyÚall)r   r(   rY   r   rc   r   rX   ³   s$   


ÿzPyJWT._validate_audc                 C   s4   |d u rd S d|vrt dƒ‚|d |krtdƒ‚d S )NÚisszInvalid issuer)r   r   )r   r(   rZ   r   r   r   rW   Ï   s   ÿzPyJWT._validate_issr   )r'   NN)r>   NN)NNr   )Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr	   rO   r   Úboolr
   r   r   r   r   r9   ÚJSONEncoderr;   rB   rK   rF   rQ   rT   rU   rV   rX   rW   r   r   r   r   r      sp    
$ú
þýüûú
ùûþýüû

ù1ûþýüû

ù
ÿ		r   )r9   Úcalendarr   Úcollections.abcr   r   r   r   r   Útypingr   r	   r
   r   r   r   r>   r   Ú
exceptionsr   r   r   r   r   r   r   r   Ú_jwt_global_objr;   rB   rK   r   r   r   r   Ú<module>   s     $ H
