B
    Ǉb                 @   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 ejeef Zeje Zeje Zejrd dlZG dd deZG dd deZdS )    N)datetime)timezone   )base64_decode)base64_encode)bytes_to_int)int_to_bytes)
want_bytes)BadSignature)BadTimeSignature)SignatureExpired)
Serializer)Signerc                   s   e Zd ZdZedddZeedddZee	dd	d
Z
ejdeede	dddZejdeedeje	ef dddZdeeeejeje	ef e	f d fddZdeeedddZ  ZS )TimestampSignerzWorks like the regular :class:`.Signer` but also records the time
    of the signing and can be used to expire signatures. The
    :meth:`unsign` method can raise :exc:`.SignatureExpired` if the
    unsigning failed because the signature is expired.
    )returnc             C   s   t t S )zTReturns the current timestamp. The function must return an
        integer.
        )inttime)self r   f/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/itsdangerous/timed.pyget_timestamp!   s    zTimestampSigner.get_timestamp)tsr   c             C   s   t j|tjdS )a   Convert the timestamp from :meth:`get_timestamp` into an
        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.
        )tz)r   fromtimestampr   utc)r   r   r   r   r   timestamp_to_datetime'   s    z%TimestampSigner.timestamp_to_datetime)valuer   c             C   s@   t |}tt|  }t | j}|| | }|| | | S )z:Signs the given string and also attaches time information.)r	   r   r   r   sepZget_signature)r   r   	timestampr   r   r   r   sign1   s
    
zTimestampSigner.signNFz_te.Literal[False])signed_valuemax_agereturn_timestampr   c             C   s   d S )Nr   )r   r    r!   r"   r   r   r   unsign<   s    zTimestampSigner.unsignTz_te.Literal[True]c             C   s   d S )Nr   )r   r    r!   r"   r   r   r   r#   E   s    c          
      s  yt  |}d}W n0 tk
rD } z|}|jp2d}W dd}~X Y nX t| j}||krl|r`|td|d||d\}}	d}
d}ytt	|	}
W n t
k
r   Y nX |dk	r|
dk	ry| |
}W n8 tttfk
r } ztd|d|W dd}~X Y nX tt|||d|
dkr.td|d|dk	r|  |
 }||krptd| d	| d
|| |
d|dk rtd| d|| |
d|r|| |
fS |S )a  Works like the regular :meth:`.Signer.unsign` but can also
        validate the time. See the base docstring of the class for
        the general behavior. If ``return_timestamp`` is ``True`` the
        timestamp of the signature will be returned as an aware
        :class:`datetime.datetime` object 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.
        N    ztimestamp missing)payloadr   zMalformed timestamp)r%   Zdate_signedzSignature age z > z secondsr   z < 0 seconds)superr#   r
   r%   r	   r   r   rsplitr   r   	Exceptionr   
ValueErrorOSErrorOverflowErrorstrr   r   )r   r    r!   r"   resultZ	sig_errorer   r   Zts_bytesZts_intZts_dtexcZage)	__class__r   r   r#   N   sX    







)r    r!   r   c             C   s,   y| j ||d dS  tk
r&   dS X dS )zeOnly validates the given signed value. Returns ``True`` if
        the signature exists and is valid.)r!   TFN)r#   r
   )r   r    r!   r   r   r   validate   s
    zTimestampSigner.validate)NF)NT)NF)N)__name__
__module____qualname____doc__r   r   r   r   _t_str_bytesbytesr   typingoverload
_t_opt_intr#   _tTupleboolUnionr1   __classcell__r   r   )r0   r   r      s    
   &Sr   c                   s   e Zd ZU dZeZeje ed< de	ej
e d fddZdeeee	ejdd	d
Zdeee	ejeejf dddZ  ZS )TimedSerializerzOUses :class:`TimestampSigner` instead of the default
    :class:`.Signer`.
    default_signerN)saltr   c                s   t dt |S )Nz_t.Iterator[TimestampSigner])r;   castr&   iter_unsigners)r   rB   )r0   r   r   rD      s    zTimedSerializer.iter_unsignersF)sr!   r"   rB   r   c             C   s   t |}d}x|| |D ]n}y.|j||dd\}}| |}	|rH|	|fS |	S  tk
r`    Y q tk
r }
 z|
}W dd}
~
X Y qX qW tt|dS )a  Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the
        signature validation fails. If a ``max_age`` is provided it will
        ensure the signature is not older than that time in seconds. In
        case the signature is outdated, :exc:`.SignatureExpired` is
        raised. All arguments are forwarded to the signer's
        :meth:`~TimestampSigner.unsign` method.
        NT)r!   r"   )r	   rD   r#   Zload_payloadr   r
   r;   rC   )r   rE   r!   r"   rB   Zlast_exceptionsignerZbase64dr   r%   errr   r   r   loads   s    
zTimedSerializer.loads)rE   r!   rB   r   c             C   s   | j ||d|idS )Nr!   )Zload_kwargs)Z_loads_unsafe_impl)r   rE   r!   rB   r   r   r   loads_unsafe   s    zTimedSerializer.loads_unsafe)N)NFN)NN)r2   r3   r4   r5   r   rA   r;   Type__annotations___t_opt_str_bytesIteratorrD   r6   r:   r=   AnyrH   r<   rI   r?   r   r   )r0   r   r@      s   
	  
" r@   ) r   r8   r;   r   r   encodingr   r   r   r   r	   r/   r
   r   r   
serializerr   rF   r   r>   r,   r7   r6   OptionalrL   r   r:   TYPE_CHECKINGtyping_extensionsZ_ter   r@   r   r   r   r   <module>   s,   

 