3
e                 @   s   d dl Z 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 ddlmZ G dd deZG dd deZdS )    N)datetime)timezone)Decimal)Real   )_CompactJSON)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 fdd	Zd f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  ZS )JSONWebSignatureSerializerzThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.

    .. deprecated:: 2.0
        Will be removed in ItsDangerous 2.1. Use a dedicated library
        such as authlib.
    )ZHS256ZHS384HS512noner   Nc                sL   t jdtdd t j||||||d |d kr6| j}|| _| j|| _d S )NzsJWS support is deprecated and will be removed in ItsDangerous 2.1. Use a dedicated JWS/JWT library such as authlib.   )
stacklevel)salt
serializerserializer_kwargssignersigner_kwargs)	warningswarnDeprecationWarningsuper__init__default_algorithmalgorithm_namemake_algorithm	algorithm)self
secret_keyr   r   r   r   r   r#   )	__class__ 8/tmp/pip-build-3irwxpxt/itsdangerous/itsdangerous/jws.pyr!   ,   s    
z#JSONWebSignatureSerializer.__init__Fc       
   .      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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*   r0   L   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-   objr5   r6   r)   r)   r*   dump_payloadv   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$      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   Zsecret_keys)r&   r   r%   r@   r)   r)   r*   make_signer   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 )zLike :meth:`.Serializer.dumps` but creates a JSON Web
        Signature. It also allows for specifying additional fields to be
        included in the JWS header.
        )rE   rA   r%   signr:   )r&   r9   r   rD   r-   r   r)   r)   r*   r8      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)r4   rB   zAlgorithm mismatch)r-   r3   )r0   rA   r%   Zunsignr
   getr#   r   )r&   sr   r4   r3   r-   r)   r)   r*   loads   s    z JSONWebSignatureSerializer.loadsc             C   s   d|i}| j ||||S )Nr4   )Z_loads_unsafe_impl)r&   rH   r   r4   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   r;   r"   r   Zdefault_serializerr!   r0   r:   r$   rA   rE   r8   rI   rK   __classcell__r)   r)   )r(   r*   r      s*   
     *	

	
r   c                   sP   e Zd ZdZdZd fdd	Z fddZd fd	d
	Zdd Zdd Z	  Z
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                s(   t  j|f| |d kr| j}|| _d S )N)r    r!   DEFAULT_EXPIRES_IN
expires_in)r&   r'   rW   rJ   )r(   r)   r*   r!      s    z(TimedJSONWebSignatureSerializer.__init__c                s2   t  j|}| j }|| j }||d< ||d< |S )Niatexp)r    rE   nowrW   )r&   rD   r-   rX   rY   )r(   r)   r*   rE      s    
z+TimedJSONWebSignatureSerializer.make_headerFc                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 rtd|| j|d	|r||fS |S )
NT)r4   rY   zMissing expiry date)r3   zExpiry date is not an IntDater   zSignature expired)r3   Zdate_signed)	r    rI   r   r   int
ValueErrorrZ   r   get_issue_date)r&   rH   r   r4   r3   r-   Zint_date_error)r(   r)   r*   rI      s$    
z%TimedJSONWebSignatureSerializer.loadsc             C   s0   |j d}t|ttfr,tjt|tjdS dS )aR  If the header contains the ``iat`` field, return the date the
        signature was issued, as a timezone-aware
        :class:`datetime.datetime` in UTC.

        .. versionchanged:: 2.0
            The timestamp is returned as a timezone-aware ``datetime``
            in UTC rather than a naive ``datetime`` assumed to be UTC.
        rX   )tzN)	rG   r1   r   r   r   fromtimestampr[   r   utc)r&   r-   rvr)   r)   r*   r]      s    	
z.TimedJSONWebSignatureSerializer.get_issue_datec             C   s   t tj S )N)r[   time)r&   r)   r)   r*   rZ     s    z#TimedJSONWebSignatureSerializer.now)N)NF)rL   rM   rN   rO   rV   r!   rE   rI   r]   rZ   rT   r)   r)   )r(   r*   rU      s   
rU   )rP   rb   r   r   r   decimalr   Znumbersr   _jsonr   encodingr   r	   r
   excr   r   r   r   r   r   r   r   r   r   r   rU   r)   r)   r)   r*   <module>   s*    $