U
    ڲgK2                     @  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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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)datetime	timedeltatimezone)TYPE_CHECKINGAnyList   )api_jws)DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorMissingRequiredClaimError)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeys)PyJWKc                   @  sJ  e Zd ZdCdddddZeddd	d
ZdDddddddddddZdEdddddddZdFdddddd d!d"d#d$dd%d&d'Zdd$d(d)d*Z	dGdddddd d!d"d#d$d$d%d+d,Z
dHddd#dd-d.d/Zdddd0d1d2Zdd3d3dd4d5d6Zdd3d3dd4d7d8Zdd3d3dd4d9d:Zd;d<dd!ddd=d>d?Zdd$dd@dAdBZdS )IPyJWTNzdict[str, Any] | NoneNone)optionsreturnc                 C  s   |d kri }|   || _d S N)_get_default_optionsr   )selfr    r   //tmp/pip-unpacked-wheel-ecrjo5d0/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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HS256Tzdict[str, Any]z AllowedPrivateKeys | 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)r/   r0   )r1   )
isinstancedict	TypeErrorcopygetr   r   utctimetuple_encode_payloadr   encode)	r   r,   r-   r.   r/   r0   r1   Z
time_claimZjson_payloadr   r   r    r<   -   s*    

zPyJWT.encodebytes)r,   r/   r0   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,   r/   r0   r   r   r    r;   S   s    zPyJWT._encode_payload r   zstr | bytesz'AllowedPublicKeys | PyJWK | str | byteszlist[str] | Nonezbool | Nonezbytes | Nonezstr | Iterable[str] | Nonezstr | List[str] | Nonezfloat | timedeltar	   )jwtr-   
algorithmsr   verifydetached_payloadaudienceissuerleewaykwargsr   c
                 K  s   |
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}| |}| 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-   rF   r   rH   )rI   rJ   rK   r,   )warningswarntuplekeysr   r6   
setdefaultDeprecationWarningr   r   decode_complete_decode_payloadr   _validate_claims)r   rE   r-   rF   r   rG   rH   rI   rJ   rK   rL   decodedr,   Zmerged_optionsr   r   r    rT   e   sP    

    zPyJWT.decode_complete)rW   r   c              
   C  sZ   zt |d }W n0 tk
rB } ztd| W 5 d}~X Y nX t|tsVt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)rB   loads
ValueErrorr   r5   r6   )r   rW   r,   er   r   r    rU      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: )rG   rH   rI   rJ   rK   r,   )rN   rO   rP   rQ   r   rT   )r   rE   r-   rF   r   rG   rH   rI   rJ   rK   rL   rW   r   r   r    decode   s"    zPyJWT.decode)r,   r   rK   r   c                 C  s   t |tr| }|d k	r0t |ttfs0td| || tjt	j
d }d|krl|d rl| ||| d|kr|d r| ||| d|kr|d r| ||| |d	 r| || |d
 r| j|||ddd d S )Nz+audience must be a string, iterable or None)tzr3   r%   r4   r$   r2   r#   r'   r&   Z
strict_audFstrict)r5   r   total_secondsr+   r   r7   _validate_required_claimsr   nowr   utc	timestamp_validate_iat_validate_nbf_validate_exp_validate_iss_validate_audr9   )r   r,   r   rI   rJ   rK   ra   r   r   r    rV      s(    
  
zPyJWT._validate_claims)r,   r   r   c                 C  s(   |d D ]}| |d krt|qd S )Nr(   )r9   r   )r   r,   r   Zclaimr   r   r    r`     s    zPyJWT._validate_required_claimsfloat)r,   ra   rK   r   c                 C  sF   zt |d }W n tk
r,   tdY nX ||| krBtdd S )Nr3   z)Issued At claim (iat) must be an integer.z The token is not yet valid (iat))intrY   r   r   )r   r,   ra   rK   r3   r   r   r    rd     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 )Nr4   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))rj   rY   r   r   )r   r,   ra   rK   r4   r   r   r    re     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 )Nr2   z/Expiration Time claim (exp) must be an integer.zSignature has expired)rj   rY   r   r   )r   r,   ra   rK   r2   r   r   r    rf   '  s    zPyJWT._validate_expFr]   )r,   rI   r^   r   c                  s   |d kr$d|ks|d sd S t dd|k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   )r5   r+   ).0cr   r   r    	<genexpr>^  s     z&PyJWT._validate_aud.<locals>.<genexpr>c                 3  s   | ]}| kV  qd S r   r   )rl   rk   Zaudience_claimsr   r    rn   d  s     zAudience doesn't match)r   r   r5   r+   listanyall)r   r,   rI   r^   r   ro   r    rh   5  s2    




zPyJWT._validate_aud)r,   rJ   r   c                 C  sT   |d krd S d|krt dt|tr<|d |krPtdn|d |krPtdd S )NZisszInvalid issuer)r   r5   rp   r   )r   r,   rJ   r   r   r    rg   g  s    

zPyJWT._validate_iss)N)r)   NNT)NN)rD   NNNNNNr   )rD   NNNNNNr   )NNr   )__name__
__module____qualname__r!   staticmethodr   r<   r;   rT   rU   r[   rV   r`   rd   re   rf   rh   rg   r   r   r   r    r      sR       )          $E        $*   #	2r   )$
__future__r   rB   rN   calendarr   collections.abcr   r   r   r   typingr   r	   r
   rD   r   
exceptionsr   r   r   r   r   r   r   r   rF   r   r   Zapi_jwkr   r   Z_jwt_global_objr<   rT   r[   r   r   r   r    <module>   s&   $	  ]