o
    i2                     @  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mZ dd	lmZmZ dd
lmZ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$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InvalidKeyErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)InsecureKeyLengthWarningRemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeys)
SigOptionsc                   @  s   e Zd ZdZ		dJdKd	d
ZedLddZdMddZdNddZdOddZ	dPddZ
					dQdRd,d-Z	.			dSdTd6d7Z	.			dSdUd9d:ZdVd;d<ZdWd>d?Z	.	dXdYdCdDZdZdEdFZd[dHdIZdS )\PyJWSZJWTN
algorithmsSequence[str] | NoneoptionsSigOptions | NonereturnNonec                 C  st   t  | _|d urt|nt| j| _t| j D ]}|| jvr$| j|= q|  | _|d ur8i | j|| _d S d S )N)r   _algorithmsset_valid_algslistkeys_get_default_optionsr   )selfr   r   key r'   B/home/app/Keep/.python/lib/python3.10/site-packages/jwt/api_jws.py__init__"   s   

zPyJWS.__init__r   c                   C  s
   dddS )NTF)verify_signatureenforce_minimum_key_lengthr'   r'   r'   r'   r(   r$   5   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 )z
        Registers a new Algorithm for use when creating and verifying tokens.

        :param str alg_id: the ID of the Algorithm
        :param alg_obj: the Algorithm object
        :type alg_obj: Algorithm
        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_algorithm9   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
        :param str alg_id: the ID of the Algorithm
        :raises 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_algorithmJ   s   
zPyJWS.unregister_algorithm	list[str]c                 C  s
   t | jS )zh
        Returns a list of supported values for the `alg` parameter.

        :rtype: list[str]
        )r"   r!   )r%   r'   r'   r(   get_algorithmsY   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 )a/  
        For a given string name, return the matching Algorithm object.

        Example usage:
        >>> jws_obj = PyJWS()
        >>> jws_obj.get_algorithm_by_name("RS256")

        :param alg_name: The name of the algorithm to retrieve
        :type alg_name: str
        :rtype: Algorithm
        zAlgorithm 'z9' could not be found. Do you have cryptography installed?Algorithm not supportedN)r   r4   r	   r
   NotImplementedError)r%   r9   er'   r'   r(   get_algorithm_by_namea   s   

zPyJWS.get_algorithm_by_nameHS256FTpayloadbytesr&   (AllowedPrivateKeys | PyJWK | str | bytes	algorithm
str | Noneheadersdict[str, Any] | Nonejson_encodertype[json.JSONEncoder] | Noneis_payload_detachedboolsort_headersc                 C  s  g }|d u rt |tr|j}	nd}	n|}	|r,|d}
|
r!|d }	|d}|du r,d}| j|	d}|r>| | || |d sE|d= |rLd|d< nd|v rS|d= tj|d||d		 }|
t| |rj|}nt|}|
| d
|}| |	}t |tr|j}||}||}|r| jddrt|tj|tdd |||}|
t| |rd|d< d
|}|dS )Nnonealgb64FT)typrL   rN   ),:)
separatorscls	sort_keys   .r+      
stacklevel    r   utf-8)r0   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr=   r&   prepare_keycheck_key_lengthr   r   warningswarnr   signdecode)r%   r?   r&   rB   rD   rF   rH   rJ   segmentsZ
algorithm_Zheaders_algZheaders_b64headerZjson_headerZmsg_payloadsigning_inputr.   key_length_msg	signatureencoded_stringr'   r'   r(   ra   v   sb   














zPyJWS.encode jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytesdetached_payloadbytes | Nonekwargsdict[str, Any]c                 K  s   |rt jdt|  tdd |d u r| j}ni | j|}|d }|r1|s1t|ts1td| 	|\}	}
}}|
dddu rY|d u rJtd	|}	d
|
d
dd |	g}
|rd| |
|||| |	||dS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rU   rV   r*   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rM   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.rT   r   r   )r?   rk   rn   )rf   rg   tupler#   r   r   r0   r   r   _loadr[   rc   rsplit_verify_signature)r%   rq   r&   r   r   rt   rv   Zmerged_optionsr*   r?   rl   rk   rn   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: rU   rV   )rt   r?   )rf   rg   rx   r#   r   r|   )r%   rq   r&   r   r   rt   rv   decodedr'   r'   r(   ri      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
        rU   )ry   r]   )r%   rq   rD   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 )NrY   z$Invalid token type. Token must be a rT   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)r0   r-   ra   r@   r   rz   splitr/   r   r1   binasciiErrorr_   loadsdict)r%   rq   rl   Zcrypto_segmentZheader_segmentZpayload_segmenterrZheader_datark   r<   r?   rn   r'   r'   r(   ry     sL   







zPyJWS._loadrl   rk   rn   c              
   C  s   |d u rt |tr|jg}z|d }W n ty   tdd w |r*|d ur.||vr.tdt |tr:|j}|j}nz| |}W n tyR }	 ztd|	d }	~	ww |	|}|
|}
|
rr| jddrjt|
tj|
tdd ||||s}td	d S )
NrL   zAlgorithm not specifiedz&The specified alg value is not allowedr:   r+   F   rV   zSignature verification failed)r0   r   rZ   r4   r   r   r&   r=   r;   rd   re   r   r[   r   rf   rg   r   verifyr   )r%   rl   rk   rn   r&   r   rL   r.   Zprepared_keyr<   rm   r'   r'   r(   r{   C  s6   




zPyJWS._verify_signaturec                 C  s   d|v r|  |d  d S d S )Nkid)_validate_kid)r%   rD   r'   r'   r(   r]   i  s   zPyJWS._validate_headersr   c                 C  s   t |ts	tdd S )Nz(Key ID header parameter must be a string)r0   r-   r   )r%   r   r'   r'   r(   r   m  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   r7   )r9   r-   r   r   )r>   NNFT)r?   r@   r&   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rI   r   r-   )rp   NNN)rq   rr   r&   rs   r   r   r   r   rt   ru   rv   rw   r   rw   )rq   rr   r&   rs   r   r   r   r   rt   ru   rv   rw   r   r   )rq   rr   r   rw   )rq   rr   r   r   )rp   N)rl   r@   rk   rw   rn   r@   r&   rs   r   r   r   r   )rD   rw   r   r   )r   r   r   r   )__name__
__module____qualname__r\   r)   staticmethodr$   r3   r6   r8   r=   ra   r|   ri   r~   ry   r{   r]   r   r'   r'   r'   r(   r      sD    



X4

+
&r   ))
__future__r   r   r_   rf   collections.abcr   typingr   r   r   r   r   r	   r
   Zapi_jwkr   
exceptionsr   r   r   r   r   utilsr   r   r   r   r   r   typesr   r   Z_jws_global_objra   r|   ri   r3   r6   r=   r~   r'   r'   r'   r(   <module>   s2      U
