
    1
i7                    j   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  e             Z! G 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                      e Zd ZU dZ	 	 dAdBd	ZedCd            ZdDdZdEdZdFdZ	dGdZ
eddddfdHd%Z	 	 	 	 dIdJd.Z	 	 	 	 dIdKd0ZdLd1ZdMd3Z	 	 dNdOd7Zd8hZd9ed:<   dd;dPd=ZdQd?ZdRd@ZdS )SPyJWSJWTN
algorithmsSequence[str] | NoneoptionsSigOptions | NonereturnNonec                N   t                      | _        |t          |          nt          | j                  | _        t	          | j                                                  D ]}|| j        vr| j        |= |                                 | _        |i | j        || _        d S d S )N)r	   _algorithmsset_valid_algslistkeys_get_default_optionsr   )selfr   r   keys       C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\jwt/api_jws.py__init__zPyJWS.__init__$   s    
 233)5C
OOO3t?O;P;P 	
 (--//00 	* 	*C$***$S)#'#<#<#>#>6dl6g6DLLL     r   c                     dddS )NTF)verify_signatureenforce_minimum_key_length r1   r-   r+   r(   zPyJWS._get_default_options7   s    $(NNNr-   alg_idstralg_objr   c                    || 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)   r2   r4   s      r+   register_algorithmzPyJWS.register_algorithm;   sm     T%%%?@@@'9-- 	A?@@@#* V$$$$$r-   c                z    || 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)   r2   s     r+   unregister_algorithmzPyJWS.unregister_algorithmL   sS     )))1  
 V$'''''r-   	list[str]c                *    t          | j                  S )zh
        Returns a list of supported values for the `alg` parameter.

        :rtype: list[str]
        )r&   r%   )r)   s    r+   get_algorithmszPyJWS.get_algorithms[   s     D$%%%r-   alg_namec                    	 | j         |         S # t          $ r9}t          s|t          v rt	          d| d          |t	          d          |d}~ww xY 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#   r<   r
   r   NotImplementedError)r)   rB   es      r+   get_algorithm_by_namezPyJWS.get_algorithm_by_namec   s    	H#H-- 	H 	H 	H (.C"C"C)e(eee  &&?@@aG	Hs    
A4AAFT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                   g }|t           u r t          |t                    r|j        }	n'd}	n$| t          |t                    r|j        }	nd}	n|}	|r:|                    d          }
|
r|d         }	|                    d          }|du rd}| j        |	d}|r,|                     |d           |                    |           |d	         s|d	= |rd|d<   nd|v r|d= t          j	        |d
||          
                                }|                    t          |                     |r|}nt          |          }|                    |           d                    |          }|                     |	          }t          |t                    r|j        }|                    |          }|                    |          }|rF| j                            dd          rt'          |          t)          j        |t,          d           |                    ||          }|                    t          |                     |rd|d<   d                    |          }|                    d          S )NHS256nonealgb64FT)typrW   encodingrY   ),:)
separatorscls	sort_keys   .r0      
stacklevelr-   r   utf-8)_ALGORITHM_UNSETr7   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinrG   r*   prepare_keycheck_key_lengthr   r   warningswarnr   signdecode)r)   rH   r*   rK   rM   rO   rQ   rS   segments
algorithm_headers_algheaders_b64headerjson_headermsg_payloadsigning_inputr4   key_length_msg	signatureencoded_strings                       r+   rn   zPyJWS.encodex   s    !# (((#u%% % /

$

#u%% $ /

#

"J  	+!++e,,K ,$U^
!++e,,Ke##&*# *.!L!L 	#""7T":::MM'"""e} 	u 	!F5MMf__ujz||
 
 

&(( 	 	(55666 	4!KK*733K$$$ 		(++,,Z88c5!! 	'C!!#&& 11#66 	V| <eDD V%n555n.FSTUUUULL44	(33444  	HQK8,,$$W---r-    jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytesdetached_payloadbytes | Nonekwargsdict[str, Any]c                d   |r>t          j        dt          |                                           t          d           || j        }ni | j        |}|d         }|r&|s$t          |t                    st          d          | 	                    |          \  }	}
}}| 
                    |           |                    dd          du rD|t          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: rb   rc   r/   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rX   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.ra   r   r   )rH   r{   r   )rs   rt   tupler'   r   r   r7   r   r   _loadrj   rh   rp   rsplit_verify_signature)r)   r   r*   r   r   r   r   merged_optionsr/   rH   r~   r{   r   s                r+   decode_completezPyJWS.decode_complete   s     	M>',V[[]]';';> > '    ?!\NN888N)*<= 	J 	z#u7M7M 	n   59JJsOO1	v&&&::eT""e++'! Z   'G II}';';D!'D'DQ'G&QRRM 	V""=&)S*UUU "
 
 	
r-   r   c                    |r>t          j        dt          |                                           t          d           |                     |||||          }|d         S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rb   rc   )r   rH   )rs   rt   r   r'   r   r   )r)   r   r*   r   r   r   r   decodeds           r+   rv   zPyJWS.decode  s      	M>',V[[]]';';> > '    &&j'<L ' 
 
 y!!r-   c                f    |                      |          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
        rb   )r   rj   )r)   r   rM   s      r+   get_unverified_headerzPyJWS.get_unverified_header  s1     **S//!$w'''r-   *tuple[bytes, bytes, dict[str, Any], bytes]c                   t          |t                    r|                    d          }t          |t                    st	          dt                     	 |                    dd          \  }}|                    dd          \  }}n"# t          $ r}t	          d          |d }~ww xY w	 t          |          }n.# t          t          j        f$ r}t	          d          |d }~ww xY w	 t          j        |          }n%# t          $ r}	t	          d|	           |	d }	~	ww xY wt          |t                    st	          d          	 t          |          }
n.# t          t          j        f$ r}t	          d	          |d }~ww xY w	 t          |          }n.# t          t          j        f$ r}t	          d
          |d }~ww xY w|
|||fS )Nre   z$Invalid token type. Token must be a ra   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)r7   r3   rn   rI   r   r   splitr6   r   r8   binasciiErrorrl   loadsdict)r)   r   r~   crypto_segmentheader_segmentpayload_segmenterrheader_datar{   rF   rH   r   s               r+   r   zPyJWS._load&  s0   c3 	&**W%%C#u%% 	NLULLMMM	>,/JJtQ,?,?)M>.;.A.A$.J.J+NOO 	> 	> 	>344#=	>	A*>::KK8>* 	A 	A 	A677S@	A	D%)Z%<%<FF 	D 	D 	D;;;<<!C	D &$'' 	NLMMM	B&77GG8>* 	B 	B 	B788cA	B	A(88II8>* 	A 	A 	A677S@	A 	::sx   2B 
B*B%%B*.B> >C)C$$C)-D 
D$DD$E F2FFF G1GGr~   r{   r   c                   |t          |t                    r|j        g}	 |d         }n# t          $ r t	          d          d w xY w|r|||vrt	          d          t          |t                    r|j        }|j        }nN	 |                     |          }n"# t          $ r}	t	          d          |	d }	~	ww xY w|	                    |          }|
                    |          }
|
rF| j                            dd          rt          |
          t          j        |
t           d           |                    |||          st%          d	          d S )
NrW   zAlgorithm not specifiedz&The specified alg value is not allowedrD   r0   F   rc   zSignature verification failed)r7   r   rg   r<   r   r   r*   rG   rE   rq   rr   r   rh   r   rs   rt   r   verifyr   )r)   r~   r{   r   r*   r   rW   r4   prepared_keyrF   r   s              r+   r   zPyJWS._verify_signatureL  s    *S%"8"8,-J	M-CC 	M 	M 	M'(ABBL	M  	Rz-#Z2G2G'(PQQQc5!! 	4mG7LLN44S99& N N N+,EFFAMN"..s33L 11,?? 	V| <eDD V%n555n.FSTUUUU~~m\9EE 	I'(GHHH	I 	Is!   * AB 
B9$B44B9rX   zset[str]_supported_critrZ   r[   c                   d|v r|                      |d                    |sd|v r|                     |           d S d S d S )Nkidcrit)_validate_kid_validate_crit)r)   rM   r[   s      r+   rj   zPyJWS._validate_headersu  sc     Gwu~... 	)Fg--(((((	) 	)--r-   r   c                N    t          |t                    st          d          d S )Nz(Key ID header parameter must be a string)r7   r3   r   )r)   r   s     r+   r   zPyJWS._validate_kid}  s0    #s## 	P#$NOOO	P 	Pr-   c                :   |d         }t          |t                    rt          |          dk    rt          d          |D ]X}t          |t                    st          d          || j        vrt          d|           ||vrt          d| d          Yd S )Nr   r   z/Invalid 'crit' header: must be a non-empty listz-Invalid 'crit' header: values must be stringsz Unsupported critical extension: zCritical extension 'z' is missing from headers)r7   r&   lenr   r3   r   )r)   rM   r   exts       r+   r   zPyJWS._validate_crit  s    v$%% 	WTa#$UVVV 	 	Cc3'' Y'(WXXX$...'(P3(P(PQQQ'!!'I3III   "	 	r-   )NN)r   r   r   r   r    r!   )r    r   )r2   r3   r4   r   r    r!   )r2   r3   r    r!   )r    r?   )rB   r3   r    r   )rH   rI   r*   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rR   r    r3   )r   NNN)r   r   r*   r   r   r   r   r   r   r   r   r   r    r   )r   r   r*   r   r   r   r   r   r   r   r   r   r    r   )r   r   r    r   )r   r   r    r   )r   N)r~   rI   r{   r   r   rI   r*   r   r   r   r    r!   )rM   r   r[   rR   r    r!   )r   r   r    r!   )rM   r   r    r!   )__name__
__module____qualname__ri   r,   staticmethodr(   r:   r>   rA   rG   rf   rn   r   rv   r   r   r   r   __annotations__rj   r   r   r1   r-   r+   r   r   !   s        J ,0%)7 7 7 7 7& O O O \O% % % %"( ( ( (& & & &H H H H2 !1)-6:$)!X. X. X. X. X.z 8:+/%))-1
 1
 1
 1
 1
l 8:+/%))-" " " " ",	 	 	 	$; $; $; $;V 8:+/$I $I $I $I $IN "'O'''' <A) ) ) ) ) )P P P P     r-   r   )+
__future__r   r   rl   rs   collections.abcr   typingr   r   r   r   r	   r
   r   api_jwkr   
exceptionsr   r   r   r   r   utilsr   r   r   r   r   r   typesr   objectrf   r   _jws_global_objrn   r   rv   r:   r>   rG   r   r1   r-   r+   <module>r      s   " " " " " "    $ $ $ $ $ $ % % % % % % % %                               6 5 5 5 5 5 5 5 F F F F F F F F "AAAAAAAA!!!!!!688 l l l l l l l l^ %''		!1		$7 &; '= '=   r-   