U
    a                     @   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	k
rL   Y nX 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 )"PyJWSZJWTNc                 C   sf   t  | _|d k	rt|nt| j| _t| j D ]}|| jkr2| j|= q2|sRi }t|  || _d S )N)	r	   _algorithmsset_valid_algslistkeysr   _get_default_optionsoptions)self
algorithmsr   key r#   z/home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/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 k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 k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 krd}|| j kr| j|d}|r>| | || ttj|d|d}|t| |t| d	|}	z$| j
| }
|
|}|
|	|}W n6 tk
r   ts|tkrtd| ntdY nX |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headersZjson_encodersegmentsheaderZjson_headersigning_inputr,   	signaturer#   r#   r$   encodeL   s@    





zPyJWS.encode Tc                 K   sl   t | j|}|d }|r(|s(tdt | |\}	}
}}|sPtjdtdd n|rh| |	|
|||| |	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   kwargsZmerged_optionsr&   rF   rK   rJ   rL   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
        rO   )rT   r=   )r    rV   rH   r#   r#   r$   get_unverified_header   s    
zPyJWS.get_unverified_headerc              
   C   sh  t |tr|d}tt|ts0tdtz$|dd\}}|	dd\}}W n t
k
rp   tdY nX zt|}W n" ttjfk
r   tdY nX zt|d}W n. t
k
r } ztd| W 5 d }~X Y nX t |tstdzt|}	W n$ ttjfk
r(   td	Y nX zt|}
W n$ ttjfk
rZ   td
Y nX |	|||
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   rM   
issubclasstyper   r   formatrsplitsplitr'   r   r)   binasciiErrorr?   loadsrY   r   )r    rV   rK   Zcrypto_segmentZheader_segmentZpayload_segmentZheader_datarJ   erF   rL   r#   r#   r$   rT      s<    


zPyJWS._loadc           	      C   sr   | d}|d k	r"||kr"tdz.| j| }||}||||sNtdW n tk
rl   tdY nX d S )Nr5   z&The specified alg value is not allowedzSignature verification failedr;   )getr   r   rC   rW   r   r.   )	r    rF   rK   rJ   rL   r"   r!   r5   r,   r#   r#   r$   rU      s    


zPyJWS._verify_signaturec                 C   s   d|kr|  |d  d S )Nkid)_validate_kid)r    rH   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    re   r#   r#   r$   rf      s    
zPyJWS._validate_kid)NN)r2   NN)rN   TNN)rN   N)__name__
__module____qualname__r<   r%   staticmethodr   r-   r0   r1   rM   rY   rZ   rT   rU   r=   rf   r#   r#   r#   r$   r      s.   

	   
7    
(   
r   )&r`   r?   rQ   typingr   r   r   r   r   ImportErrorr!   r   r	   r
   r   compatr   r   r   r   
exceptionsr   r   r   r   utilsr   r   r   r   objectr   Z_jws_global_objrM   rY   r-   r0   rZ   r#   r#   r#   r$   <module>   s$     Y