U
    dK'                     @  s   d dl mZ d dlZ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 dd
lmZ G dd dZe Zej Z ej!Z!ej"Z"dS )    )annotationsN)timegm)IterableMapping)datetime	timedeltatimezone)AnyDictListOptionalTypeUnion   )api_jws)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorMissingRequiredClaimError)RemovedInPyjwt3Warningc                   @  s   e Zd Zd+ddZeddddZd,d	d
dddd
dddZd-d
d
dddddddd	d
ddZd.d
d
dddddddd	d
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 )0PyJWTNc                 C  s   |d kri }|   || _d S N)_get_default_optionsoptions)selfr    r   //tmp/pip-unpacked-wheel-cf9_iply/jwt/api_jwt.py__init__   s    zPyJWT.__init__z!Dict[str, Union[bool, List[str]]])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HS256zDict[str, Any]strzOptional[str]zOptional[Dict[str, Any]]z Optional[Type[json.JSONEncoder]])payloadkey	algorithmheadersjson_encoderr!   c                 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/   Z
time_claimZjson_payloadr   r   r   r>   )   s     	
  zPyJWT.encode r   zOptional[List[str]]zOptional[bool]zOptional[bytes]z#Optional[Union[str, Iterable[str]]]zUnion[int, float, timedelta])
jwtr,   
algorithmsr   verifydetached_payloadaudienceissuerleewayr!   c
              
   K  sH  |
rt dt|
  t t|p&i }|dd |d k	rX||d krXt jdtd |d s|dd |dd |d	d |d
d |dd |d r|stdt	j
|||||d}zt|d }W n2 tk
r } ztd| W 5 d }~X Y nX t|tstd| j|}| j|||||	d ||d< |S )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: r"   TzThe `verify` argument to `decode` does nothing in PyJWT 2.0 and newer. The equivalent is setting `verify_signature` to False in the `options` dictionary. This invocation has a mismatch between the kwarg and the option entry.)categoryr#   Fr$   r%   r&   r'   z\It is required that you pass in a value for the "algorithms" argument when calling decode().)r,   rA   r   rC   r+   zInvalid payload string: z-Invalid payload string: must be a json object)rD   rE   rF   )warningswarntuplekeysr   dict
setdefaultDeprecationWarningr   r   decode_completer<   loads
ValueErrorr7   r   _validate_claims)r   r@   r,   rA   r   rB   rC   rD   rE   rF   kwargsdecodedr+   eZmerged_optionsr   r   r   rO   E   sZ     
    zPyJWT.decode_completec
                 K  sB   |
rt dt|
  t | j|||||||||	d	}|d S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: )rB   rC   rD   rE   rF   r+   )rH   rI   rJ   rK   r   rO   )r   r@   r,   rA   r   rB   rC   rD   rE   rF   rS   rT   r   r   r   decode   s"    zPyJWT.decodec                 C  s   t |tr| }|d k	r0t |ttfs0td| || ttj	t
jd }d|krp|d rp| ||| d|kr|d r| ||| d|kr|d r| ||| |d	 r| || |d
 r| || d S )Nz+audience must be a string, iterable or None)tzr1   r%   r2   r$   r0   r#   r'   r&   )r7   r   total_secondsr*   r   r8   _validate_required_claimsr   r   nowr   utcr;   _validate_iat_validate_nbf_validate_exp_validate_iss_validate_aud)r   r+   r   rD   rE   rF   rZ   r   r   r   rR      s     
zPyJWT._validate_claimsc                 C  s(   |d D ]}| |d krt|qd S )Nr(   )r:   r   )r   r+   r   Zclaimr   r   r   rY      s    zPyJWT._validate_required_claimsc                 C  sJ   |d }zt | W n tk
r0   tdY nX ||| krFtdd S )Nr1   z)Issued At claim (iat) must be an integer.z The token is not yet valid (iat))intrQ   r   r   )r   r+   rZ   rF   r1   r   r   r   r\      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 )Nr2   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))ra   rQ   r   r   )r   r+   rZ   rF   r2   r   r   r   r]      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 )Nr0   z/Expiration Time claim (exp) must be an integer.zSignature has expired)ra   rQ   r   r   )r   r+   rZ   rF   r0   r   r   r   r^      s    zPyJWT._validate_expc                   s   |d kr$d|ks|d sd S t dd|ks4|d s<td|d  t trT g t tsft dtdd  D rt dt|tr|g}t fdd|D rt dd S )NaudzInvalid audiencezInvalid claim format in tokenc                 s  s   | ]}t |t V  qd S r   )r7   r*   ).0cr   r   r   	<genexpr>  s     z&PyJWT._validate_aud.<locals>.<genexpr>c                 3  s   | ]}| kV  qd S r   r   )rc   rb   Zaudience_claimsr   r   re     s     )r   r   r7   r*   listanyall)r   r+   rD   r   rf   r   r`      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   )r   r+   rE   r   r   r   r_     s    zPyJWT._validate_iss)N)r)   NN)r?   NNNNNNr   )r?   NNNNNNr   )NNr   )__name__
__module____qualname__r    staticmethodr   r>   rO   rV   rR   rY   r\   r]   r^   r`   r_   r   r   r   r   r      s@   
           "M        "&
			r   )#
__future__r   r<   rH   calendarr   collections.abcr   r   r   r   r   typingr	   r
   r   r   r   r   r?   r   
exceptionsr   r   r   r   r   r   r   r   r   Z_jwt_global_objr>   rO   rV   r   r   r   r   <module>   s     $	  