
    Pǻi7                       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#jH                  Z$e#jJ                  Z%e#jL                  Z&e#jN                  Z'e#jP                  Z(e#jR                  Z)e#jT                  Z*y)    )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                  R   e Zd ZU dZ	 	 d	 	 	 	 	 ddZedd       ZddZddZddZ	ddZ
eddd	d
f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 	 	 d!dZ	 	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 	 	 d"dZd#dZd$dZ	 	 d%	 	 	 	 	 	 	 	 	 	 	 d&dZdhZded<   d	d	 	 	 	 	 d'dZd(dZd)dZy)*PyJWSJWTNc                R   t               | _        |t        |      nt        | j                        | _        t	        | j                  j                               D ]  }|| j                  vs| j                  |=   | j                         | _        |i | j                  || _        y y )N)r	   _algorithmsset_valid_algslistkeys_get_default_optionsoptions)self
algorithmsr#   keys       I/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/jwt/api_jws.py__init__zPyJWS.__init__$   s    
 23)5C
O3t?O?O;P 	
 ((--/0 	*C$***$$S)	* $(#<#<#>6dll6g6DL     c                     dddS )NTF)verify_signatureenforce_minimum_key_length r-   r)   r'   r"   zPyJWS._get_default_options7   s    $(NNr)   c                    || j                   v rt        d      t        |t              st	        d      || j                   |<   | j
                  j                  |       y)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$   alg_idalg_objs      r'   register_algorithmzPyJWS.register_algorithm;   sX     T%%%?@@'9-?@@#* V$r)   c                    || j                   vrt        d      | j                   |= | j                  j                  |       y)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$   r3   s     r'   unregister_algorithmzPyJWS.unregister_algorithmL   sH     )))1 
 V$'r)   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)   c                    	 | j                   |   S # t        $ r/}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   r7   r
   r   NotImplementedError)r$   alg_namees      r'   get_algorithm_by_namezPyJWS.get_algorithm_by_namec   sc    	H##H-- 	H(.C"C)!(+de &&?@aG	Hs    	A	*AA	FTc                P   g }|t         u r t        |t              r|j                  }	n'd}	n$| t        |t              r|j                  }	nd}	n|}	|r/|j	                  d      }
|
r|d   }	|j	                  d      }|du rd}| j
                  |	d}|r$| j                  |d       |j                  |       |d	   s|d	= |rd|d<   nd|v r|d= t        j                  |d
||      j                         }|j                  t        |             |r|}nt        |      }|j                  |       dj                  |      }| j                  |	      }t        |t              r|j                  }|j!                  |      }|j#                  |      }|rC| j$                  j	                  dd      rt'        |      t)        j*                  |t,        d       |j/                  ||      }|j                  t        |             |rd|d<   dj                  |      }|j1                  d      S )NHS256nonealgb64FT)typrE   encodingrG   ),:)
separatorscls	sort_keys   .r,      
stacklevelr)   r   utf-8)_ALGORITHM_UNSETr0   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinrA   r&   prepare_keycheck_key_lengthr#   r   warningswarnr   signdecode)r$   payloadr&   	algorithmheadersjson_encoderis_payload_detachedsort_headerssegments
algorithm_headers_algheaders_b64headerjson_headermsg_payloadsigning_inputr4   key_length_msg	signatureencoded_strings                       r'   r\   zPyJWS.encodex   s    !# ((#u% //
$
#u% //
#
"J !++e,K$U^
!++e,Ke#&*# *.!L""7T":MM'"e}u!F5Mf_ujjz||

&( 	 	(56!K*73K$ 		(+,,Z8c5!''C!!#& 11#6|| <eD%n55n.FSTULL4	(34 HQK8,$$W--r)   c                   |r6t        j                  dt        |j                                t        d       || j
                  }ni | j
                  |}|d   }|r|st        |t              st        d      | j                  |      \  }	}
}}| j                  |       |j                  dd      du r5|t        d	      |}	d
j                  |
j                  d
d      d   |	g      }
|r| j                  |
||||       |	||dS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rP   rQ   r+   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rF   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   )re   ro   rt   )ra   rb   tupler!   r   r#   r0   r   r   _loadrX   rV   r^   rsplit_verify_signature)r$   jwtr&   r%   r#   detached_payloadkwargsmerged_optionsr+   re   rr   ro   rt   s                r'   decode_completezPyJWS.decode_complete   s/    MM'',V[[]';&<> ' ?!\\N888N)*<=Jz#u7Mn  59JJsO1	v&::eT"e+'! Z  'G II}';';D!'DQ'G&QRM""=&)S*U "
 	
r)   c                    |r6t        j                  dt        |j                                t        d       | j                  |||||      }|d   S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rP   rQ   )r|   re   )ra   rb   rw   r!   r   r   )r$   r{   r&   r%   r#   r|   r}   decodeds           r'   rd   zPyJWS.decode  sf     MM'',V[[]';&<> ' &&j'<L ' 
 y!!r)   c                P    | j                  |      d   }| j                  |       |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
        rP   )rx   rX   )r$   r{   rg   s      r'   get_unverified_headerzPyJWS.get_unverified_header  s)     **S/!$w'r)   c                   t        |t              r|j                  d      }t        |t              st	        dt               	 |j                  dd      \  }}|j                  dd      \  }}	 t        |      }	 t        j                  |      }t        |t              st	        d      	 t        |      }
	 t        |      }|
|||fS # t        $ r}t	        d      |d }~ww xY w# t        t        j                  f$ r}t	        d      |d }~ww xY w# t        $ r}	t	        d|	       |	d }	~	ww xY w# t        t        j                  f$ r}t	        d	      |d }~ww xY w# t        t        j                  f$ r}t	        d
      |d }~ww xY w)NrS   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)r0   strr\   bytesr   ry   splitr/   r   r1   binasciiErrorrZ   loadsdict)r$   r{   rr   crypto_segmentheader_segmentpayload_segmenterrheader_dataro   r@   re   rt   s               r'   rx   zPyJWS._load&  s   c3**W%C#u% DUGLMM	>,/JJtQ,?)M>.;.A.A$.J+NO	A*>:K	D%)ZZ%<F &$'LMM	B&7G	A(8I 	::5  	>34#=	>
 8>>* 	A67S@	A
  	D 7s;<!C	D 8>>* 	B78cA	B
 8>>* 	A67S@	Asx   *C
 0C' <D -D4 9E! 
	C$CC$'D DD	D1D,,D14EEE!F:FFc                `   |t        |t              r|j                  g}	 |d   }|r|||vrt	        d      t        |t              r|j
                  }|j                  }n#	 | j                  |      }|j                  |      }|j                  |      }
|
rC| j                  j                  dd      rt        |
      t        j                  |
t         d       |j#                  |||      st%        d	      y # t        $ r t	        d      d w xY w# t        $ r}	t	        d      |	d }	~	ww xY w)
NrE   zAlgorithm not specifiedz&The specified alg value is not allowedr=   r,   F   rQ   zSignature verification failed)r0   r   rU   r7   r   r   r&   rA   r>   r_   r`   r#   rV   r   ra   rb   r   verifyr   )r$   rr   ro   rt   r&   r%   rE   r4   prepared_keyr@   rs   s              r'   rz   zPyJWS._verify_signatureL  s:    *S%"8,,-J	M-C z-#Z2G'(PQQc5!mmG77LN44S9 #..s3L 11,?|| <eD%n55n.FSTU~~m\9E'(GHH F/  	M'(ABL	M ' N+,EFAMNs#   C: #D :D	D-D((D-rF   zset[str]_supported_critrH   c               f    d|v r| j                  |d          |sd|v r| j                  |       y y y )Nkidcrit)_validate_kid_validate_crit)r$   rg   rI   s      r'   rX   zPyJWS._validate_headersu  s=     Gwu~.Fg-( .xr)   c                :    t        |t              st        d      y )Nz(Key ID header parameter must be a string)r0   r   r   )r$   r   s     r'   r   zPyJWS._validate_kid}  s    #s##$NOO $r)   c                   |d   }t        |t              rt        |      dk(  rt        d      |D ]L  }t        |t              st        d      || j
                  vrt        d|       ||vs?t        d| d       y )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)r0   r    lenr   r   r   )r$   rg   r   exts       r'   r   zPyJWS._validate_crit  s    v$%Ta#$UVV 	Cc3''(WXX$...'*J3%(PQQ'!'*3%/HI 	r)   )NN)r%   Sequence[str] | Noner#   SigOptions | NonereturnNone)r   r   )r3   r   r4   r   r   r   )r3   r   r   r   )r   z	list[str])r?   r   r   r   )re   r   r&   z(AllowedPrivateKeys | PyJWK | str | bytesrf   z
str | Nonerg   zdict[str, Any] | Nonerh   ztype[json.JSONEncoder] | Noneri   boolrj   r   r   r   ) NNN)r{   str | bytesr&   'AllowedPublicKeys | PyJWK | str | bytesr%   r   r#   r   r|   bytes | Noner}   dict[str, Any]r   r   )r{   r   r&   r   r%   r   r#   r   r|   r   r}   r   r   r   )r{   r   r   r   )r{   r   r   z*tuple[bytes, bytes, dict[str, Any], bytes])r   N)rr   r   ro   r   rt   r   r&   r   r%   r   r   r   )rg   r   rI   r   r   r   )r   r   r   r   )rg   r   r   r   )__name__
__module____qualname__rW   r(   staticmethodr"   r5   r9   r;   rA   rT   r\   r   rd   r   rx   rz   r   __annotations__rX   r   r   r-   r)   r'   r   r   !   s   J ,0%)7(7 #7 
	7& O O%"(&H2 !1)-6:$)!X.X. 6X. 	X.
 'X. 4X. "X. X. 
X.z 8:+/%))-1
1
 51
 )	1

 #1
 '1
 !1
 
1
l 8:+/%))-"" 5" )	"
 #" '" !" 
",	$;V 8:+/$I$I $I 	$I
 5$I )$I 
$IN "'OX' <A)%)48)	)Pr)   r   )+
__future__r   r   rZ   ra   collections.abcr   typingr   r   r%   r   r	   r
   r   api_jwkr   
exceptionsr   r   r   r   r   utilsr   r   r   r   r   r   typesr   objectrT   r   _jws_global_objr\   r   rd   r5   r9   rA   r   r-   r)   r'   <module>r      s    "    $ %    6 FA!8 l l^ '			!11			$77 &;; '== '== r)   