
    dd[+                    b   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 erdd	lmZmZ  G d
 d      Z e       Zej4                  Zej6                  Zej8                  Zej:                  Zej<                  Zej>                  Zej@                  Z y)    )annotationsN)TYPE_CHECKINGAny   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)RemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeysc                      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                2   t               | _        |t        |      nt        | j                        | _        t	        | j                  j                               D ]  }|| j                  vs| j                  |=   |i }i | j                         || _        y )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    
 23)5C
O3t?O?O;P 	
 ((--/0 	*C$***$$S)	* ?GA$335AA    c                 
    ddiS )Nverify_signatureT r'   r$   r"   r   zPyJWS._get_default_options1   s    "D))r$   c                    || j                   v rt        d      t        |t              st	        d      || j                   |<   | j
                  j                  |       y)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   alg_idalg_objs      r"   register_algorithmzPyJWS.register_algorithm5   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
        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_algorithmB   sH    
 )))1 
 V$'r$   c                ,    t        | j                        S )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r   s    r"   get_algorithmszPyJWS.get_algorithmsP   s     D$$%%r$   c                    	 | j                   |   S # t        $ r/}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   r1   r	   r
   NotImplementedError)r   alg_namees      r"   get_algorithm_by_namezPyJWS.get_algorithm_by_nameV   sc    	H##H-- 	H(.C"C)!(+de &&?@aG	Hs    	A	*AA	c                   g }||nd}	|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                  |	      }|j                  |      }|j                  ||      }|j                  t        |             |rd|d<   d
j                  |      }|j                  d      S )Nnonealgb64FT)typr>   r@   ),:)
separatorscls	sort_keys   .r$   r   utf-8)get
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr;   prepare_key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_inputr.   	signatureencoded_strings                      r"   rN   zPyJWS.encodeg   sy     (1'<)&
 !++e,K$U^
!++e,Ke#&*# *.!L""7+MM'"e}u!F5Mf_ujjz||

&( 	 	(56!K*73K$ 		(+,,Z8!!#&LL4	(34 HQK8,$$W--r$   c                   |r4t        j                  dt        |j                                t               |i }i | j
                  |}|d   }|r|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: r&   z\It is required that you pass in a value for the "algorithms" argument when calling decode().r?   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.rF   r   r   )rT   r^   rb   )warningswarntupler   r   r   r   _loadrH   rP   rsplit_verify_signature)r   jwtr!   r    r   detached_payloadkwargsmerged_optionsr&   rT   ra   r^   rb   s                r"   decode_completezPyJWS.decode_complete   s    MM'',V[[]';&<> '	 ?G4DLL4G4)*<=Jn  59JJsO1	::eT"e+'! Z  'G II}';';D!'DQ'G&QRM""=&)S*U "
 	
r$   c                    |r4t        j                  dt        |j                                t               | j                  |||||      }|d   S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: )rl   rT   )re   rf   rg   r   r   ro   )r   rk   r!   r    r   rl   rm   decodeds           r"   rS   zPyJWS.decode   sc     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
           )rh   rJ   )r   rk   rV   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)NrG   z$Invalid token type. Token must be a rF   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*   strrN   bytesr   ri   splitr)   r   r+   binasciiErrorrL   loadsdict)r   rk   ra   crypto_segmentheader_segmentpayload_segmenterrheader_datar^   r:   rT   rb   s               r"   rh   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                "   	 |d   }|r|||vrt        d      	 | j                  |      }|j	                  |      }	|j                  ||	|      st        d      y # t         $ r t        d      w xY w# t        $ r}t        d      |d }~ww xY w)Nr>   zAlgorithm not specifiedz&The specified alg value is not allowedr7   zSignature verification failed)r1   r   r;   r8   rQ   verifyr   )
r   ra   r^   rb   r!   r    r>   r.   r:   prepared_keys
             r"   rj   zPyJWS._verify_signature  s    	C-C z-#Z2G'(PQQ	J005G **3/~~m\9E'(GHH F  	C'(ABB	C # 	J'(ABI	Js"   A A4 A14	B=B		Bc                6    d|v r| j                  |d          y y )Nkid)_validate_kid)r   rV   s     r"   rJ   zPyJWS._validate_headers8  s!    Gwu~. r$   c                :    t        |t              st        d      y )Nz(Key ID header parameter must be a string)r*   rv   r   )r   r   s     r"   r   zPyJWS._validate_kid<  s    #s##$NOO $r$   )NN)r    list[str] | Noner   dict[str, Any] | NonereturnNone)r   zdict[str, bool])r-   rv   r.   r   r   r   )r-   rv   r   r   )r   z	list[str])r9   rv   r   r   )HS256NNFT)rT   rw   r!   z AllowedPrivateKeys | str | bytesrU   z
str | NonerV   r   rW   ztype[json.JSONEncoder] | NonerX   boolrY   r   r   rv   ) NNN)rk   str | bytesr!   AllowedPublicKeys | str | bytesr    r   r   r   rl   bytes | Noner   dict[str, Any])rk   r   r!   r   r    r   r   r   rl   r   r   r   )rk   r   r   r   )rk   r   r   z*tuple[bytes, bytes, dict[str, Any], bytes])r   N)ra   rw   r^   r   rb   rw   r!   r   r    r   r   r   )rV   r   r   r   )r   r   r   r   )__name__
__module____qualname__rI   r#   staticmethodr   r/   r3   r5   r;   rN   ro   rS   rt   rh   rj   rJ   r   r'   r$   r"   r   r      s   J (,)-B$B 'B 
	B& * *%(&H* !()-6:$)!C.C. .C. 	C.
 'C. 4C. "C. C. 
C.P 02'+)-)-+
+
 -+
 %	+

 '+
 '+
 
+
` 02'+)-)-"" -" %	"
 '" '" 
"*	$;V 02'+II I 	I
 -I %I 
I2/Pr$   r   )!
__future__r   ry   rL   re   typingr   r   r    r   r   r	   r
   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   _jws_global_objrN   ro   rS   r/   r3   r;   rt   r'   r$   r"   <module>r      s    "    %   6 ,AcP cPL	 '			!11			$77 &;; '== '== r$   