
    qi2                       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      Z  e        Z!e!jD                  Z"e!jF                  Z#e!jH                  Z$e!jJ                  Z%e!jL                  Z&e!jN                  Z'e!jP                  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                  (   e Zd ZdZ	 	 d	 	 	 	 	 ddZedd       ZddZddZddZ	ddZ
	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd
Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZ	 	 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       =/opt/pipecat/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_options5   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_algorithm9   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_algorithmJ   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_algorithmsY   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_namea   sc    	H##H-- 	H(.C"C)!(+de &&?@aG	Hs    	A	*AA	c                   g }| t        |t              r|j                  }	nd}	n|}	|r/|j                  d      }
|
r|d   }	|j                  d      }|du rd}| j                  |	d}|r"| j                  |       |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                  |      }|j/                  d      S )Nnonealgb64FT)typrD   rF   ),:)
separatorscls	sort_keys   .r,      
stacklevelr)   r   utf-8)r0   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'   rX   zPyJWS.encodev   s    !# #u% //
#
"J !++e,K$U^
!++e,Ke#&*# *.!L""7+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                  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: rM   rN   r+   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rE   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.rL   r   r   )ra   rk   rp   )r]   r^   tupler!   r   r#   r0   r   r   _loadrR   rZ   rsplit_verify_signature)r$   jwtr&   r%   r#   detached_payloadkwargsmerged_optionsr+   ra   rn   rk   rp   s                r'   decode_completezPyJWS.decode_complete   s!    MM'',V[[]';&<> ' ?!\\N888N)*<=Jz#u7Mn  59JJsO1	::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: rM   rN   )rx   ra   )r]   r^   rs   r!   r   r{   )r$   rw   r&   r%   r#   rx   ry   decodeds           r'   r`   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
        rM   )rt   rT   )r$   rw   rc   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)NrP   z$Invalid token type. Token must be a rL   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   strrX   bytesr   ru   splitr/   r   r1   binasciiErrorrV   loadsdict)r$   rw   rn   crypto_segmentheader_segmentpayload_segmenterrheader_datark   r@   ra   rp   s               r'   rt   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)
NrD   zAlgorithm not specifiedz&The specified alg value is not allowedr=   r,   F   rN   zSignature verification failed)r0   r   rQ   r7   r   r   r&   rA   r>   r[   r\   r#   rR   r   r]   r^   r   verifyr   )r$   rn   rk   rp   r&   r%   rD   r4   prepared_keyr@   ro   s              r'   rv   zPyJWS._verify_signatureC  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-c                6    d|v r| j                  |d          y y )Nkid)_validate_kid)r$   rc   s     r'   rT   zPyJWS._validate_headersi  s!    Gwu~. r)   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_kidm  s    #s##$NOO $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   )HS256NNFT)ra   r   r&   z(AllowedPrivateKeys | PyJWK | str | bytesrb   z
str | Nonerc   zdict[str, Any] | Nonerd   ztype[json.JSONEncoder] | Nonere   boolrf   r   r   r   ) NNN)rw   str | bytesr&   'AllowedPublicKeys | PyJWK | str | bytesr%   r   r#   r   rx   bytes | Nonery   dict[str, Any]r   r   )rw   r   r&   r   r%   r   r#   r   rx   r   ry   r   r   r   )rw   r   r   r   )rw   r   r   z*tuple[bytes, bytes, dict[str, Any], bytes])r   N)rn   r   rk   r   rp   r   r&   r   r%   r   r   r   )rc   r   r   r   )r   r   r   r   )__name__
__module____qualname__rS   r(   staticmethodr"   r5   r9   r;   rA   rX   r{   r`   r   rt   rv   rT   r   r-   r)   r'   r   r      s   J ,0%)7(7 #7 
	7& O O%"(&H2 !()-6:$)!S.S. 6S. 	S.
 'S. 4S. "S. S. 
S.p 8:+/%))-/
/
 5/
 )	/

 #/
 '/
 !/
 
/
h 8:+/%))-"" 5" )	"
 #" '" !" 
",	$;V 8:+/$I$I $I 	$I
 5$I )$I 
$IL/Pr)   r   ))
__future__r   r   rV   r]   collections.abcr   typingr   r   r%   r   r	   r
   r   api_jwkr   
exceptionsr   r   r   r   r   utilsr   r   r   r   r   r   typesr   r   _jws_global_objrX   r{   r`   r5   r9   rA   r   r-   r)   r'   <module>r      s    "    $ %    6 FA!PP PPf
 '			!11			$77 &;; '== '== r)   