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),:)
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
