o
    `©Zhà-  ã                   @   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                   @   ó   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   ú\/var/www/html/lang_env/lib/python3.10/site-packages/django/contrib/sessions/backends/base.pyr
      s    r
   c                   @   r	   )Ú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dVd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$dWd: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/dWdNdO„Z0dVdPdQ„Z1dRdS„ Z2e3dTdU„ ƒZ4dS )XÚ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   ó
   || j v S ©N©Ú_session©r   Úkeyr   r   r   Ú__contains__1   ó   
zSessionBase.__contains__c                 C   s
   | j | S r   r   r    r   r   r   Ú__getitem__4   r#   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   r1   F   s   zSessionBase.popc                 C   s(   || j v r
| j | S d| _|| j |< |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.   r5   r4   r,   r   r   r   Útest_cookie_workedV   s   zSessionBase.test_cookie_workedc                 C   s   | | j = d S r   )r5   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 i S  ty)   Y i S w )N)r9   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   rD   s   s   
zSessionBase.updatec                 C   r   r   r   r    r   r   r   Úhas_keyw   r#   zSessionBase.has_keyc                 C   ó
   | j  ¡ S r   )r   Úkeysr,   r   r   r   rG   z   r#   zSessionBase.keysc                 C   rF   r   )r   Úvaluesr,   r   r   r   rH   }   r#   zSessionBase.valuesc                 C   rF   r   )r   Úitemsr,   r   r   r   rI   €   r#   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 w )zBReturn True when there is no session_key and the session is empty.T)r   rJ   ÚAttributeErrorr,   r   r   r   Úis_empty‹   s
   ÿzSessionBase.is_emptyc                 C   s   	 t dtƒ}|  |¡s|S q)z)Return session key that isn't being used.Té    )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   rQ   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¥   ó   zSessionBase._get_session_keyc                 C   s   |   |¡r
|| _dS d| _dS )zV
        Validate session key on assignment. Invalid values will set to None.
        N)rU   rV   ©r   r(   r   r   r   Ú_set_session_key¨   s   


zSessionBase._set_session_keyFc                 C   sL   d| _ z| jW S  ty%   | jdu s|ri | _Y | jS |  ¡ | _Y | jS w )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   rJ   rL   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Å   rX   z"SessionBase.get_session_cookie_agec                 K   sœ   z|d }W n t y   t ¡ }Y nw z|d }W n t y(   |  d¡}Y nw |s/|  ¡ S t|ttfƒs8|S t|tƒrBt |¡}|| }|j	d |j
 S )zÕGet 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_expiryi€Q )ÚKeyErrorr   Únowr.   r]   Ú
isinstancer   ÚstrÚfromisoformatÚdaysÚseconds)r   Úkwargsr^   r_   Údeltar   r   r   Úget_expiry_ageÈ   s$   ÿÿ

zSessionBase.get_expiry_agec                 K   sŽ   z|d }W n t y   t ¡ }Y nw z|d }W n t y(   |  d¡}Y nw t|tƒr0|S t|tƒr:t |¡S |p?|  ¡ }|t	|d S )zÔGet 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.
        r^   r_   r`   )rg   )
ra   r   rb   r.   rc   r   rd   re   r]   r   )r   rh   r^   r_   r   r   r   Úget_expiry_dateã   s    ÿÿ


zSessionBase.get_expiry_datec                 C   s^   |du rz| d= W dS  t y   Y dS w t|tƒr t ¡ | }t|tƒr)| ¡ }|| 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`   )ra   rc   r   r   rb   r   Ú	isoformatrY   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   r_   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)rK   Údeleter   r,   r   r   r   Úflush!  s   
zSessionBase.flushc                 C   s0   | j }| j}|  ¡  || _|r|  |¡ dS dS )zU
        Create a new session key, while retaining the current session data.
        N)r   r   ÚcreaterJ   ro   )r   Údatar!   r   r   r   Ú	cycle_key*  s   ÿzSessionBase.cycle_keyc                 C   ó   t dƒ‚)zF
        Return True if the given session_key already exists.
        z9subclasses of SessionBase must provide an exists() method©ÚNotImplementedErrorr   r   r   r   rP   7  ó   ÿzSessionBase.existsc                 C   rt   )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() methodru   r,   r   r   r   rq   ?  ó   ÿzSessionBase.createc                 C   rt   )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() methodru   )r   Zmust_creater   r   r   ÚsaveI  rx   zSessionBase.savec                 C   rt   )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() methodru   r   r   r   r   ro   S  s   ÿzSessionBase.deletec                 C   rt   )z@
        Load the session data and return a dictionary.
        z6subclasses of SessionBase must provide a load() methodru   r,   r   r   r   r[   \  rw   zSessionBase.loadc                 C   rt   )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().ru   )Úclsr   r   r   Úclear_expiredd  s   	zSessionBase.clear_expiredr   )F)5r   r   r   r   r5   r4   Úobjectr0   r   r"   r$   r)   r*   Úpropertyr-   r.   r1   r3   r6   r7   r8   r<   rC   rD   rE   rG   rH   rI   rK   rM   rQ   rR   rU   rW   rZ   r   r   r\   r   r]   rj   rk   rm   rn   rp   rs   rP   rq   ry   ro   r[   Úclassmethodr{   r   r   r   r   r   !   sd    


		

	



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