a
    "h-                     @  s   d dl mZ d dl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mZ ddlmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ erddl
mZmZ G dd dZe ZejZejZej Z ej!Z!ej"Z"ej#Z#ej$Z$dS )    )annotationsN)Sequence)TYPE_CHECKINGAny   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)PyJWK)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeysc                
   @  s"  e Zd ZdZd?ddddddZed	d
ddZddddddZdddddZdd
ddZ	dddddZ
d@ddddd d!d!dd"d#d$ZdAd&d'ddd(d)d*d+d,ZdBd&d'ddd(d-d*d.d/Zd&d)d0d1d2Zd&d3d0d4d5ZdCdd)dd'ddd6d7d8Zd)dd9d:d;Zd-dd<d=d>ZdS )DPyJWSZJWTNzSequence[str] | Nonezdict[str, Any] | NoneNone)
algorithmsoptionsreturnc                 C  sl   t  | _|d urt|nt| j| _t| j D ]}|| jvr2| j|= q2|d u rVi }i |  || _d S )N)r   _algorithmsset_valid_algslistkeys_get_default_optionsr   )selfr   r   key r"   G/var/www/html/requester/venv/lib/python3.9/site-packages/jwt/api_jws.py__init__    s    

zPyJWS.__init__zdict[str, bool])r   c                   C  s   ddiS )Nverify_signatureTr"   r"   r"   r"   r#   r   3   s    zPyJWS._get_default_optionsstrr   )alg_idalg_objr   c                 C  s>   || j v rtdt|ts$td|| j |< | j| dS )zW
        Registers a new Algorithm for use when creating and verifying tokens.
        z Algorithm already has a handler.z!Object is not of type `Algorithm`N)r   
ValueError
isinstancer   	TypeErrorr   add)r    r'   r(   r"   r"   r#   register_algorithm7   s    


zPyJWS.register_algorithm)r'   r   c                 C  s*   || j vrtd| j |= | j| dS )z
        Unregisters an Algorithm for use when creating and verifying tokens
        Throws KeyError if algorithm is not registered.
        zJThe specified algorithm could not be removed because it is not registered.N)r   KeyErrorr   remove)r    r'   r"   r"   r#   unregister_algorithmD   s    
zPyJWS.unregister_algorithmz	list[str]c                 C  s
   t | jS )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r    r"   r"   r#   get_algorithmsR   s    zPyJWS.get_algorithms)alg_namer   c              
   C  s^   z| j | W S  tyX } z4ts:|tv r:td| d|td|W Y d}~n
d}~0 0 dS )z
        For a given string name, return the matching Algorithm object.

        Example usage:

        >>> jws_obj.get_algorithm_by_name("RS256")
        zAlgorithm 'z9' could not be found. Do you have cryptography installed?Algorithm not supportedN)r   r.   r	   r
   NotImplementedError)r    r2   er"   r"   r#   get_algorithm_by_nameX   s    
zPyJWS.get_algorithm_by_nameFTbytesz(AllowedPrivateKeys | PyJWK | str | bytesz
str | Noneztype[json.JSONEncoder] | Nonebool)payloadr!   	algorithmheadersjson_encoderis_payload_detachedsort_headersr   c                 C  sR  g }|d u r$t |tr|j}	q(d}	n|}	|rX|d}
|
rB|d }	|d}|du rXd}| j|	d}|r|| | || |d s|d= |rd|d< nd|v r|d= tj|d||d		 }|
t| |r|}nt|}|
| d
|}| |	}t |tr|j}||}|||}|
t| |r>d|d< d
|}|dS )NZHS256algb64FT)typr?   rA   ),:)
separatorscls	sort_keys   .    r   utf-8)r*   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr6   r!   prepare_keysigndecode)r    r9   r!   r:   r;   r<   r=   r>   segmentsZ
algorithm_Zheaders_algZheaders_b64headerZjson_headerZmsg_payloadsigning_inputr(   	signatureencoded_stringr"   r"   r#   rQ   i   sT    












zPyJWS.encode zstr | bytesz'AllowedPublicKeys | PyJWK | str | byteszbytes | Nonezdict[str, Any])jwtr!   r   r   detached_payloadr   c                 K  s   |r"t jdt|  tdd |d u r.i }i | j|}|d }|r^|s^t|ts^td| 	|\}	}
}}|
dddu r|d u rtd	|}	d
|
d
dd |	g}
|r| |
|||| |	||dS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs:    
stacklevelr%   z\It is required that you pass in a value for the "algorithms" argument when calling decode().r@   TFzIt is required that you pass in a value for the "detached_payload" argument to decode a message having the b64 header set to false.rG   r   r   )r9   rX   rZ   )warningswarntupler   r   r   r*   r   r   _loadrK   rS   rsplit_verify_signature)r    r]   r!   r   r   r^   kwargsZmerged_optionsr%   r9   rY   rX   rZ   r"   r"   r#   decode_complete   s<    	
zPyJWS.decode_completer   c                 K  s>   |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: r_   r`   )r^   r9   )rb   rc   rd   r   r   ri   )r    r]   r!   r   r   r^   rh   decodedr"   r"   r#   rV      s    	

zPyJWS.decode)r]   r   c                 C  s   |  |d }| | |S )zReturns back the JWT header parameters as a dict()

        Note: The signature is not verified so the header parameters
        should not be fully trusted until signature verification is complete
        r_   )re   rM   )r    r]   r;   r"   r"   r#   get_unverified_header   s    
zPyJWS.get_unverified_headerz*tuple[bytes, bytes, dict[str, Any], bytes]c              
   C  s  t |tr|d}t |ts,tdt z$|dd\}}|dd\}}W n. ty~ } ztd|W Y d }~n
d }~0 0 zt|}W n4 t	t
jfy } ztd|W Y d }~n
d }~0 0 zt|}W n6 ty }	 ztd|	 |	W Y d }	~	n
d }	~	0 0 t |tstdzt|}
W n6 t	t
jfy^ } ztd	|W Y d }~n
d }~0 0 zt|}W n6 t	t
jfy } ztd
|W Y d }~n
d }~0 0 |
|||fS )NrI   z$Invalid token type. Token must be a rG   r   zNot enough segmentszInvalid header paddingzInvalid header string: z,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r*   r&   rQ   r7   r   rf   splitr)   r   r+   binasciiErrorrO   loadsdict)r    r]   rY   Zcrypto_segmentZheader_segmentZpayload_segmenterrZheader_datarX   r5   r9   rZ   r"   r"   r#   re     s8    


  &  zPyJWS._load)rY   rX   rZ   r!   r   r   c           
   
   C  s   |d u rt |tr|jg}z|d }W n tyB   tdd Y n0 |rX|d ur`||vr`tdt |trx|j}|j}nHz| |}W n. ty }	 ztd|	W Y d }	~	n
d }	~	0 0 |	|}|
|||stdd S )Nr?   zAlgorithm not specifiedz&The specified alg value is not allowedr3   zSignature verification failed)r*   r   rJ   r.   r   r   r!   r6   r4   rT   verifyr   )
r    rY   rX   rZ   r!   r   r?   r(   Zprepared_keyr5   r"   r"   r#   rg   +  s$    
 
zPyJWS._verify_signature)r;   r   c                 C  s   d|v r|  |d  d S )Nkid)_validate_kid)r    r;   r"   r"   r#   rM   J  s    zPyJWS._validate_headers)rs   r   c                 C  s   t |tstdd S )Nz(Key ID header parameter must be a string)r*   r&   r   )r    rs   r"   r"   r#   rt   N  s    
zPyJWS._validate_kid)NN)NNNFT)r\   NNN)r\   NNN)r\   N)__name__
__module____qualname__rL   r$   staticmethodr   r-   r0   r1   r6   rQ   ri   rV   rk   re   rg   rM   rt   r"   r"   r"   r#   r      sB          P    1    +  r   )%
__future__r   rm   rO   rb   collections.abcr   typingr   r   r   r   r   r	   r
   Zapi_jwkr   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   Z_jws_global_objrQ   ri   rV   r-   r0   r6   rk   r"   r"   r"   r#   <module>   s.     8