3
¥YðiÉ  ã               @   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 )ÚJSONWebSignatureSerializerzéThis 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-8om4l6ph/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ƒsút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 )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.
        )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 r˜t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*    $