3
ãdeâ#  ã               @   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ej  eedœdd„Zd%eeeee  ee ee
 eeef dœdd„Zd&ee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jƒ ƒD ]}|| jkr4| j|= q4W |d krZi }| jƒ |–| _d S )N)r
   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysÚ_get_default_optionsÚoptions)ÚselfÚ
algorithmsr   Úkey© r   úB/var/www/agendate/envp3/lib/python3.6/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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_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ÚHS256F)Úpayloadr   Ú	algorithmÚheadersÚjson_encoderÚis_payload_detachedÚreturnc             C   s~  g }|d krd}|r@|j dƒ}|r*|d }|j dƒ}	|	dkr@d}| j|dœ}
|rd| j|ƒ |
j|ƒ |
d sr|
d= |r€d|
d< nd|
krŽ|
d= tj|
d|d
�jƒ }|jt|ƒƒ |rº|}nt|ƒ}|j|ƒ dj	|ƒ}y$| j
| }|j|ƒ}|j||ƒ}W nR tk
�rL } z4t �r2|tk�r2td|› d�ƒ|‚tdƒ|‚W Y d d }~X nX |jt|ƒƒ |�rjd|d< dj	|ƒ}|jdƒS )NÚnoneÚalgÚb64FT)Útypr5   r7   ú,ú:)Ú
separatorsÚclsó   .zAlgorithm 'z9' could not be found. Do you have cryptography installed?zAlgorithm not supportedó    r   zutf-8)r8   r9   )ÚgetÚ
header_typÚ_validate_headersÚupdateÚjsonÚdumpsÚencodeÚappendr   Újoinr   Úprepare_keyÚsignr)   r   r   ÚNotImplementedErrorÚdecode)r   r.   r   r/   r0   r1   r2   ÚsegmentsZheaders_algZheaders_b64ÚheaderZjson_headerZmsg_payloadÚsigning_inputr'   Ú	signatureÚeÚencoded_stringr   r   r   rD   L   sV    	









zPyJWS.encodeÚ )Újwtr   r   r   Údetached_payloadr3   c             K   s¢   |d kri }| j |–}|d }|r0| r0tdƒ‚| j|ƒ\}	}
}}|jddƒdkr€|d krbtdƒ‚|}	dj|
jddƒd	 |	gƒ}
|r–| j|
||||ƒ |	||d
œS )Nr!   z\It is required that you pass in a value for the "algorithms" argument when calling decode().r6   TFzƒIt is required that you pass in a value for the "detached_payload" argument to decode a message having the b64 header set to false.r<   r   r   )r.   rL   rN   )r   r   Ú_loadr>   rF   ÚrsplitÚ_verify_signature)r   rR   r   r   r   rS   ÚkwargsZmerged_optionsr!   r.   rM   rL   rN   r   r   r   Údecode_complete˜   s&    	

zPyJWS.decode_complete)rR   r   r   r   r3   c             K   s   | j ||||f|Ž}|d S )Nr.   )rX   )r   rR   r   r   r   rW   Údecodedr   r   r   rJ   ¾   s    zPyJWS.decodec             C   s   | j |ƒd }| j|ƒ |S )zÎReturns 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
        é   )rT   r@   )r   rR   r0   r   r   r   Úget_unverified_headerÉ   s    
zPyJWS.get_unverified_headerc          J   C   s¦  t |tƒr|jdƒ}t |tƒs,tdt› �ƒ‚y$|jddƒ\}}|jddƒ\}}W n, tk
r| } ztdƒ|‚W Y d d }~X nX yt|ƒ}W n2 t	t
jfk
r¼ } ztdƒ|‚W Y d d }~X nX ytj|ƒ}W n4 tk
�r  }	 ztd|	› �ƒ|	‚W Y d d }	~	X nX t |tƒ�stdƒ‚yt|ƒ}
W n4 t	t
jfk
�rV } ztd	ƒ|‚W Y d d }~X nX yt|ƒ}W n4 t	t
jfk
�r˜ } ztd
ƒ|‚W Y d d }~X nX |
|||fS )Nzutf-8z$Invalid token type. Token must be a r<   r   zNot enough segmentszInvalid header paddingzInvalid header string: z,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r#   ÚstrrD   Úbytesr   rU   Úsplitr"   r   r$   ÚbinasciiÚErrorrB   Úloadsr   )r   rR   rM   Zcrypto_segmentZheader_segmentZpayload_segmentÚerrZheader_datarL   rO   r.   rN   r   r   r   rT   Ô   s8    


"zPyJWS._loadc       	      C   s‚   |j dƒ}|d k	r"||kr"tdƒ‚y.| j| }|j|ƒ}|j|||ƒsNtdƒ‚W n, tk
r| } ztdƒ|‚W Y d d }~X nX d S )Nr5   z&The specified alg value is not allowedzSignature verification failedzAlgorithm not supported)r>   r   r   rG   Úverifyr   r)   )	r   rM   rL   rN   r   r   r5   r'   rO   r   r   r   rV   ú   s    	


zPyJWS._verify_signaturec             C   s   d|kr| j |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#   r\   r   )r   rd   r   r   r   re     s    
zPyJWS._validate_kid)NN)r-   NNF)rQ   NNN)rQ   NN)rQ   N)Ú__name__Ú
__module__Ú__qualname__r?   r    Ústaticmethodr   r(   r+   r,   r]   r\   r   r   r   rB   ÚJSONEncoderÚboolrD   r   r   rX   rJ   r[   rT   rV   r@   re   r   r   r   r   r      s4   

    G   !  + 
r   )r_   rB   Úcollections.abcr   Útypingr   r   r   r   r   r   r	   r
   r   r   Ú
exceptionsr   r   r   r   Úutilsr   r   r   Z_jws_global_objrD   rX   rJ   r(   r+   r[   r   r   r   r   Ú<module>   s      