
    A1i./                    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                  J   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
	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 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                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	Fc                   g }||nd}	|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                  |	      }|j                  |      }|j                  ||      }|j                  t        |             |rd|d<   dj                  |      }|j                  d      S )Nnonealgb64FT)typr>   encodingr@   ),:)
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"   rP   zPyJWS.encodeg   s~     (1'<)&
 !++e,K$U^
!++e,Ke#&*# *.!L""7T":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                  |       |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.rH   r   r   )rV   r`   rd   )warningswarntupler   r   r   r   _loadrL   rJ   rR   rsplit_verify_signature)r   jwtr!   r    r   detached_payloadkwargsmerged_optionsr&   rV   rc   r`   rd   s                r"   decode_completezPyJWS.decode_complete   s    MM'',V[[]';&<> '	 ?G4DLL4G4)*<=Jn  59JJsO1	v&::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: )rn   rV   )rg   rh   ri   r   r   rq   )r   rm   r!   r    r   rn   ro   decodeds           r"   rU   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
           )rj   rL   )r   rm   rX   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)NrI   z$Invalid token type. Token must be a rH   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*   strrP   bytesr   rk   splitr)   r   r+   binasciiErrorrN   loadsdict)r   rm   rc   crypto_segmentheader_segmentpayload_segmenterrheader_datar`   r:   rV   rd   s               r"   rj   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   rS   verifyr   )
r   rc   r`   rd   r!   r    r>   r.   r:   prepared_keys
             r"   rl   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r?   zset[str]_supported_critrA   c               f    d|v r| j                  |d          |sd|v r| j                  |       y y y )Nkidcrit)_validate_kid_validate_crit)r   rX   rB   s      r"   rL   zPyJWS._validate_headers=  s=     Gwu~.Fg-( .xr$   c                :    t        |t              st        d      y )Nz(Key ID header parameter must be a string)r*   rx   r   )r   r   s     r"   r   zPyJWS._validate_kidE  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)r*   r   lenr   rx   r   )r   rX   r   exts       r"   r   zPyJWS._validate_critI  s    v$%Ta#$UVV 	Cc3''(WXX$...'*J3%(PQQ'!'*3%/HI 	r$   )NN)r    list[str] | Noner   dict[str, Any] | NonereturnNone)r   zdict[str, bool])r-   rx   r.   r   r   r   )r-   rx   r   r   )r   z	list[str])r9   rx   r   r   )HS256NNFT)rV   ry   r!   z AllowedPrivateKeys | str | bytesrW   z
str | NonerX   r   rY   ztype[json.JSONEncoder] | NonerZ   boolr[   r   r   rx   ) NNN)rm   str | bytesr!   AllowedPublicKeys | str | bytesr    r   r   r   rn   bytes | Noner   dict[str, Any])rm   r   r!   r   r    r   r   r   rn   r   r   r   )rm   r   r   r   )rm   r   r   z*tuple[bytes, bytes, dict[str, Any], bytes])r   N)rc   ry   r`   r   rd   ry   r!   r   r    r   r   r   )rX   r   rB   r   r   r   )r   r   r   r   )rX   r   r   r   )__name__
__module____qualname__rK   r#   staticmethodr   r/   r3   r5   r;   rP   rq   rU   rv   rj   rl   r   __annotations__rL   r   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'+)-)--
-
 --
 %	-

 '-
 '-
 
-
d 02'+)-)-"" -" %	"
 '" '" 
"*	$;V 02'+II I 	I
 -I %I 
I4 "'OX' <A)%)48)	)Pr$   r   )!
__future__r   r{   rN   rg   typingr   r   r    r   r   r	   r
   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   _jws_global_objrP   rq   rU   r/   r3   r;   rv   r'   r$   r"   <module>r      s    "    %   6 ,Az zz	 '			!11			$77 &;; '== '== r$   