a
    5Xh-                     @   s   d dl Z d dlZd dlmZ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j ZG dd	 d	eZG d
d deZG dd dZdS )    N)datetime	timedelta)settings)signing)timezone)get_random_string)import_stringc                   @   s   e Zd ZdZdS )CreateErrorz
    Used internally as a consistent exception type to catch from save (see the
    docstring for SessionBase.save() for details).
    N__name__
__module____qualname____doc__ r   r   j/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/django/contrib/sessions/backends/base.pyr	      s   r	   c                   @   s   e Zd ZdZdS )UpdateErrorzF
    Occurs if Django tries to update a session that was deleted.
    Nr
   r   r   r   r   r      s   r   c                   @   s  e Zd ZdZdZdZe ZdVddZdd Z	d	d
 Z
dd Zdd Zedd ZdWddZefddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"ee!Z#ee!e"Z$dXd:d;Z%ee%Z&d<d= Z'd>d? Z(d@dA Z)dBdC Z*dDdE Z+dFdG Z,dHdI Z-dJdK Z.dLdM Z/dYdNdOZ0dZdPdQZ1dRdS Z2e3dTdU Z4dS )[SessionBasez-
    Base class for all Session classes.
    Z
testcookieZworkedNc                 C   s"   || _ d| _d| _ttj| _d S )NF)_session_keyaccessedmodifiedr   r   ZSESSION_SERIALIZER
serializerselfsession_keyr   r   r   __init__+   s    zSessionBase.__init__c                 C   s
   || j v S N_sessionr   keyr   r   r   __contains__1   s    zSessionBase.__contains__c                 C   s
   | j | S r   r   r   r   r   r   __getitem__4   s    zSessionBase.__getitem__c                 C   s   || j |< d| _d S NTr   r   r   r   valuer   r   r   __setitem__7   s    
zSessionBase.__setitem__c                 C   s   | j |= d| _d S r"   r#   r   r   r   r   __delitem__;   s    zSessionBase.__delitem__c                 C   s   d| j j S )Nzdjango.contrib.sessions.)	__class__r   r   r   r   r   key_salt?   s    zSessionBase.key_saltc                 C   s   | j ||S r   )r   get)r   r   defaultr   r   r   r+   C   s    zSessionBase.getc                 C   s:   | j p|| jv | _ || ju r dn|f}| jj|g|R  S )Nr   )r   r   _SessionBase__not_givenpop)r   r   r,   argsr   r   r   r.   F   s    zSessionBase.popc                 C   s,   || j v r| j | S d| _|| j |< |S d S r"   r#   r$   r   r   r   
setdefaultK   s
    


zSessionBase.setdefaultc                 C   s   | j | | j< d S r   )TEST_COOKIE_VALUETEST_COOKIE_NAMEr)   r   r   r   set_test_cookieS   s    zSessionBase.set_test_cookiec                 C   s   |  | j| jkS r   )r+   r2   r1   r)   r   r   r   test_cookie_workedV   s    zSessionBase.test_cookie_workedc                 C   s   | | j = d S r   )r2   r)   r   r   r   delete_test_cookieY   s    zSessionBase.delete_test_cookiec                 C   s   t j|| j| jddS )zGReturn the given session dictionary serialized and encoded as a string.T)saltr   compress)r   dumpsr*   r   )r   Zsession_dictr   r   r   encode\   s    zSessionBase.encodec                 C   sT   zt j|| j| jdW S  t jy>   td}|d Y n tyN   Y n0 i S )N)r6   r   z!django.security.SuspiciousSessionzSession data corrupted)	r   loadsr*   r   ZBadSignaturelogging	getLoggerwarning	Exception)r   Zsession_dataloggerr   r   r   decodee   s    

zSessionBase.decodec                 C   s   | j | d| _d S r"   )r   updater   )r   Zdict_r   r   r   rA   s   s    zSessionBase.updatec                 C   s
   || j v S r   r   r   r   r   r   has_keyw   s    zSessionBase.has_keyc                 C   s
   | j  S r   )r   keysr)   r   r   r   rC   z   s    zSessionBase.keysc                 C   s
   | j  S r   )r   valuesr)   r   r   r   rD   }   s    zSessionBase.valuesc                 C   s
   | j  S r   )r   itemsr)   r   r   r   rE      s    zSessionBase.itemsc                 C   s   i | _ d| _d| _d S r"   )_session_cacher   r   r)   r   r   r   clear   s    zSessionBase.clearc                 C   s,   z| j  o| j W S  ty&   Y dS 0 dS )zBReturn True when there is no session_key and the session is empty.TN)r   rF   AttributeErrorr)   r   r   r   is_empty   s    zSessionBase.is_emptyc                 C   s   t dt}| |s |S q dS )z)Return session key that isn't being used.    N)r   VALID_KEY_CHARSexistsr   r   r   r   _get_new_session_key   s    

z SessionBase._get_new_session_keyc                 C   s   | j d u r|  | _ | j S r   )r   rM   r)   r   r   r   _get_or_create_session_key   s    

z&SessionBase._get_or_create_session_keyc                 C   s   |ot |dkS )z
        Key must be truthy and at least 8 characters long. 8 characters is an
        arbitrary lower bound for some minimal key security.
           )lenr   r   r   r   _validate_session_key   s    z!SessionBase._validate_session_keyc                 C   s   | j S r   )_SessionBase__session_keyr)   r   r   r   _get_session_key   s    zSessionBase._get_session_keyc                 C   s   |  |r|| _nd| _dS )zV
        Validate session key on assignment. Invalid values will set to None.
        N)rQ   rR   r   r%   r   r   r   _set_session_key   s    
zSessionBase._set_session_keyFc                 C   sH   d| _ z| jW S  ty@   | jdu s*|r2i | _n
|  | _Y n0 | jS )z
        Lazily load session from storage (unless "no_load" is True, when only
        an empty dict is stored) and store it in the current instance.
        TN)r   rF   rH   r   load)r   Zno_loadr   r   r   _get_session   s    zSessionBase._get_sessionc                 C   s   t jS r   )r   ZSESSION_COOKIE_AGEr)   r   r   r   get_session_cookie_age   s    z"SessionBase.get_session_cookie_agec                 K   s   z|d }W n t y&   t }Y n0 z|d }W n t yP   | d}Y n0 |s^|  S t|ttfsp|S t|trt|}|| }|j	d |j
 S )zGet the number of seconds until the session expires.

        Optionally, this function accepts `modification` and `expiry` keyword
        arguments specifying the modification and expiry of the session.
        modificationexpiry_session_expiryiQ )KeyErrorr   nowr+   rX   
isinstancer   strfromisoformatdaysseconds)r   kwargsrY   rZ   deltar   r   r   get_expiry_age   s     

zSessionBase.get_expiry_agec                 K   s   z|d }W n t y&   t }Y n0 z|d }W n t yP   | d}Y n0 t|tr`|S t|trtt|S |p~|  }|t	|d S )zGet session the expiry date (as a datetime object).

        Optionally, this function accepts `modification` and `expiry` keyword
        arguments specifying the modification and expiry of the session.
        rY   rZ   r[   )rb   )
r\   r   r]   r+   r^   r   r_   r`   rX   r   )r   rc   rY   rZ   r   r   r   get_expiry_date   s    


zSessionBase.get_expiry_datec                 C   s^   |du r*z
| d= W n t y$   Y n0 dS t|tr@t | }t|trR| }|| d< dS )a*  
        Set a custom expiration for the session. ``value`` can be an integer,
        a Python ``datetime`` or ``timedelta`` object or ``None``.

        If ``value`` is an integer, the session will expire after that many
        seconds of inactivity. If set to ``0`` then the session will expire on
        browser close.

        If ``value`` is a ``datetime`` or ``timedelta`` object, the session
        will expire at that specific future time.

        If ``value`` is ``None``, the session uses the global session expiry
        policy.
        Nr[   )r\   r^   r   r   r]   r   	isoformatrT   r   r   r   
set_expiry   s    


zSessionBase.set_expiryc                 C   s    |  d }du rtjS |dkS )a  
        Return ``True`` if the session is set to expire when the browser
        closes, and ``False`` if there's an expiry date. Use
        ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry
        date/age, if there is one.
        r[   Nr   )r+   r   ZSESSION_EXPIRE_AT_BROWSER_CLOSE)r   rZ   r   r   r   get_expire_at_browser_close  s    z'SessionBase.get_expire_at_browser_closec                 C   s   |    |   d| _dS )zc
        Remove the current session data from the database and regenerate the
        key.
        N)rG   deleter   r)   r   r   r   flush!  s    zSessionBase.flushc                 C   s,   | j }| j}|   || _|r(| | dS )zU
        Create a new session key, while retaining the current session data.
        N)r   r   createrF   rj   )r   datar   r   r   r   	cycle_key*  s    zSessionBase.cycle_keyc                 C   s   t ddS )zF
        Return True if the given session_key already exists.
        z9subclasses of SessionBase must provide an exists() methodNNotImplementedErrorr   r   r   r   rL   7  s    zSessionBase.existsc                 C   s   t ddS )z
        Create a new session instance. Guaranteed to create a new object with
        a unique key and will have saved the result once (with empty data)
        before the method returns.
        z8subclasses of SessionBase must provide a create() methodNro   r)   r   r   r   rl   ?  s    zSessionBase.createc                 C   s   t ddS )z
        Save the session data. If 'must_create' is True, create a new session
        object (or raise CreateError). Otherwise, only update an existing
        object and don't create one (raise UpdateError if needed).
        z6subclasses of SessionBase must provide a save() methodNro   )r   Zmust_creater   r   r   saveI  s    zSessionBase.savec                 C   s   t ddS )zx
        Delete the session data under this key. If the key is None, use the
        current session key value.
        z8subclasses of SessionBase must provide a delete() methodNro   r   r   r   r   rj   S  s    zSessionBase.deletec                 C   s   t ddS )z@
        Load the session data and return a dictionary.
        z6subclasses of SessionBase must provide a load() methodNro   r)   r   r   r   rV   \  s    zSessionBase.loadc                 C   s   t ddS )a  
        Remove expired sessions from the session store.

        If this operation isn't possible on a given backend, it should raise
        NotImplementedError. If it isn't necessary, because the backend has
        a built-in expiration mechanism, it should be a no-op.
        z.This backend does not support clear_expired().Nro   )clsr   r   r   clear_expiredd  s    	zSessionBase.clear_expired)N)N)F)F)N)5r   r   r   r   r2   r1   objectr-   r   r    r!   r&   r'   propertyr*   r+   r.   r0   r3   r4   r5   r9   r@   rA   rB   rC   rD   rE   rG   rI   rM   rN   rQ   rS   rU   r   r   rW   r   rX   re   rf   rh   ri   rk   rn   rL   rl   rq   rj   rV   classmethodrs   r   r   r   r   r   !   sb   


		

	



	r   )r;   stringr   r   Zdjango.confr   Zdjango.corer   Zdjango.utilsr   Zdjango.utils.cryptor   Zdjango.utils.module_loadingr   ascii_lowercasedigitsrK   r>   r	   r   r   r   r   r   r   <module>   s   	