
¿«‘_.  ã               @   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)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<   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$   ˆ