
    7)c)                       d dl mZ d dlZd dlZd dlZd dlmZmZ ddlm	Z	m
Z
mZ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  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)AnyType   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)RemovedInPyjwt3Warningc                      e Zd ZdZd6d7dZed8d            Zd9dZd:dZd;dZ	d<dZ
	 	 	 	 d=d>dZ	 	 	 	 d?d@d(Z	 	 	 	 d?dAd)ZdBd,ZdCd.Z	 	 dDdEd2ZdFd3ZdGd5ZdS )HPyJWSJWTN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_optionsoptions)self
algorithmsr   keys       -/usr/lib/python3/dist-packages/jwt/api_jws.py__init__zPyJWS.__init__   s    1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_options*   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)   r+   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
        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_algorithm;   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_algorithmsI   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   r3   r	   r
   NotImplementedError)r   r9   es      r"   get_algorithm_by_namezPyJWS.get_algorithm_by_nameO   s    	H#H-- 	H 	H 	H (.C"C"C)e(eee  &&?@@aG	Hs    
A4AAHS256Fpayloadbytesr!   	algorithm
str | Noneheadersdict[str, Any] | Nonejson_encoderType[json.JSONEncoder] | Noneis_payload_detachedboolc                d   g }||nd}|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|d	                                          }|                    t          |                     |r|}nt          |          }|                    |           d
	                    |          }| 
                    |          }|                    |          }|                    ||          }|                    t          |                     |rd|d<   d
	                    |          }|                    d          S )Nnonealgb64FT)typrL   rN   ),:)
separatorscls	sort_keys   .r$   r   utf-8)get
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr>   prepare_keysigndecode)r   r@   r!   rB   rD   rF   rH   segments
algorithm_headers_algheaders_b64headerjson_headermsg_payloadsigning_inputr+   	signatureencoded_strings                     r"   r\   zPyJWS.encode`   s     (1'<))&
  	+!++e,,K ,$U^
!++e,,Ke##&*# *.!L!L 	#""7+++MM'"""e} 	u 	!F5MMf__u jz|t
 
 

&(( 	 	(55666 	4!KK*733K$$$ 		(++,,Z88!!#&&LL44	(33444  	HQK8,,$$W---r$    jwtr    list[str] | Noner   detached_payloadbytes | Nonedict[str, Any]c                    |r<t          j        dt          |                                           t                     |i }i | j        |}|d         }|r|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: 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@   rf   rj   )warningswarntupler   r   r   r   _loadrV   r^   rsplit_verify_signature)r   rm   r!   r    r   ro   kwargsmerged_optionsr'   r@   ri   rf   rj   s                r"   decode_completezPyJWS.decode_complete   sV     	M>',V[[]]';';> > '	   ?G4DL4G4)*<= 	J 	n   59JJsOO1	::eT""e++'! Z   'G II}';';D!'D'DQ'G&QRRM 	V""=&)S*UUU "
 
 	
r$   c                    |r<t          j        dt          |                                           t                     |                     |||||          }|d         S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: )ro   r@   )rs   rt   ru   r   r   r{   )r   rm   r!   r    r   ro   ry   decodeds           r"   ra   zPyJWS.decode   s|      	M>',V[[]]';';> > '	   &&j'<L ' 
 
 y!!r$   str | bytesdictc                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
           )rv   rX   )r   rm   rD   s      r"   get_unverified_headerzPyJWS.get_unverified_header   s1     **S//!$w'''r$    tuple[bytes, bytes, dict, 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 )NrU   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)r.   r*   r\   rA   r   rw   splitr-   r   r/   binasciiErrorrZ   loadsr   )r   rm   ri   crypto_segmentheader_segmentpayload_segmenterrheader_datarf   r=   r@   rj   s               r"   rv   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ri   rf   rj   c                F   |                     d          }|r|||vrt          d          	 |                     |          }n"# t          $ r}t          d          |d }~ww xY w|                    |          }|                    |||          st          d          d S )NrL   z&The specified alg value is not allowedr;   zSignature verification failed)rV   r   r>   r<   r_   verifyr   )	r   ri   rf   rj   r!   r    rL   r+   r=   s	            r"   rx   zPyJWS._verify_signature  s     jj 	Rz-#Z2G2G'(PQQQ	J0055GG" 	J 	J 	J'(ABBI	J!!#&&~~mS)<< 	I'(GHHH	I 	Is   A 
A#AA#c                H    d|v r|                      |d                    d S d S )Nkid)_validate_kid)r   rD   s     r"   rX   zPyJWS._validate_headers/  s3    Gwu~..... r$   r   c                N    t          |t                    st          d          d S )Nz(Key ID header parameter must be a string)r.   r*   r   )r   r   s     r"   r   zPyJWS._validate_kid3  s0    #s## 	P#$NOOO	P 	Pr$   )NN)r   r   )r   r%   )r)   r*   r+   r   r   r   )r)   r*   r   r   )r   r6   )r9   r*   r   r   )r?   NNF)r@   rA   r!   r*   rB   rC   rD   rE   rF   rG   rH   rI   r   r*   )rl   NNN)rm   r*   r!   r*   r    rn   r   rE   ro   rp   r   rq   )rm   r*   r!   r*   r    rn   r   rE   ro   rp   r   r*   )rm   r~   r   r   )rm   r~   r   r   )rl   N)ri   rA   rf   r   rj   rA   r!   r*   r    rn   r   r   )rD   rq   r   r   )r   r*   r   r   )__name__
__module____qualname__rW   r#   staticmethodr   r1   r5   r8   r>   r\   r{   ra   r   rv   rx   rX   r   r(   r$   r"   r   r      s       JB B B B B * * * \*% % % %( ( ( (& & & &H H H H* !()-6:$)C. C. C. C. C.P '+)-)-+
 +
 +
 +
 +
` '+)-)-" " " " "*	 	 	 	$; $; $; $;V '+I I I I I./ / / /P P P P P Pr$   r   )
__future__r   r   rZ   rs   typingr   r   r    r   r   r	   r
   
exceptionsr   r   r   r   utilsr   r   r   r   _jws_global_objr\   r{   ra   r1   r5   r>   r   r(   r$   r"   <module>r      sv   " " " " " "                                  6 5 5 5 5 5 5 5 , , , , , ,]P ]P ]P ]P ]P ]P ]P ]P@	 %''		!1		$7 &; '= '=   r$   