o
    kYi                     @   s   d dl Z d dlZd dlZzd dlmZmZmZmZmZ W n	 e	y%   Y nw 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mZmZ ddlmZmZmZmZ G dd	 d	eZe Z e j!Z!e j"Z"e j#Z#e j$Z$e j%Z%dS )
    N)CallableDictListOptionalUnion   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)Mappingbinary_typestring_types	text_type)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encodeforce_bytes
merge_dictc                   @   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dZ
				d ddZdd Zdd Z	d!ddZdd Zdd ZdS )"PyJWSJWTNc                 C   sf   t  | _|d urt|nt| j| _t| j D ]}|| jvr$| j|= q|s)i }t|  || _d S )N)	r	   _algorithmsset_valid_algslistkeysr   _get_default_optionsoptions)self
algorithmsr    key r$   O/var/www/html/asistente-voz-ia/venv/lib/python3.10/site-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_algorithm:   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HS256c                 C   s   g }|d u rd}|| j vr	 | j|d}|r | | || ttj|d|d}|t| |t| d	|}	z| j
| }
|
|}|
|	|}W n tyf   tsb|tv rbtd| tdw |t| d	|S )Nnone)typalg),:)
separatorscls   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?Algorithm not supported)r   
header_typ_validate_headersupdater   jsondumpsappendr   joinr   prepare_keysignr/   r
   r   NotImplementedError)r!   payloadr#   	algorithmheadersjson_encodersegmentsheaderjson_headersigning_inputr-   	signaturer$   r$   r%   encodeL   sD   





	
zPyJWS.encode Tc                 K   sn   t | j|}|d }|r|stdt | |\}	}
}}|s)tjdtdd |	S |r5| |	|
|||| |	S )Nr'   zIt is strongly recommended that you pass in a value for the "algorithms" argument when calling decode(). This argument will be mandatory in a future version.zSThe verify parameter is deprecated. Please use verify_signature in options instead.   )
stacklevel)r   r    warningswarnDeprecationWarning_load_verify_signature)r!   jwtr#   verifyr"   r    kwargsmerged_optionsr'   rG   rN   rL   rO   r$   r$   r%   decode   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
        rR   )rW   r>   )r!   rY   rI   r$   r$   r%   get_unverified_header   s   
zPyJWS.get_unverified_headerc              
   C   sB  t |tr
|d}tt|tstdtz|dd\}}|	dd\}}W n t
y5   tdw zt|}W n ttjfyJ   tdw z
t|d}W n t
yg } ztd| d }~ww t |tsqtdzt|}	W n ttjfy   td	w zt|}
W n ttjfy   td
w |	|||
fS )Nzutf-8z'Invalid token type. Token must be a {0}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)   r   rP   
issubclasstyper   r   formatrsplitsplitr(   r   r*   binasciiErrorr@   loadsr]   r   )r!   rY   rN   crypto_segmentheader_segmentpayload_segmentheader_datarL   erG   rO   r$   r$   r%   rW      sH   


zPyJWS._loadc           	      C   sj   | d}|d ur||vrtdz| j| }||}||||s'tdW d S  ty4   tdw )Nr6   z&The specified alg value is not allowedzSignature verification failedr<   )getr   r   rD   rZ   r   r/   )	r!   rG   rN   rL   rO   r#   r"   r6   r-   r$   r$   r%   rX      s   


zPyJWS._verify_signaturec                 C   s   d|v r|  |d  d S d S )Nkid)_validate_kid)r!   rI   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!   rm   r$   r$   r%   rn      s   
zPyJWS._validate_kid)NN)r3   NN)rQ   TNN)rQ   N)__name__
__module____qualname__r=   r&   staticmethodr   r.   r1   r2   rP   r]   r^   rW   rX   r>   rn   r$   r$   r$   r%   r      s.    

	
7
(
r   )&rd   r@   rT   typingr   r   r   r   r   ImportErrorr"   r   r	   r
   r   compatr   r   r   r   
exceptionsr   r   r   r   utilsr   r   r   r   objectr   _jws_global_objrP   r]   r.   r1   r^   r$   r$   r$   r%   <module>   s(      Y
