o
    Kjar                     @   s   d dl Z d dl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mZmZ ddlmZmZmZmZ ddlmZmZ G dd	 d	Ze ZejZejZejZejZejZejZdS )
    N)Mapping)AnyDictListOptionalType   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encodec                   @   s  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e
dedee dee deeej  defddZ			d*dededee dedeeef f
ddZ			d*dededee dedef
ddZdd Zd d! Z		d+d"d#Zd$d% Zd&d' ZdS ),PyJWSJWTNc                 C   sl   t  | _|d urt|nt| j| _t| j D ]}|| jvr$| j|= q|d u r+i }i |  || _d S )N)r
   _algorithmsset_valid_algslistkeys_get_default_optionsoptions)self
algorithmsr   key r   -/usr/lib/python3/dist-packages/jwt/api_jws.py__init__   s   
zPyJWS.__init__c                   C   s   ddiS )Nverify_signatureTr   r   r   r   r    r   '   s   zPyJWS._get_default_optionsc                 C   s>   || 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   alg_idalg_objr   r   r    register_algorithm+   s   


zPyJWS.register_algorithmc                 C   s*   || 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'   r   r   r    unregister_algorithm8   s   
zPyJWS.unregister_algorithmc                 C   s
   t | jS )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r   r   r   r    get_algorithmsF   s   
zPyJWS.get_algorithmsHS256payloadr   	algorithmheadersjson_encoderreturnc              
   C   s  g }|d u rd}|rd|v r|d r|d }| j |d}|r/| | || |d s/|d= tj|d|d }|t| |t| d|}	z| j	| }
|

|}|
|	|}W n ty| } ztss|tv rstd| |td	|d }~ww |t| d|}|d
S )Nnonealg)typr5   r6   ),:)
separatorscls   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?Algorithm not supportedutf-8)
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr   prepare_keysignr*   r   r   NotImplementedErrordecode)r   r/   r   r0   r1   r2   segmentsheaderjson_headersigning_inputr(   	signatureeencoded_stringr   r   r    rC   L   sL   





	

zPyJWS.encode jwtr   r   c                 K   sf   |d u ri }i | j |}|d }|r|std| |\}}	}
}|r-| |	|
||| ||
|dS )Nr"   z\It is required that you pass in a value for the "algorithms" argument when calling decode().)r/   rK   rN   )r   r   _load_verify_signature)r   rR   r   r   r   kwargsmerged_optionsr"   r/   rM   rK   rN   r   r   r    decode_complete   s   zPyJWS.decode_completec                 K   s    | j ||||fi |}|d S )Nr/   )rW   )r   rR   r   r   r   rU   decodedr   r   r    rI      s   zPyJWS.decodec                 C   s   |  |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
           )rS   r?   )r   rR   r1   r   r   r    get_unverified_header   s   
zPyJWS.get_unverified_headerc              
   C   sj  t |tr
|d}t |tstdt z|dd\}}|dd\}}W n ty9 } ztd|d }~ww zt|}W n t	t
jfyT } ztd|d }~ww zt|}W n tyo }	 ztd|	 |	d }	~	ww t |tsytdzt|}
W n t	t
jfy } ztd	|d }~ww zt|}W n t	t
jfy } ztd
|d }~ww |
|||fS )Nr=   z$Invalid token type. Token must be a r;   r   zNot enough segmentszInvalid header paddingzInvalid header string: %sz,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r$   strrC   bytesr   rsplitsplitr#   r   r%   binasciiErrorrA   loadsr   )r   rR   rM   crypto_segmentheader_segmentpayload_segmenterrheader_datarK   rO   r/   rN   r   r   r    rS      sL   







zPyJWS._loadc           	   
   C   sv   | d}|d ur||vrtdz| j| }||}||||s'tdW d S  ty: } ztd|d }~ww )Nr5   z&The specified alg value is not allowedzSignature verification failedr<   )getr   r   rF   verifyr   r*   )	r   rM   rK   rN   r   r   r5   r(   rO   r   r   r    rT      s   
	


zPyJWS._verify_signaturec                 C   s   d|v r|  |d  d S d S )Nkid)_validate_kid)r   r1   r   r   r    r?      s   zPyJWS._validate_headersc                 C   s   t |ts	tdd S )Nz(Key ID header parameter must be a string)r$   r[   r   )r   ri   r   r   r    rj      s   
zPyJWS._validate_kid)NN)r.   NN)rQ   NN)rQ   N)__name__
__module____qualname__r>   r!   staticmethodr   r)   r,   r-   r\   r[   r   r   r   rA   JSONEncoderrC   r   r   rW   rI   rZ   rS   rT   r?   rj   r   r   r   r    r      sv    



:

 
+
r   )r_   rA   collections.abcr   typingr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   r   r   r   utilsr   r   r   _jws_global_objrC   rW   rI   r)   r,   rZ   r   r   r   r    <module>   s      i
