
    Aah-                    B   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 dd	lmZmZ dd
lmZ erddl
mZm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InvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeysc                      e Zd ZdZ	 	 d9d:d	Zed;d            Zd<dZd=dZd>dZ	d?dZ
	 	 	 	 	 d@dAd$Z	 	 	 	 dBdCd,Z	 	 	 	 dBdDd.ZdEd/ZdFd1Z	 	 dGdHd5ZdId6ZdJd8ZdS )KPyJWSJWTN
algorithmsSequence[str] | Noneoptionsdict[str, Any] | NonereturnNonec                6   t                      | _        |t          |          nt          | j                  | _        t	          | j                                                  D ]}|| j        vr| j        |= |i }i |                                 || _        d S )N)r	   _algorithmsset_valid_algslistkeys_get_default_optionsr   )selfr   r   keys       =/var/www/lms/venv/lib/python3.11/site-packages/jwt/api_jws.py__init__zPyJWS.__init__    s    
 233)5C
OOO3t?O;P;P 	
 (--//00 	* 	*C$***$S)?GA$3355AA    dict[str, bool]c                 
    ddiS )Nverify_signatureT r.   r*   r(   r%   zPyJWS._get_default_options3   s    "D))r*   alg_idstralg_objr   c                    || 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/   r1   s      r(   register_algorithmzPyJWS.register_algorithm7   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
        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/   s     r(   unregister_algorithmzPyJWS.unregister_algorithmD   sS    
 )))1  
 V$'''''r*   	list[str]c                *    t          | j                  S )zM
        Returns a list of supported values for the 'alg' parameter.
        )r#   r"   )r&   s    r(   get_algorithmszPyJWS.get_algorithmsR   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)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    r9   r
   r   NotImplementedError)r&   r?   es      r(   get_algorithm_by_namezPyJWS.get_algorithm_by_nameX   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json_encodertype[json.JSONEncoder] | Noneis_payload_detachedboolsort_headersc                   g }| t          |t                    r|j        }	nd}	n|}	|r:|                    d          }
|
r|d         }	|                    d          }|du rd}| j        |	d}|r*|                     |           |                    |           |d         s|d= |rd|d<   nd|v r|d= t          j        |d||	          	                                }|
                    t          |                     |r|}nt          |          }|
                    |           d
                    |          }|                     |	          }t          |t                    r|j        }|                    |          }|                    ||          }|
                    t          |                     |rd|d<   d
                    |          }|                    d          S )NHS256algb64FT)typrR   rT   ),:)
separatorscls	sort_keys   .r*   r   utf-8)r4   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinrD   r'   prepare_keysigndecode)r&   rE   r'   rH   rJ   rK   rM   rO   segments
algorithm_headers_algheaders_b64headerjson_headermsg_payloadsigning_inputr1   	signatureencoded_strings                      r(   rc   zPyJWS.encodei   s*     #u%% % /

$

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

&(( 	 	(55666 	4!KK*733K$$$ 		(++,,Z88c5!! 	'C!!#&&LL44	(33444  	HQK8,,$$W---r*    jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytesdetached_payloadbytes | Nonedict[str, Any]c                .   |r>t          j        dt          |                                           t          d           |i }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:    
stacklevelr-   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rS   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.rZ   r   r   )rE   rm   rq   )warningswarntupler$   r   r   r4   r   r   _loadr]   re   rsplit_verify_signature)r&   rt   r'   r   r   rw   kwargsmerged_optionsr-   rE   rp   rm   rq   s                r(   decode_completezPyJWS.decode_complete   so     	M>',V[[]]';';> > '    ?G4DL4G4)*<= 	J 	z#u7M7M 	n   59JJsOO1	::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: r{   r|   )rw   rE   )r~   r   r   r$   r   r   )r&   rt   r'   r   r   rw   r   decodeds           r(   rh   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
        r{   )r   r_   )r&   rt   rJ   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 )Nr[   z$Invalid token type. Token must be a rZ   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)r4   r0   rc   rF   r   r   splitr3   r   r5   binasciiErrorra   loadsdict)r&   rt   rp   crypto_segmentheader_segmentpayload_segmenterrheader_datarm   rC   rE   rq   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rp   rm   rq   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|	                    |          }|
                    |||          st          d          d S )NrR   zAlgorithm not specifiedz&The specified alg value is not allowedrA   zSignature verification failed)r4   r   r\   r9   r   r   r'   rD   rB   rf   verifyr   )
r&   rp   rm   rq   r'   r   rR   r1   prepared_keyrC   s
             r(   r   zPyJWS._verify_signature+  sF    *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~~m\9EE 	I'(GHHH	I 	Is!   * AB 
B9$B44B9c                H    d|v r|                      |d                    d S d S )Nkid)_validate_kid)r&   rJ   s     r(   r_   zPyJWS._validate_headersJ  s3    Gwu~..... r*   r   c                N    t          |t                    st          d          d S )Nz(Key ID header parameter must be a string)r4   r0   r   )r&   r   s     r(   r   zPyJWS._validate_kidN  s0    #s## 	P#$NOOO	P 	Pr*   )NN)r   r   r   r   r   r   )r   r+   )r/   r0   r1   r   r   r   )r/   r0   r   r   )r   r<   )r?   r0   r   r   )NNNFT)rE   rF   r'   rG   rH   rI   rJ   r   rK   rL   rM   rN   rO   rN   r   r0   )rs   NNN)rt   ru   r'   rv   r   r   r   r   rw   rx   r   ry   )rt   ru   r'   rv   r   r   r   r   rw   rx   r   r   )rt   ru   r   ry   )rt   ru   r   r   )rs   N)rp   rF   rm   ry   rq   rF   r'   rv   r   r   r   r   )rJ   ry   r   r   )r   r   r   r   )__name__
__module____qualname__r^   r)   staticmethodr%   r7   r;   r>   rD   rc   r   rh   r   r   r   r_   r   r.   r*   r(   r   r      s       J ,0)-B B B B B& * * * \*% % % %( ( ( (& & & &H H H H* !%)-6:$)!K. K. K. K. K.` 8:+/)-)-,
 ,
 ,
 ,
 ,
b 8:+/)-)-" " " " ",	 	 	 	$; $; $; $;V 8:+/I I I I I>/ / / /P P P P P Pr*   r   )%
__future__r   r   ra   r~   collections.abcr   typingr   r   r   r   r	   r
   r   api_jwkr   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   _jws_global_objrc   r   rh   r7   r;   rD   r   r.   r*   r(   <module>r      s   " " " " " "    $ $ $ $ $ $ % % % % % % % %                             6 5 5 5 5 5 5 5 , , , , , , BAAAAAAAAsP sP sP sP sP sP sP sPl	 %''		!1		$7 &; '= '=   r*   