
_.                 @   s8  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 Gd d   d e  Z Gd 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 d e e j  d e e j  d e e j  d e	   i Z
 d Z e Z d d d d d d d d  Z d d	 d
 d  Z d d   Z d d   Z d d d d  Z d d   Z d d d d  Z d d	 d d  Z d d	 d d  Z d S)JSONWebSignatureSerializerzrThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.
    ZHS256ZHS384ZHS512noneNc             C   se   t  j |  d | d | d | d | d | d | | d  k rF |  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-5gj8f0j9/itsdangerous/itsdangerous/jws.pyr   &   s    
		z#JSONWebSignatureSerializer.__init__Fc       
   /   C   ss  t  |  } d | k r$ t d   | j d d  \ } } y t |  } Wn7 t k
 r } z t d d |  WYd  d  } ~ Xn Xy t |  } Wn7 t k
 r } z t d d |  WYd  d  } ~ Xn Xy t j |  | d t }	 Wn7 t	 k
 r%} z t d d |  WYd  d  } ~ Xn Xt
 |	 t  sGt d	 d
 |	  t j |  | d | } | ro| |	 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 exceptionr   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   sH   t  |  j j | |  j   } t  |  j j | |  j   } | d | S)Nr"   )r   r   dumpsr   )r   r$   objr,   r-   r    r    r!   dump_payload_   s
    z'JSONWebSignatureSerializer.dump_payloadc             C   s4   y |  j  | SWn t k
 r/ t d   Yn Xd  S)NzAlgorithm not supported)jws_algorithmsKeyErrorNotImplementedError)r   r   r    r    r!   r   h   s    z)JSONWebSignatureSerializer.make_algorithmc          
   C   sj   | d  k r |  j  } | d  k r' d n d  } | d  k rB |  j } |  j |  j d | d d d | d | S)Nr   r   sep.key_derivationr   )r   r   r   r   )r   r   r   r7   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)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<   r8   r   signr1   )r   r0   r   r;   r$   r   r    r    r!   r/      s    z JSONWebSignatureSerializer.dumpsc             C   s}   |  j  |  j | |  j  j t |   d d \ } } | j d  |  j k ri t d d | d |  | ry | | f S| S)z{Reverse of :meth:`dumps`. If requested via ``return_header``
        it will return a tuple of payload and header.
        r+   Tr9   zAlgorithm mismatchr$   r*   )r'   r8   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)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   r2   r   r   Zdefault_serializerr   r'   r1   r   r8   r<   r/   r@   rB   r    r    r    r!   r      s*   !		r   c               @   sa   e  Z d  Z d Z d Z d d d  Z d d   Z d 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   s5   t  j |  | |  | d  k r( |  j } | |  _ d  S)N)r   r   DEFAULT_EXPIRES_IN
expires_in)r   r   rM   rA   r    r    r!   r      s    	z(TimedJSONWebSignatureSerializer.__init__c             C   sC   t  j |  |  } |  j   } | |  j } | | d <| | d <| S)Niatexp)r   r<   nowrM   )r   r;   r$   rN   rO   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 <Wn t k
 r |  Yn X| d d k  r |  | d |  j   k  r t d d | d	 |  j |   | r | | f S| S)
Nr+   TrO   zMissing expiry dater*   zExpiry date is not an IntDater   zSignature expiredZdate_signed)	r   r@   r   r   int
ValueErrorrP   r   get_issue_date)r   r?   r   r+   r*   r$   Zint_date_errorr    r    r!   r@      s&    
z%TimedJSONWebSignatureSerializer.loadsc             C   s5   | j  d  } t | t  r1 t j t |   Sd  S)NrN   )r>   r(   r   r   utcfromtimestamprQ   )r   r$   rvr    r    r!   rS      s    z.TimedJSONWebSignatureSerializer.get_issue_datec             C   s   t  t j    S)N)rQ   time)r   r    r    r!   rP      s    z#TimedJSONWebSignatureSerializer.now)
rC   rD   rE   rF   rL   r   r<   r@   rS   rP   r    r    r    r!   rK      s   
rK   )rG   rV   r   _compatr   _jsonr   r   encodingr   r   r	   excr
   r   r   r   r   r   r   r   r   r   r   rK   r    r    r    r!   <module>   s$   