
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
kZ                 @   s   d dl Z d dlZd dlZd dlmZ ddlmZmZmZm	Z	 ddl
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)Mapping   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)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   sj   t  | _|d k	rt|nt| j| _x(t| jj D ]}|| jkr4| j|= q4W |sVi }t| j || _d S )N)	r   _algorithmsset_valid_algslistkeysr   _get_default_optionsoptions)self
algorithmsr   key r   /usr/lib/python3.6/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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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_algorithm6   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_algorithmsB   s    zPyJWS.get_algorithmsHS256c             C   s   g }|d krd}|| j kr| j|d}|r>| j| |j| ttj|d	|d}|jt| |jt| dj	|}	y$| j
| }
|
j|}|
j|	|}W n8 tk
r   t r|tkrtd| ntdY nX |jt| dj	|S )
NZnone)typalg,:)Z
separatorscls   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?zAlgorithm not supported)r0   r1   )r   
header_typ_validate_headersupdater   jsondumpsappendr   joinr   prepare_keyZsignr)   r   r   NotImplementedError)r   payloadr   	algorithmheadersZjson_encoderZsegmentsheaderZjson_headersigning_inputr'   	signaturer   r   r   encodeH   s8    







zPyJWS.encode Tc             K   sn   t | j|}|d }|r*| r*tjd	t | j|\}	}
}}|sRtjdtdd n|rj| j|	|
|||| |	S )
Nr!   z.It is strongly recommended that you pass in a z;value for the "algorithms" argument when calling decode(). z4This argument will be mandatory in a future version.zSThe verify parameter is deprecated. Please use verify_signature in options instead.   )
stacklevelziIt is strongly recommended that you pass in a value for the "algorithms" argument when calling decode(). 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.)r   r   warningswarnDeprecationWarning_load_verify_signature)r   Zjwsr   verifyr   r   kwargsZmerged_optionsr!   r=   rA   r@   rB   r   r   r   decodex   s    
 zPyJWS.decodec             C   s   | j |d }| j| |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
        rE   )rJ   r5   )r   jwtr?   r   r   r   get_unverified_header   s    
zPyJWS.get_unverified_headerc          2   C   sh  t |tr|jd}tt|ts0tdjty$|jdd\}}|j	dd\}}W n t
k
rp   tdY nX yt|}W n" ttjfk
r   tdY nX ytj|jd}W n. t
k
r } ztd| W Y d d }~X nX t |tstdyt|}	W n$ ttjfk
r(   td	Y nX y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}r3   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
   rC   
issubclasstyper   r   formatrsplitsplitr"   r   r$   binasciiErrorr7   loadsrN   r   )r   rO   rA   Zcrypto_segmentZheader_segmentZpayload_segmentZheader_datar@   er=   rB   r   r   r   rJ      s:    


zPyJWS._loadc       	      C   sr   |j d}|d k	r"||kr"tdy.| j| }|j|}|j|||sNtdW n tk
rl   tdY nX d S )Nr/   z&The specified alg value is not allowedzSignature verification failedzAlgorithm not supported)getr   r   r;   rL   r   r)   )	r   r=   rA   r@   rB   r   r   r/   r'   r   r   r   rK      s    


zPyJWS._verify_signaturec             C   s   d|kr| j |d  d S )Nkid)_validate_kid)r   r?   r   r   r   r5      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   r[   r   r   r   r\      s    
zPyJWS._validate_kid)NN)r-   NN)rD   TNN)rD   N)__name__
__module____qualname__r4   r    staticmethodr   r(   r+   r,   rC   rN   rP   rJ   rK   r5   r\   r   r   r   r   r      s   
 
/
(
r   ) rV   r7   rG   collectionsr   r   r   r   r   r   compatr   r	   r
   
exceptionsr   r   r   r   Zutilsr   r   r   r   objectr   Z_jws_global_objrC   rN   r(   r+   rP   r   r   r   r   <module>   s    O