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 ),PyJWSZ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 )NZnonealg)typr3   r4   ),:)Z
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   r/   r0   r1   ZsegmentsheaderZjson_headersigning_inputr'   	signatureeZencoded_stringr   r   r   r@   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.   rG   rI   )r   r   _load_verify_signature)r   rL   r   r   r   kwargsZmerged_optionsr!   r.   rH   rG   rI   r   r   r   decode_complete   s   zPyJWS.decode_completec                 K   s    | j ||||fi |}|d S )Nr.   )rP   )r   rL   r   r   r   rO   Zdecodedr   r   r   rF      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
           )rM   r<   )r   rL   r0   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 r8   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#   strr@   bytesr   rsplitsplitr"   r   r$   binasciiErrorr>   loadsr   )r   rL   rH   Zcrypto_segmentZheader_segmentZpayload_segmenterrZheader_datarG   rJ   r.   rI   r   r   r   rM      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 )Nr3   z&The specified alg value is not allowedzSignature verification failedr9   )getr   r   rC   Zverifyr   r)   )	r   rH   rG   rI   r   r   r3   r'   rJ   r   r   r   rN      s   
	


zPyJWS._verify_signaturec                 C   s   d|v r|  |d  d S d S )Nkid)_validate_kid)r   r0   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#   rS   r   )r   r\   r   r   r   r]      s   
zPyJWS._validate_kid)NN)r-   NN)rK   NN)rK   N)__name__
__module____qualname__r;   r    staticmethodr   r(   r+   r,   rT   rS   r   r   r   r>   ZJSONEncoderr@   r   r   rP   rF   rR   rM   rN   r<   r]   r   r   r   r   r      sv    



:

 
+
r   )rW   r>   Zcollections.abcr   typingr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   r   r   r   Zutilsr   r   r   Z_jws_global_objr@   rP   rF   r(   r+   rR   r   r   r   r   <module>   s      i
