U
    Ha                     @   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}|| _| || _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__ 4/tmp/pip-unpacked-wheel-4vz609l6/itsdangerous/jws.pyr!   ,   s"    
	z#JSONWebSignatureSerializer.__init__Fc           
   
      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+   r1   L   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.   objr6   r7   r*   r*   r+   dump_payloadv   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$      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%   rA   r*   r*   r+   make_signer   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.
        )rF   rB   r%   signr;   )r&   r:   r   rE   r.   r   r*   r*   r+   r9      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r5   rC   zAlgorithm mismatch)r.   r4   )r1   rB   r%   Zunsignr
   getr#   r   )r&   sr   r5   r4   r.   r*   r*   r+   loads   s    
z JSONWebSignatureSerializer.loadsc                 C   s   d|i}|  ||||S )Nr5   )Z_loads_unsafe_impl)r&   rJ   r   r5   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!   r1   r;   r$   rB   rF   r9   rK   rM   __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'   rZ   rL   r(   r*   r+   r!      s    z(TimedJSONWebSignatureSerializer.__init__c                    s2   t  |}|  }|| j }||d< ||d< |S )Niatexp)r    rF   nowrZ   )r&   rE   r.   r[   r\   r(   r*   r+   rF      s    
z+TimedJSONWebSignatureSerializer.make_headerFc                    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 )
NTrH   r\   zMissing expiry date)r4   zExpiry date is not an IntDater   zSignature expired)r4   Zdate_signed)	r    rK   r   r   int
ValueErrorr]   r   get_issue_date)r&   rJ   r   r5   r4   r.   Zint_date_errorr(   r*   r+   rK      s&    
z%TimedJSONWebSignatureSerializer.loadsc                 C   s0   | 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.
        r[   )tzN)	rI   r2   r   r   r   fromtimestampr^   r   utc)r&   r.   rvr*   r*   r+   r`      s    	
z.TimedJSONWebSignatureSerializer.get_issue_datec                 C   s   t t S rX   )r^   time)r&   r*   r*   r+   r]     s    z#TimedJSONWebSignatureSerializer.now)N)NF)rN   rO   rP   rQ   rY   r!   rF   rK   r`   r]   rV   r*   r*   r(   r+   rW      s   rW   )rR   re   r   r   r   decimalr   Znumbersr   _jsonr   encodingr   r	   r
   excr   r   r   r   r   r   r   r   r   r   r   rW   r*   r*   r*   r+   <module>   s*    $