U
    'Q^.                     @   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}|| _| || _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!   :/tmp/pip-install-bd4o36v9/itsdangerous/itsdangerous/jws.pyr   &   s    
	z#JSONWebSignatureSerializer.__init__Fc           
   
   C   s  t |}d|krtd|dd\}}zt|}W n. tk
rb } ztd|dW 5 d }~X Y nX zt|}W n. tk
r } ztd|dW 5 d }~X Y nX ztj| |td}	W n. t	k
r } ztd|dW 5 d }~X Y nX t
|	tst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(   >   s>    
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.   z| j | W 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|  ni }| j|d< |S )Nalg)copyr   )r    header_fieldsr%   r!   r!   r"   make_header|   s    
z&JSONWebSignatureSerializer.make_headerc                 C   s*   |  |}| || j}|| ||S )zLike :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t|dd\}}|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}|  ||||S )Nr,   )Z_loads_unsafe_impl)r    rA   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   rB   rD   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   rP   rC   r!   r!   r"   r      s    z(TimedJSONWebSignatureSerializer.__init__c                 C   s2   t | |}|  }|| j }||d< ||d< |S )Niatexp)r   r=   nowrP   )r    r<   r%   rQ   rR   r!   r!   r"   r=      s    
z+TimedJSONWebSignatureSerializer.make_headerFc                 C   s   t j| ||dd\}}d|kr*td|dtd|d}zt|d |d< W n tk
rb   |Y nX |d dk rt||d |  k rtd|| |d	|r||fS |S )
NTr?   rR   zMissing expiry date)r+   zExpiry date is not an IntDater   zSignature expired)r+   Zdate_signed)	r   rB   r   r   int
ValueErrorrS   r   get_issue_date)r    rA   r   r,   r+   r%   Zint_date_errorr!   r!   r"   rB      s0       

z%TimedJSONWebSignatureSerializer.loadsc                 C   s&   | d}t|tr"tt|S d S )NrQ   )r@   r)   r   r   utcfromtimestamprT   )r    r%   rvr!   r!   r"   rV      s    

z.TimedJSONWebSignatureSerializer.get_issue_datec                 C   s   t t S rN   )rT   time)r    r!   r!   r"   rS      s    z#TimedJSONWebSignatureSerializer.now)N)NF)
rE   rF   rG   rH   rO   r   r=   rB   rV   rS   r!   r!   r!   r"   rM      s   

rM   )rI   rY   r   _compatr   _jsonr   r   encodingr   r   r	   excr
   r   r   r   r   r   r   r   r   r   r   rM   r!   r!   r!   r"   <module>   s&    	