o
    i,                     @  s   d dl mZ d dlZd dlZd dl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rPd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)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		dHdId	d
ZedJddZdKddZdLddZdMddZ	dNddZ
					dOdPd+d,Z	-			dQdRd4d5Z	-			dQdSd7d8ZdTd9d:ZdUd<d=Z	-	dVdWdAdBZdXdCdDZdYdFdGZdS )ZPyJWSZJWTN
algorithmslist[str] | Noneoptionsdict[str, Any] | NonereturnNonec                 C  sl   t  | _|d urt|nt| j| _t| j D ]}|| jvr$| j|= q|d u r+i }i |  || _d S )N)r   _algorithmsset_valid_algslistkeys_get_default_optionsr   )selfr   r   key r#   ^/home/www/bk.finsightngr.online/finsigh_v2/venv200/lib/python3.10/site-packages/jwt/api_jws.py__init__   s   
zPyJWS.__init__dict[str, bool]c                   C  s   ddiS )Nverify_signatureTr#   r#   r#   r#   r$   r    2   s   zPyJWS._get_default_optionsalg_idstr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_algorithm6   s   


zPyJWS.register_algorithmc                 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_algorithmC   s   
zPyJWS.unregister_algorithm	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_algorithmsQ   s   
zPyJWS.get_algorithmsalg_namec              
   C  sN   z| j | W S  ty& } zts|tv rtd| d|td|d}~ww )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   r0   r   r	   NotImplementedError)r!   r5   er#   r#   r$   get_algorithm_by_nameW   s   

zPyJWS.get_algorithm_by_nameHS256FTpayloadbytesr"    AllowedPrivateKeys | str | bytes	algorithm
str | Noneheadersjson_encodertype[json.JSONEncoder] | Noneis_payload_detachedboolsort_headersc                 C  s*  g }|d ur|nd}	|r"| d}
|
r|d }	| d}|du r"d}| j|	d}|r4| | || |d s;|d= |rBd|d< nd|v rI|d= tj|d||d	 }|t| |r`|}nt|}|| d
	|}| 
|	}||}|||}|t| |rd|d< d
	|}|dS )Nnonealgb64FT)typrG   rI   ),:)
separatorscls	sort_keys   .    r   utf-8)get
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr9   prepare_keysigndecode)r!   r;   r"   r>   r@   rA   rC   rE   segmentsZ
algorithm_Zheaders_algZheaders_b64headerZjson_headerZmsg_payloadsigning_inputr*   	signatureencoded_stringr#   r#   r$   rX   h   sL   











zPyJWS.encode jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytesdetached_payloadbytes | Nonedict[str, Any]c                 K  s   |rt dt|  t |d u ri }i | j|}|d }|r-|s-t|ts-td| 	|\}	}
}}|
dddu rU|d u rFt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: r'   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rH   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.rO   r   r   )r;   r_   ra   )warningswarntupler   r   r   r,   r
   r   _loadrR   rZ   rsplit_verify_signature)r!   rd   r"   r   r   rg   kwargsZmerged_optionsr'   r;   r`   r_   ra   r#   r#   r$   decode_complete   s:   	
zPyJWS.decode_completer   c                 K  s:   |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   r;   )rj   rk   rl   r   r   rq   )r!   rd   r"   r   r   rg   rp   decodedr#   r#   r$   r]      s   	

zPyJWS.decodec                 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
           )rm   rT   )r!   rd   r@   r#   r#   r$   get_unverified_header   s   
zPyJWS.get_unverified_header*tuple[bytes, bytes, dict[str, Any], bytes]c              
   C  sl  t |tr
|d}t |tstdt z|dd\}}|dd\}}W n ty9 } ztd|d }~ww zt|}W n t	t
jfyT } ztd|d }~ww zt|}W n typ }	 ztd|	 |	d }	~	ww t |tsztdzt|}
W n t	t
jfy } ztd	|d }~ww zt|}W n t	t
jfy } ztd
|d }~ww |
|||fS )NrQ   z$Invalid token type. Token must be a rO   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)   rX   r<   r   rn   splitr+   r   r-   binasciiErrorrV   loadsdict)r!   rd   r`   Zcrypto_segmentZheader_segmentZpayload_segmenterrZheader_datar_   r8   r;   ra   r#   r#   r$   rm      sL   







zPyJWS._loadr`   r_   ra   c           
   
   C  s   |d u rt |tr|jg}z|d }W n ty   tdw |r)|d ur-||vr-tdt |tr9|j}|j}nz| |}W n tyQ }	 ztd|	d }	~	ww |	|}|
|||sbtdd S )NrG   zAlgorithm not specifiedz&The specified alg value is not allowedr6   zSignature verification failed)r,   r
   Zalgorithm_namer0   r   r   r"   r9   r7   r[   verifyr   )
r!   r`   r_   ra   r"   r   rG   r*   Zprepared_keyr8   r#   r#   r$   ro      s,   


zPyJWS._verify_signaturec                 C  s   d|v r|  |d  d S d S )Nkid)_validate_kid)r!   r@   r#   r#   r$   rT   ?  s   zPyJWS._validate_headersr}   c                 C  s   t |ts	tdd S )Nz(Key ID header parameter must be a string)r,   r)   r   )r!   r}   r#   r#   r$   r~   C  s   
zPyJWS._validate_kid)NN)r   r   r   r   r   r   )r   r&   )r(   r)   r*   r   r   r   )r(   r)   r   r   )r   r3   )r5   r)   r   r   )r:   NNFT)r;   r<   r"   r=   r>   r?   r@   r   rA   rB   rC   rD   rE   rD   r   r)   )rc   NNN)rd   re   r"   rf   r   r   r   r   rg   rh   r   ri   )rd   re   r"   rf   r   r   r   r   rg   rh   r   r   )rd   re   r   ri   )rd   re   r   ru   )rc   N)r`   r<   r_   ri   ra   r<   r"   rf   r   r   r   r   )r@   ri   r   r   )r}   r   r   r   )__name__
__module____qualname__rS   r%   staticmethodr    r/   r2   r4   r9   rX   rq   r]   rt   rm   ro   rT   r~   r#   r#   r#   r$   r      sD    



H0

+
r   )#
__future__r   rw   rV   rj   typingr   r   r   r   r   r   r	   Zapi_jwkr
   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   Z_jws_global_objrX   rq   r]   r/   r2   r9   rt   r#   r#   r#   r$   <module>   s.      .
