<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    _                 @   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"e
eeee eeej  edddZd#eeee eeeef dddZd$eeee ee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   sl   t  | _|d k	rt|nt| j| _x(t| j D ]}|| jkr4| j|= q4W |d krZi }|  || _d S )N)r
   _algorithmsset_valid_algslistkeys_get_default_optionsoptions)self
algorithmsr   key r   </opt/alt/python37/lib/python3.7/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_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 krd}|| j kr| j|d}|r>| | || tj|d|d }|t| |t| d	|}	y$| j
| }
|
|}|
|	|}W n6 tk
r   ts|tkrtd| ntdY nX |t| d	|}|dS )	NZnone)typalg),:)Z
separatorscls   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?zAlgorithm not supportedzutf-8)r   
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr   prepare_keyZsignr)   r   r   NotImplementedErrordecode)r   r.   r   r/   r0   r1   ZsegmentsheaderZjson_headersigning_inputr'   	signatureZencoded_stringr   r   r   r>   L   s4    







zPyJWS.encode )jwtr   r   r   r2   c             K   sb   |d kri }| j |}|d }|r.|s.td| |\}}	}
}|rV| |	|
||| ||
|dS )Nr!   z\It is required that you pass in a value for the "algorithms" argument when calling decode().)r.   rD   rF   )r   r   _load_verify_signature)r   rH   r   r   r   kwargsZmerged_optionsr!   r.   rE   rD   rF   r   r   r   decode_complete   s    
zPyJWS.decode_completec             K   s   | j ||||f|}|d S )Nr.   )rL   )r   rH   r   r   r   rK   Zdecodedr   r   r   rC      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
           )rI   r:   )r   rH   r0   r   r   r   get_unverified_header   s    
zPyJWS.get_unverified_headerc          
   C   s  t |tr|d}t |ts,tdt y$|dd\}}|dd\}}W n, tk
r| } ztd|W d d }~X Y nX yt|}W n2 t	t
jfk
r } ztd|W d d }~X Y nX yt|}W n0 tk
r }	 ztd|	 |	W d d }	~	X Y nX t |tstdyt|}
W n4 t	t
jfk
rR } ztd	|W d d }~X Y nX yt|}W n4 t	t
jfk
r } ztd
|W d d }~X Y nX |
|||fS )Nzutf-8z$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   rH   rE   Zcrypto_segmentZheader_segmentZpayload_segmenterrZheader_datarD   er.   rF   r   r   r   rI      s8    


 zPyJWS._loadc             C   sr   | d}|d k	r"||kr"tdy.| j| }||}||||sNtdW n tk
rl   tdY nX d S )Nr4   z&The specified alg value is not allowedzSignature verification failedzAlgorithm not supported)getr   r   rA   Zverifyr   r)   )r   rE   rD   rF   r   r   r4   r'   r   r   r   rJ      s    	


zPyJWS._verify_signaturec             C   s   d|kr|  |d  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#   rO   r   )r   rY   r   r   r   rZ      s    
zPyJWS._validate_kid)NN)r-   NN)rG   NN)rG   NN)rG   N)__name__
__module____qualname__r9   r    staticmethodr   r(   r+   r,   rP   rO   r   r   r   r<   ZJSONEncoderr>   r   r   rL   rC   rN   rI   rJ   r:   rZ   r   r   r   r   r      s0   

  0    + 
r   )rS   r<   collections.abcr   typingr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   r   r   r   Zutilsr   r   r   Z_jws_global_objr>   rL   rC   r(   r+   rN   r   r   r   r   <module>   s    f