o
    s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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Sequence)datetime	timedeltatimezone)TYPE_CHECKINGAny   )api_jws)	DecodeErrorExpiredSignatureErrorImmatureSignatureErrorInvalidAudienceErrorInvalidIssuedAtErrorInvalidIssuerErrorInvalidJTIErrorInvalidSubjectErrorMissingRequiredClaimError)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeys)PyJWKc                   @  s   e Zd ZdOdPddZedQd	d
Z				dRdSddZ		dTdUddZ									dVdWd1d2ZdXd4d5Z										dVdYd6d7Z
				dZd[d8d9Zd\d:d;ZdOd]d<d=Zd]d>d?Zd^dBdCZd^dDdEZd^dFdGZdHdId_dKdLZd`dMdNZdS )aPyJWTNoptionsdict[str, Any] | NonereturnNonec                 C  s"   |d u ri }i |   || _d S N)_get_default_optionsr   )selfr    r"   _/var/www/html/construction_image-detection-poc/venv/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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_optionsTpayloaddict[str, Any]key(AllowedPrivateKeys | PyJWK | 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)r5   r6   )r8   )
isinstancedict	TypeErrorcopygetr   r   utctimetuple_encode_payloadr   encode)	r!   r/   r1   r3   r5   r6   r8   
time_claimjson_payloadr"   r"   r#   rE   1   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.
        ),:)
separatorsclszutf-8)jsondumpsrE   )r!   r/   r5   r6   r"   r"   r#   rD   W   s   zPyJWT._encode_payload r   jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytes
algorithmsSequence[str] | Noneverifybool | Nonedetached_payloadbytes | Noneaudiencestr | Iterable[str] | Noneissuerstr | Sequence[str] | Nonesubjectleewayfloat | timedelta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.)categoryrc   r'   Fr(   r)   r*   r+   r,   r-   )r1   rS   r   rW   )rY   r[   r^   r]   r/   )warningswarntuplekeysr   r?   
setdefaultDeprecationWarningr   decode_complete_decode_payloadr   _validate_claims)r!   rP   r1   rS   r   rU   rW   rY   r[   r]   r^   r`   decodedr/   merged_optionsr"   r"   r#   rk   i   sV   

	zPyJWT.decode_completern   c              
   C  sR   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)rM   loads
ValueErrorr   r>   r?   )r!   rn   r/   er"   r"   r#   rl      s   
zPyJWT._decode_payloadc                 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: ra   rb   )rU   rW   rY   r]   r[   r^   r/   )re   rf   rg   rh   r   rk   )r!   rP   r1   rS   r   rU   rW   rY   r]   r[   r^   r`   rn   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
 rn| j|||ddd |d rx| || |d r| | d S d S )Nz+audience must be a string, iterable or None)tzr<   r)   r=   r(   r;   r'   r+   r*   
strict_audFstrictr,   r-   )r>   r   total_secondsr:   r   r@   _validate_required_claimsr   nowr   utc	timestamp_validate_iat_validate_nbf_validate_exp_validate_iss_validate_audrB   _validate_sub_validate_jti)r!   r/   r   rY   r[   r]   r^   rz   r"   r"   r#   rm      s.   
	zPyJWT._validate_claimsc                 C  s(   |d D ]}| |d u rt|qd S )Nr.   )rB   r   )r!   r/   r   claimr"   r"   r#   ry     s
   zPyJWT._validate_required_claimsc                 C  sH   d|vrdS t |d tstd|dur |d|kr"tddS 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)r>   r:   r   rB   )r!   r/   r]   r"   r"   r#   r     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
        jtiNzJWT ID must be a string)r>   rB   r:   r   )r!   r/   r"   r"   r#   r   2  s
   zPyJWT._validate_jtirz   floatc                 C  B   zt |d }W n ty   tdd w ||| krtdd S )Nr<   z)Issued At claim (iat) must be an integer.z The token is not yet valid (iat))intrq   r   r   )r!   r/   rz   r^   r<   r"   r"   r#   r}   @  s   zPyJWT._validate_iatc                 C  r   )Nr=   z*Not Before claim (nbf) must be an integer.z The token is not yet valid (nbf))r   rq   r   r   )r!   r/   rz   r^   r=   r"   r"   r#   r~   O  s   
zPyJWT._validate_nbfc                 C  sB   zt |d }W n ty   tdd w ||| krtdd S )Nr;   z/Expiration Time claim (exp) must be an integer.zSignature has expired)r   rq   r   r   )r!   r/   rz   r^   r;   r"   r"   r#   r   ]  s   zPyJWT._validate_expFrv   rw   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   )r>   r:   ).0cr"   r"   r#   	<genexpr>  s    z&PyJWT._validate_aud.<locals>.<genexpr>c                 3  s    | ]}| vV  qd S r   r"   )r   r   audience_claimsr"   r#   r     s    zAudience doesn't match)r   r   r>   r:   listanyall)r!   r/   rY   rw   r"   r   r#   r   m  s4   




zPyJWT._validate_audc                 C  sV   |d u rd S d|vrt dt|tr|d |krtdd S |d |vr)tdd S )NisszInvalid issuer)r   r>   r:   r   )r!   r/   r[   r"   r"   r#   r     s   
zPyJWT._validate_issr   )r   r   r   r   )r   r%   )NNNT)r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   r9   r   r:   )NN)r/   r0   r5   r   r6   r7   r   rH   )	rO   NNNNNNNr   )rP   rQ   r1   rR   rS   rT   r   r   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r4   r^   r_   r`   r
   r   r0   )rn   r0   r   r
   )rP   rQ   r1   rR   rS   rT   r   r   rU   rV   rW   rX   rY   rZ   r]   r4   r[   r\   r^   r_   r`   r
   r   r
   )NNNr   )
r/   r0   r   r0   r]   r4   r^   r_   r   r   )r/   r0   r   r0   r   r   )r/   r0   r   r   )r/   r0   rz   r   r^   r   r   r   )r/   r0   rY   rZ   rw   r9   r   r   )r/   r0   r[   r
   r   r   )__name__
__module____qualname__r$   staticmethodr    rE   rD   rk   rl   rs   rm   ry   r   r   r}   r~   r   r   r   r"   r"   r"   r#   r      s^    )
J-
*	



2r   )&
__future__r   rM   re   calendarr   collections.abcr   r   r   r   r   typingr	   r
   rO   r   
exceptionsr   r   r   r   r   r   r   r   r   r   rS   r   r   api_jwkr   r   _jwt_global_objrE   rk   rs   r"   r"   r"   r#   <module>   s*    ,   
