a
    0h                     @  s   d dl mZ d dlm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 G dd deZG dd dee ZdS )    )annotationsN)datetime)timezone   )base64_decode)base64_encode)bytes_to_int)int_to_bytes)
want_bytes)BadSignature)BadTimeSignature)SignatureExpired)_TSerialized)
Serializer)Signerc                      s   e Zd ZdZddddZddddd	Zd
ddddZejd d
ddddddZ	ejd!d
ddddddZ	d"d
dddd fddZ	d#d
dd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.
    int)returnc                 C  s   t t S )zTReturns the current timestamp. The function must return an
        integer.
        )r   time)self r   @/var/www/auris/lib/python3.9/site-packages/itsdangerous/timed.pyget_timestamp   s    zTimestampSigner.get_timestampr   )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str | bytesbytes)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   sign-   s
    
zTimestampSigner.signNF
int | Nonezt.Literal[False])signed_valuemax_agereturn_timestampr   c                 C  s   d S Nr   r   r%   r&   r'   r   r   r   unsign8   s    zTimestampSigner.unsignTzt.Literal[True]ztuple[bytes, datetime]c                 C  s   d S r(   r   r)   r   r   r   r*   @   s    boolztuple[bytes, datetime] | bytesc              
     s  zt  |}d}W n2 tyF } z|}|jp0d}W Y d}~n
d}~0 0 t| j}||vrn|rb|td|d||d\}}	d}
d}ztt	|	}
W n t
y   Y n0 |dur|
durz| |
}W n: tttfy } ztd|d|W Y d}~n
d}~0 0 tt|||d|
du r0td|d|dur|  |
 }||krrt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*   H   s`     







)r%   r&   r   c                 C  s.   z| j ||d W dS  ty(   Y dS 0 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#   toverloadr*   r:   __classcell__r   r   r8   r   r      s    
    
  Xr   c                      sf   e Zd ZU dZeZded< dddd fdd	ZdddddddddZddddddddZ	  Z
S )TimedSerializerzOUses :class:`TimestampSigner` instead of the default
    :class:`.Signer`.
    ztype[TimestampSigner]default_signerNzstr | bytes | Nonecabc.Iterator[TimestampSigner])saltr   c                   s   t dt |S )NrD   )r?   castr.   iter_unsigners)r   rE   r8   r   r   rG      s    zTimedSerializer.iter_unsignersFr   r$   r+   zt.Any)sr&   r'   rE   r   c                 C  s   t |}d}| |D ]z}z:|j||dd\}}| |}	|rL|	|fW   S |	W   S  tyh    Y q ty }
 z|
}W Y d}
~
qd}
~
0 0 q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
   rG   r*   Zload_payloadr   r   r?   rF   )r   rH   r&   r'   rE   Zlast_exceptionsignerZbase64dr"   r-   errr   r   r   loads   s     


zTimedSerializer.loadsztuple[bool, t.Any])rH   r&   rE   r   c                 C  s   | j ||d|idS )Nr&   )Zload_kwargs)Z_loads_unsafe_impl)r   rH   r&   rE   r   r   r   loads_unsafe   s    zTimedSerializer.loads_unsafe)N)NFN)NN)r;   r<   r=   r>   r   rC   __annotations__rG   rK   rL   rA   r   r   r8   r   rB      s   
    (  rB   )
__future__r   collections.abcabcZcabcr   typingr?   r   r   encodingr   r   r   r	   r
   r7   r   r   r   
serializerr   r   rI   r   r   rB   r   r   r   r   <module>   s&    