o
    Kja                     @   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),:)Z
separatorsclszutf-8)
isinstancer   	TypeErrorcopygetr   r   utctimetuplejsondumpsencoder   )r   r(   r)   r*   r+   r,   Z
time_claimZ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_completer8   loads
ValueErrorr3   dictr   _validate_claims)
r   r<   r)   r=   r   kwargsdecodedr(   eZmerged_optionsr   r   r   r?   A   sD   

zPyJWT.decode_completec                 K   s    | j ||||fi |}|d S )Nr(   )r?   )r   r<   r)   r=   r   rD   rE   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)Ztzr.   r#   r/   r"   r-   r!   r%   r$   )r3   r   Ztotal_secondsbytesstrtyper   r4   _validate_required_claimsr   r   nowr   Zutcr7   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r   r(   r   audienceissuerleewayrD   rL   r   r   r   rC   z   s"   
zPyJWT._validate_claimsc                 C   s(   |d D ]}| |d u rt|qd S )Nr&   )r6   r   )r   r(   r   Zclaimr   r   r   rK      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.)intrA   r   )r   r(   rL   rT   r   r   r   rM      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))rU   rA   r   r   )r   r(   rL   rT   r/   r   r   r   rN         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)rU   rA   r   r   )r   r(   rL   rT   r-   r   r   r   rO      rV   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   )r3   rI   ).0cr   r   r   	<genexpr>   s    z&PyJWT._validate_aud.<locals>.<genexpr>c                 3   s    | ]}| vV  qd S r   r   )rX   rW   Zaudience_claimsr   r   rZ      s    )r   r   r3   rI   listanyall)r   r(   rR   r   r[   r   rQ      s$   


zPyJWT._validate_audc                 C   s4   |d u rd S d|vrt d|d |krtdd S )NZisszInvalid issuer)r   r   )r   r(   rS   r   r   r   rP      s   zPyJWT._validate_issr   )r'   NN)r;   NN)NNr   )__name__
__module____qualname__r   staticmethodr	   rI   r   boolr
   r   r   r   r   r8   ZJSONEncoderr:   r?   rG   rC   rK   rM   rN   rO   rQ   rP   r   r   r   r   r      sp    
$



1


		r   )r8   Zcalendarr   Zcollections.abcr   r   r   r   r   typingr   r	   r
   r   r   r   r;   r   
exceptionsr   r   r   r   r   r   r   r   Z_jwt_global_objr:   r?   rG   r   r   r   r   <module>   s     $ H
