a
    "h8                     @  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 ddlmZ dd	lmZmZmZmZmZmZmZmZmZ dd
lmZ erddl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Sequence)datetime	timedeltatimezone)TYPE_CHECKINGAny   )api_jws)	DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorInvalidJTIErrorInvalidSubjectErrorMissingRequiredClaimError)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeys)PyJWKc                   @  sr  e Zd ZdHdddddZeddd	d
ZdIddddddddddZdJdddddddZdKddddddd d!dd"d#dd$d%d&Zdd#d'd(d)Z	dLddddddd dd!d"d#d#d*d+d,Z
dMdddd"dd-d.d/Zdddd0d1d2ZdNddd3d4d5Zddd3d6d7Zdd8d8dd9d:d;Zdd8d8dd9d<d=Zdd8d8dd9d>d?Zd@dAdd dddBdCdDZdd#ddEdFdGZdS )OPyJWTNzdict[str, Any] | NoneNone)optionsreturnc                 C  s"   |d u ri }i |   || _d S N)_get_default_optionsr   )selfr    r!   G/var/www/html/requester/venv/lib/python3.9/site-packages/jwt/api_jwt.py__init__   s    zPyJWT.__init__zdict[str, bool | list[str]])r   c                
   C  s   ddddddddg d	S )NT)	verify_signature
verify_exp
verify_nbf
verify_iat
verify_aud
verify_iss
verify_sub
verify_jtirequirer!   r!   r!   r!   r"   r   #   s    zPyJWT._get_default_optionsTzdict[str, Any]z(AllowedPrivateKeys | PyJWK | str | bytesz
str | Noneztype[json.JSONEncoder] | Noneboolstr)payloadkey	algorithmheadersjson_encodersort_headersr   c           	      C  sn   t |tstd| }dD ](}t ||trt||  ||< q| j|||d}t	j
||||||dS )NzGExpecting a dict object, as JWT only supports JSON objects as payloads.)expiatnbf)r2   r3   )r4   )
isinstancedict	TypeErrorcopygetr   r   utctimetuple_encode_payloadr   encode)	r    r/   r0   r1   r2   r3   r4   Z
time_claimZjson_payloadr!   r!   r"   r?   1   s*    

zPyJWT.encodebytes)r/   r2   r3   r   c                 C  s   t j|d|ddS )z
        Encode a given payload to the bytes to be signed.

        This method is intended to be overridden by subclasses that need to
        encode the payload in a different way, e.g. compress the payload.
        ),:)
separatorsclszutf-8)jsondumpsr?   )r    r/   r2   r3   r!   r!   r"   r>   W   s    zPyJWT._encode_payload r   zstr | bytesz'AllowedPublicKeys | PyJWK | str | byteszSequence[str] | Nonezbool | Nonezbytes | Nonezstr | Iterable[str] | Nonezstr | Sequence[str] | Nonezfloat | timedeltar
   )jwtr0   
algorithmsr   verifydetached_payloadaudienceissuersubjectleewaykwargsr   c                 K  s  |r"t jdt|  tdd t|p*i }|dd |d ur^||d kr^t jdtdd |d s|dd	 |d
d	 |dd	 |dd	 |dd	 |dd	 |dd	 tj	|||||d}| 
|}i | j|}| j|||||
|	d ||d< |S )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs:    
stacklevelr$   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.)categoryrS   r%   Fr&   r'   r(   r)   r*   r+   )r0   rI   r   rK   )rL   rM   rO   rN   r/   )warningswarntuplekeysr   r9   
setdefaultDeprecationWarningr   decode_complete_decode_payloadr   _validate_claims)r    rH   r0   rI   r   rJ   rK   rL   rM   rN   rO   rP   decodedr/   Zmerged_optionsr!   r!   r"   r[   i   sV    

	zPyJWT.decode_complete)r^   r   c              
   C  s^   zt |d }W n4 tyF } ztd| |W Y d}~n
d}~0 0 t|tsZtd|S )a  
        Decode the payload from a JWS dictionary (payload, signature, header).

        This method is intended to be overridden by subclasses that need to
        decode the payload in a different way, e.g. decompress compressed
        payloads.
        r/   zInvalid payload string: Nz-Invalid payload string: must be a json object)rE   loads
ValueErrorr   r8   r9   )r    r^   r/   er!   r!   r"   r\      s    &
zPyJWT._decode_payload)rH   r0   rI   r   rJ   rK   rL   rN   rM   rO   rP   r   c                 K  sH   |r"t jdt|  tdd | j|||||||||	|
d
}|d S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rQ   rR   )rJ   rK   rL   rN   rM   rO   r/   )rU   rV   rW   rX   r   r[   )r    rH   r0   rI   r   rJ   rK   rL   rN   rM   rO   rP   r^   r!   r!   r"   decode   s*    
zPyJWT.decode)r/   r   rN   rO   r   c                 C  s  t |tr| }|d ur0t |ttfs0td| || tjt	j
d }d|v rl|d rl| ||| d|v r|d r| ||| d|v r|d r| ||| |d	 r| || |d
 r| j|||ddd |d r| || |d r| | d S )Nz+audience must be a string, iterable or None)tzr6   r'   r7   r&   r5   r%   r)   r(   Z
strict_audFstrictr*   r+   )r8   r   total_secondsr.   r   r:   _validate_required_claimsr   nowr   utc	timestamp_validate_iat_validate_nbf_validate_exp_validate_iss_validate_audr<   _validate_sub_validate_jti)r    r/   r   rL   rM   rN   rO   rh   r!   r!   r"   r]      s,    	

zPyJWT._validate_claims)r/   r   r   c                 C  s(   |d D ]}| |d u rt|qd S )Nr,   )r<   r   )r    r/   r   Zclaimr!   r!   r"   rg     s    zPyJWT._validate_required_claims)r/   r   c                 C  sD   d|vrdS t |d ts"td|dur@|d|kr@tddS )z
        Checks whether "sub" if in the payload is valid ot not.
        This is an Optional claim

        :param payload(dict): The payload which needs to be validated
        :param subject(str): The subject of the token
        subNzSubject must be a stringzInvalid subject)r8   r.   r   r<   )r    r/   rN   r!   r!   r"   rp     s    	zPyJWT._validate_subc                 C  s(   d|vrdS t |dts$tddS )z
        Checks whether "jti" if in the payload is valid ot not
        This is an Optional claim

        :param payload(dict): The payload which needs to be validated
        ZjtiNzJWT ID must be a string)r8   r<   r.   r   )r    r/   r!   r!   r"   rq   2  s    zPyJWT._validate_jtifloat)r/   rh   rO   r   c                 C  sF   zt |d }W n ty,   tdd Y n0 ||| krBtdd S )Nr6   z)Issued At claim (iat) must be an integer.z The token is not yet valid (iat))intr`   r   r   )r    r/   rh   rO   r6   r!   r!   r"   rk   @  s    zPyJWT._validate_iatc                 C  sF   zt |d }W n ty,   tdd Y n0 ||| krBtdd S )Nr7   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))rt   r`   r   r   )r    r/   rh   rO   r7   r!   r!   r"   rl   O  s    zPyJWT._validate_nbfc                 C  sF   zt |d }W n ty,   tdd Y n0 ||| krBtdd S )Nr5   z/Expiration Time claim (exp) must be an integer.zSignature has expired)rt   r`   r   r   )r    r/   rh   rO   r5   r!   r!   r"   rm   ]  s    zPyJWT._validate_expFrd   )r/   rL   re   r   c                  s   |d u r$d|vs|d sd S t dd|vs4|d s<td|d  |rt|tsZt dt tslt d| kr|t dd S t tr g t tst 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 audience (strict)z&Invalid claim format in token (strict)zAudience doesn't match (strict)zInvalid claim format in tokenc                 s  s   | ]}t |t V  qd S r   )r8   r.   ).0cr!   r!   r"   	<genexpr>      z&PyJWT._validate_aud.<locals>.<genexpr>c                 3  s   | ]}| vV  qd S r   r!   )rv   ru   Zaudience_claimsr!   r"   rx     ry   zAudience doesn't match)r   r   r8   r.   listanyall)r    r/   rL   re   r!   rz   r"   ro   m  s2    




zPyJWT._validate_aud)r/   rM   r   c                 C  sT   |d u rd S d|vrt dt|tr<|d |krPtdn|d |vrPtdd S )NZisszInvalid issuer)r   r8   r.   r   )r    r/   rM   r!   r!   r"   rn     s    

zPyJWT._validate_iss)N)NNNT)NN)	rG   NNNNNNNr   )	rG   NNNNNNNr   )NNNr   )N)__name__
__module____qualname__r#   staticmethodr   r?   r>   r[   r\   rb   r]   rg   rp   rq   rk   rl   rm   ro   rn   r!   r!   r!   r"   r      s\       )           &J         &-    *	2r   )&
__future__r   rE   rU   calendarr   collections.abcr   r   r   r   r   typingr	   r
   rG   r   
exceptionsr   r   r   r   r   r   r   r   r   r   rI   r   r   Zapi_jwkr   r   Z_jwt_global_objr?   r[   rb   r!   r!   r!   r"   <module>   s(   ,   