3
[ð].  ã               @   sè   d dl Z d dlZd dlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ G dd„ deƒZG dd„ deƒZdS )é    N)Údatetimeé   )Únumber_types)Ú_CompactJSON)Újson)Úbase64_decode)Úbase64_encode)Ú
want_bytes)ÚBadData)Ú	BadHeader)Ú
BadPayload)ÚBadSignature)ÚSignatureExpired)Ú
Serializer)ÚHMACAlgorithm)ÚNoneAlgorithmc               @   sŽ   e Zd ZdZeejƒeejƒeejƒe	ƒ dœZ
dZeZddd„Zddd	„Zd
d„ Zdd„ Zddd„Zdd„ Zddd„Zddd„Zddd„ZdS )ÚJSONWebSignatureSerializerzrThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.
    )ZHS256ZHS384ÚHS512Únoner   Nc          	   C   s<   t j| ||||||d� |d kr&| j}|| _| j|ƒ| _d S )N)Ú
secret_keyÚsaltÚ
serializerÚserializer_kwargsÚsignerÚsigner_kwargs)r   Ú__init__Údefault_algorithmÚalgorithm_nameÚmake_algorithmÚ	algorithm)Úselfr   r   r   r   r   r   r   © r!   ú8/tmp/pip-build-w1as9q70/itsdangerous/itsdangerous/jws.pyr   &   s    
z#JSONWebSignatureSerializer.__init__Fc       
   /   C   s  t |ƒ}d|krtdƒ‚|jddƒ\}}yt|ƒ}W n. tk
rb } ztd|d�‚W Y d d }~X nX yt|ƒ}W n. tk
rž } ztd|d�‚W Y d d }~X nX ytj| |td�}	W n. t	k
râ } ztd|d�‚W Y d d }~X nX t
|	tƒsútd	|	d
�‚tj| ||d�}|�r||	fS |S )Nó   .zNo "." found in valuer   z:Could not base64 decode the header because of an exception)Úoriginal_errorz;Could not base64 decode the payload because of an exception)r   z5Could not unserialize header because it was malformedz#Header payload is not a JSON object)Úheader)r	   r   Úsplitr   Ú	Exceptionr   r   Úload_payloadr   r
   Ú
isinstanceÚdict)
r    Úpayloadr   Úreturn_headerÚbase64d_headerÚbase64d_payloadZjson_headerÚeZjson_payloadr%   r!   r!   r"   r(   >   s8    
z'JSONWebSignatureSerializer.load_payloadc             C   s8   t | jj|f| jŽƒ}t | jj|f| jŽƒ}|d | S )Nr#   )r   r   Údumpsr   )r    r%   Úobjr-   r.   r!   r!   r"   Údump_payload_   s
    z'JSONWebSignatureSerializer.dump_payloadc             C   s,   y
| j | S  tk
r&   tdƒ‚Y nX d S )NzAlgorithm not supported)Újws_algorithmsÚKeyErrorÚNotImplementedError)r    r   r!   r!   r"   r   h   s    
z)JSONWebSignatureSerializer.make_algorithmc             C   sB   |d kr| j }|d krdnd }|d kr,| j}| j| j|d||d�S )Nr   Ú.)r   ÚsepÚkey_derivationr   )r   r   r   r   )r    r   r   r8   r!   r!   r"   Úmake_signern   s    z&JSONWebSignatureSerializer.make_signerc             C   s   |r|j ƒ ni }| j|d< |S )NÚalg)Úcopyr   )r    Úheader_fieldsr%   r!   r!   r"   Úmake_header|   s    
z&JSONWebSignatureSerializer.make_headerc             C   s*   | j |ƒ}| j|| jƒ}|j| j||ƒƒS )z«Like :meth:`.Serializer.dumps` but creates a JSON Web
        Signature. It also allows for specifying additional fields to be
        included in the JWS header.
        )r=   r9   r   Úsignr2   )r    r1   r   r<   r%   r   r!   r!   r"   r0   �   s    
z JSONWebSignatureSerializer.dumpsc             C   sT   | j | j|| jƒjt|ƒƒdd�\}}|jdƒ| jkrDtd||d�‚|rP||fS |S )z{Reverse of :meth:`dumps`. If requested via ``return_header``
        it will return a tuple of payload and header.
        T)r,   r:   zAlgorithm mismatch)r%   r+   )r(   r9   r   Zunsignr	   Úgetr   r   )r    Úsr   r,   r+   r%   r!   r!   r"   ÚloadsŠ   s    z JSONWebSignatureSerializer.loadsc             C   s   d|i}| j ||||ƒS )Nr,   )Z_loads_unsafe_impl)r    r@   r   r,   Úkwargsr!   r!   r"   Úloads_unsafe˜   s    z'JSONWebSignatureSerializer.loads_unsafe)NNNNNN)NF)NN)NN)NF)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚhashlibÚsha256Úsha384Úsha512r   r3   r   r   Zdefault_serializerr   r(   r2   r   r9   r=   r0   rA   rC   r!   r!   r!   r"   r      s*   
     

!	

	
r   c               @   s@   e Zd ZdZdZddd„Zdd„ Zdd	d
„Zdd„ Zdd„ Z	dS )ÚTimedJSONWebSignatureSerializeraË  Works like the regular :class:`JSONWebSignatureSerializer` but
    also records the time of the signing and can be used to expire
    signatures.

    JWS currently does not specify this behavior but it mentions a
    possible extension like this in the spec. Expiry date is encoded
    into the header similar to what's specified in `draft-ietf-oauth
    -json-web-token <http://self-issued.info/docs/draft-ietf-oauth-json
    -web-token.html#expDef>`_.
    i  Nc             K   s(   t j| |f|Ž |d kr| j}|| _d S )N)r   r   ÚDEFAULT_EXPIRES_INÚ
expires_in)r    r   rN   rB   r!   r!   r"   r   «   s    z(TimedJSONWebSignatureSerializer.__init__c             C   s2   t j| |ƒ}| jƒ }|| j }||d< ||d< |S )NÚiatÚexp)r   r=   ÚnowrN   )r    r<   r%   rO   rP   r!   r!   r"   r=   ±   s    
z+TimedJSONWebSignatureSerializer.make_headerFc             C   s¨   t j| ||dd�\}}d|kr*td|d�‚td|d�}yt|d ƒ|d< W n tk
rb   |‚Y nX |d dk rt|‚|d | jƒ k r˜td|| j|ƒd	�‚|r¤||fS |S )
NT)r,   rP   zMissing expiry date)r+   zExpiry date is not an IntDater   zSignature expired)r+   Zdate_signed)	r   rA   r   r   ÚintÚ
ValueErrorrQ   r   Úget_issue_date)r    r@   r   r,   r+   r%   Zint_date_errorr!   r!   r"   rA   ¹   s&    
z%TimedJSONWebSignatureSerializer.loadsc             C   s&   |j dƒ}t|tƒr"tjt|ƒƒS d S )NrO   )r?   r)   r   r   ÚutcfromtimestamprR   )r    r%   Úrvr!   r!   r"   rT   Ô   s    

z.TimedJSONWebSignatureSerializer.get_issue_datec             C   s   t tjƒ ƒS )N)rR   Útime)r    r!   r!   r"   rQ   Ù   s    z#TimedJSONWebSignatureSerializer.now)N)NF)
rD   rE   rF   rG   rM   r   r=   rA   rT   rQ   r!   r!   r!   r"   rL   �   s   


rL   )rH   rW   r   Ú_compatr   Ú_jsonr   r   Úencodingr   r   r	   Úexcr
   r   r   r   r   r   r   r   r   r   r   rL   r!   r!   r!   r"   Ú<module>   s&    	