o
    i'e^1                     @  s   d dl mZ d dlZd dlZd dlmZ d dl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 dd
lmZ erTddlmZmZ G dd dZe ZejZejZej Z dS )    )annotationsN)timegm)Iterable)datetime	timedeltatimezone)TYPE_CHECKINGAny   )api_jws)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorMissingRequiredClaimError)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeysc                   @  s   e Zd ZdJdKddZedLd	d
Z				dMdNddZ		dOdPddZ								dQdRd0d1ZdSd3d4Z									dQdTd5d6Z
			dUdVd7d8ZdWd9d:ZdXd=d>ZdXd?d@ZdXdAdBZdCdDdYdFdGZdZdHdIZdS )[PyJWTNoptionsdict[str, Any] | NonereturnNonec                 C  s"   |d u ri }i |   || _d S N)_get_default_optionsr   )selfr    r   +lib/python3.10/site-packages/jwt/api_jwt.py__init__   s   zPyJWT.__init__dict[str, bool | list[str]]c                   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HS256Tpayloaddict[str, Any]key AllowedPrivateKeys | str | bytes	algorithm
str | Noneheadersjson_encodertype[json.JSONEncoder] | Nonesort_headersboolstrc           	      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)r0   r1   )r3   )
isinstancedict	TypeErrorcopygetr   r   Zutctimetuple_encode_payloadr   encode)	r   r*   r,   r.   r0   r1   r3   Z
time_claimZjson_payloadr   r   r   r?   ,   s,   

zPyJWT.encodebytesc                 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.
        ),:)Z
separatorsclszutf-8)jsondumpsr?   )r   r*   r0   r1   r   r   r   r>   R   s   zPyJWT._encode_payload r   jwtstr | bytesAllowedPublicKeys | str | bytes
algorithmslist[str] | Noneverifybool | Nonedetached_payloadbytes | Noneaudiencestr | Iterable[str] | Noneissuerleewayfloat | timedeltakwargsr	   c
                 K  s   |
rt dt|
  t t|pi }|dd |d ur,||d kr,t jdtd |d sN|dd |dd |d	d |d
d |dd |d rX|sXt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: 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,   rJ   r   rN   )rP   rR   rS   r*   )warningswarntuplekeysr   r:   
setdefaultDeprecationWarningr   r   decode_complete_decode_payloadr   _validate_claims)r   rG   r,   rJ   r   rL   rN   rP   rR   rS   rU   decodedr*   Zmerged_optionsr   r   r   r]   d   sL   


zPyJWT.decode_completer`   c              
   C  sP   z	t |d }W n ty } ztd| d}~ww t|ts&t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)rD   loads
ValueErrorr   r9   r:   )r   r`   r*   er   r   r   r^      s   
zPyJWT._decode_payloadc
                 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: )rL   rN   rP   rR   rS   r*   )rW   rX   rY   rZ   r   r]   )r   rG   r,   rJ   r   rL   rN   rP   rR   rS   rU   r`   r   r   r   decode   s&   
zPyJWT.decodec                 C  s   t |tr	| }|d urt |ttfstd| || tjt	j
d }d|v r6|d r6| ||| d|v rE|d rE| ||| d|v rT|d rT| ||| |d	 r^| || |d
 rp| j|||ddd d S d S )Nz+audience must be a string, iterable or None)Ztzr7   r%   r8   r$   r6   r#   r'   r&   Z
strict_audFstrict)r9   r   Ztotal_secondsr5   r   r;   _validate_required_claimsr   nowr   ZutcZ	timestamp_validate_iat_validate_nbf_validate_exp_validate_iss_validate_audr=   )r   r*   r   rP   rR   rS   rh   r   r   r   r_      s&   

zPyJWT._validate_claimsc                 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_claimsrh   floatc                 C  @   zt |d }W n ty   tdw ||| krtdd S )Nr7   z)Issued At claim (iat) must be an integer.z The token is not yet valid (iat))intrb   r   r   )r   r*   rh   rS   r7   r   r   r   ri     s   zPyJWT._validate_iatc                 C  ro   )Nr8   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))rp   rb   r   r   )r   r*   rh   rS   r8   r   r   r   rj        zPyJWT._validate_nbfc                 C  s@   zt |d }W n ty   tdw ||| krtdd S )Nr6   z/Expiration Time claim (exp) must be an integer.zSignature has expired)rp   rb   r   r   )r   r*   rh   rS   r6   r   r   r   rk   &  rq   zPyJWT._validate_expFre   rf   c                  s   |d u rd|vs|d sd S t dd|vs|d std|d  |r@t|ts-t dt ts6t d| kr>t dd S t trH g t tsQt dtdd  D r^t dt|trf|g}t fd	d|D rut 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   )r9   r5   ).0cr   r   r   	<genexpr>]  s    z&PyJWT._validate_aud.<locals>.<genexpr>c                 3  s    | ]}| vV  qd S r   r   )rs   rr   Zaudience_claimsr   r   ru   c  s    zAudience doesn't match)r   r   r9   r5   listanyall)r   r*   rP   rf   r   rv   r   rm   4  s4   




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*   rR   r   r   r   rl   f  s   zPyJWT._validate_issr   )r   r   r   r   )r   r!   )r)   NNT)r*   r+   r,   r-   r.   r/   r0   r   r1   r2   r3   r4   r   r5   )NN)r*   r+   r0   r   r1   r2   r   r@   )rF   NNNNNNr   )rG   rH   r,   rI   rJ   rK   r   r   rL   rM   rN   rO   rP   rQ   rR   r/   rS   rT   rU   r	   r   r+   )r`   r+   r   r	   )rG   rH   r,   rI   rJ   rK   r   r   rL   rM   rN   rO   rP   rQ   rR   r/   rS   rT   rU   r	   r   r	   )NNr   )r*   r+   r   r+   rS   rT   r   r   )r*   r+   r   r+   r   r   )r*   r+   rh   rn   rS   rn   r   r   )r*   r+   rP   rQ   rf   r4   r   r   )r*   r+   rR   r	   r   r   )__name__
__module____qualname__r    staticmethodr   r?   r>   r]   r^   rd   r_   rg   ri   rj   rk   rm   rl   r   r   r   r   r      sT    )
E*
#
	

2r   )!Z
__future__r   rD   rW   Zcalendarr   Zcollections.abcr   r   r   r   typingr   r	   rF   r   
exceptionsr   r   r   r   r   r   r   r   rJ   r   r   r   Z_jwt_global_objr?   r]   rd   r   r   r   r   <module>   s&    $	  Y
