U
    1|jK2  ã                   @  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r¸d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-g93jok2u/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°|s°t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"   TzàThe `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 ‰ |r€t|tƒsZt dƒ‚tˆ tƒslt dƒ‚|ˆ kr|t dƒ‚d S tˆ tƒr�ˆ g‰ tˆ tƒs¢t dƒ‚tdd„ ˆ D ƒƒr¼t dƒ‚t|tƒrÌ|g}t‡ fd	d„|D ƒƒrêt 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&   $	  ]