o
    {,h>B                     @   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 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)sync_to_async)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/rh/venv/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                   @   sv  e Zd ZdZdZdZe ZdddZdd Z	d	d
 Z
dd Zdd Zdd Zedd ZdddZdddZefd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/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?d@ Z&dAdB Z'dCdD Z(dEdF Z)dGdH Z*dIdJ Z+dKdL Z,dMdN Z-dOdP Z.dQdR Z/dSdT Z0ee/Z1ee/e0Z2ddVdWZ3ddXdYZ4ee3Z5dZd[ Z6d\d] Z7d^d_ Z8d`da Z9dbdc Z:ddde Z;dfdg Z<dhdi Z=djdk Z>dldm Z?dndo Z@dpdq ZAdrds ZBdtdu ZCdvdw ZDdxdy ZEdzd{ ZFdd|d}ZGdd~dZHdddZIdddZJdd ZKdd ZLeMdd ZNeMdd ZOdS )SessionBasez-
    Base class for all Session classes.
    
testcookieworkedNc                 C   s"   || _ d| _d| _ttj| _d S )NF)_session_keyaccessedmodifiedr	   r   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__3      
zSessionBase.__contains__c                 C   s
   | j | S r!   r"   r$   r   r   r   __getitem__6   r'   zSessionBase.__getitem__c                 C   s   || j |< d| _d S NTr#   r   r   r%   valuer   r   r   __setitem__9   s   

zSessionBase.__setitem__c                    s   ||   I d H |< d| _d S r)   )_aget_sessionr   r+   r   r   r   aset=   s   
zSessionBase.asetc                 C   s   | j |= d| _d S r)   r*   r$   r   r   r   __delitem__A   s   
zSessionBase.__delitem__c                 C   s   d| j j S )Nzdjango.contrib.sessions.)	__class__r   r   r   r   r   key_saltE   s   zSessionBase.key_saltc                 C   s   | j ||S r!   )r#   getr   r%   defaultr   r   r   r4   I   s   zSessionBase.getc                    s   |   I d H ||S r!   )r.   r4   r5   r   r   r   agetL      zSessionBase.agetc                 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%   r6   argsr   r   r   r;   O   s   zSessionBase.popc                    sL   | j p||  I d H v | _ || ju rdn|f}|  I d H j|g|R  S r9   )r   r.   r:   r;   r<   r   r   r   apopT   s   zSessionBase.apopc                 C   s    || j v r
| j | S || |< |S r!   r"   r+   r   r   r   
setdefaultY   s   

zSessionBase.setdefaultc                    s6   |   I d H }||v r|| S | ||I d H  |S r!   )r.   r/   )r   r%   r,   sessionr   r   r   asetdefault`   s   zSessionBase.asetdefaultc                 C   s   | j | | j< d S r!   )TEST_COOKIE_VALUETEST_COOKIE_NAMEr2   r   r   r   set_test_cookieh   s   zSessionBase.set_test_cookiec                    s   |  | j| jI d H  d S r!   )r/   rC   rB   r2   r   r   r   aset_test_cookiek   s   zSessionBase.aset_test_cookiec                 C   s   |  | j| jkS r!   )r4   rC   rB   r2   r   r   r   test_cookie_workedn   s   zSessionBase.test_cookie_workedc                    s   |  | jI d H | jkS r!   )r7   rC   rB   r2   r   r   r   atest_cookie_workedq   s   zSessionBase.atest_cookie_workedc                 C   s   | | j = d S r!   )rC   r2   r   r   r   delete_test_cookiet   s   zSessionBase.delete_test_cookiec                    s   |   I d H | j= d S r!   )r.   rC   r2   r   r   r   adelete_test_cookiew   r8   zSessionBase.adelete_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   dumpsr3   r   )r   session_dictr   r   r   encodez   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)rJ   r   z!django.security.SuspiciousSessionzSession data corrupted)	r   loadsr3   r   BadSignaturelogging	getLoggerwarning	Exception)r   session_dataloggerr   r   r   decode   s   

zSessionBase.decodec                 C   s   | j | d| _d S r)   )r#   updater   r   dict_r   r   r   rX      s   
zSessionBase.updatec                    s    |   I d H | d| _d S r)   )r.   rX   r   rY   r   r   r   aupdate   s   
zSessionBase.aupdatec                 C   r    r!   r"   r$   r   r   r   has_key   r'   zSessionBase.has_keyc                    s   ||   I d H v S r!   )r.   r$   r   r   r   ahas_key      zSessionBase.ahas_keyc                 C   
   | j  S r!   )r#   keysr2   r   r   r   r`      r'   zSessionBase.keysc                       |   I d H  S r!   )r.   r`   r2   r   r   r   akeys   r^   zSessionBase.akeysc                 C   r_   r!   )r#   valuesr2   r   r   r   rc      r'   zSessionBase.valuesc                    ra   r!   )r.   rc   r2   r   r   r   avalues   r^   zSessionBase.avaluesc                 C   r_   r!   )r#   itemsr2   r   r   r   re      r'   zSessionBase.itemsc                    ra   r!   )r.   re   r2   r   r   r   aitems   r^   zSessionBase.aitemsc                 C   s   i | _ d| _d| _d S r)   )_session_cacher   r   r2   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   rg   AttributeErrorr2   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                    s$   	 t dt}| |I d H s|S q)NTrk   )r   rl   aexistsr   r   r   r   _aget_new_session_key   s   
z!SessionBase._aget_new_session_keyc                 C   s   | j d u r
|  | _ | j S r!   )r   rn   r2   r   r   r   _get_or_create_session_key   s   

z&SessionBase._get_or_create_session_keyc                    s"   | j d u r|  I d H | _ | j S r!   )r   rp   r2   r   r   r   _aget_or_create_session_key   s   
z'SessionBase._aget_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_keyr2   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   rg   ri   r   loadr   no_loadr   r   r   _get_session   s   zSessionBase._get_sessionc                    sT   d| _ z| jW S  ty)   | jd u s|ri | _Y | jS |  I d H | _Y | jS w r)   )r   rg   ri   r   aloadr|   r   r   r   r.      s   zSessionBase._aget_sessionc                 C   s   t jS r!   )r   SESSION_COOKIE_AGEr2   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 )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_expiryQ )KeyErrorr   nowr4   r   
isinstancer   strfromisoformatdayssecondsr   kwargsr   r   deltar   r   r   get_expiry_age  s$   

zSessionBase.get_expiry_agec                    s   z|d }W n t y   t }Y nw z|d }W n t y,   | dI d H }Y nw |s3|  S t|ttfs<|S t|trFt|}|| }|j	d |j
 S )Nr   r   r   r   )r   r   r   r7   r   r   r   r   r   r   r   r   r   r   r   aget_expiry_age'  s&   

zSessionBase.aget_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 )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.
        r   r   r   r   )
r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   get_expiry_date:  s    


zSessionBase.get_expiry_datec                    s   z|d }W n t y   t }Y nw z|d }W n t y,   | dI d H }Y nw t|tr4|S t|tr>t|S |pC|  }|t	|d S )Nr   r   r   r   )
r   r   r   r7   r   r   r   r   r   r   r   r   r   r   aget_expiry_dateQ  s"   


zSessionBase.aget_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   )r   r   r   r   r   r   	isoformatry   r   r   r   
set_expiryb  s   

zSessionBase.set_expiryc                    st   |d u rz|  dI d H  W d S  ty   Y d S w t|tr&t | }t|tr/| }| d|I d H  d S )Nr   )	r>   r   r   r   r   r   r   r   r/   ry   r   r   r   aset_expiry~  s   

zSessionBase.aset_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   )r4   r   SESSION_EXPIRE_AT_BROWSER_CLOSEr   r   r   r   r   get_expire_at_browser_close  s   z'SessionBase.get_expire_at_browser_closec                    s(   |  dI d H  }d u rtjS |dkS )Nr   r   )r7   r   r   r   r   r   r   aget_expire_at_browser_close  s   z(SessionBase.aget_expire_at_browser_closec                 C   s   |    |   d| _dS )zc
        Remove the current session data from the database and regenerate the
        key.
        N)rh   deleter   r2   r   r   r   flush  s   
zSessionBase.flushc                    s"   |    |  I d H  d | _d S r!   )rh   adeleter   r2   r   r   r   aflush  s   
zSessionBase.aflushc                 C   s0   | j }| j}|   || _|r| | dS dS zU
        Create a new session key, while retaining the current session data.
        N)r#   r   createrg   r   r   datar%   r   r   r   	cycle_key  s   zSessionBase.cycle_keyc                    sF   |   I dH }| j}|  I dH  || _|r!| |I dH  dS dS r   )r.   r   acreaterg   r   r   r   r   r   
acycle_key  s   zSessionBase.acycle_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   rm        zSessionBase.existsc                       t | j|I d H S r!   )r   rm   r   r   r   r   ro        zSessionBase.aexistsc                 C   r   )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() methodr   r2   r   r   r   r        zSessionBase.createc                       t | j I d H S r!   )r   r   r2   r   r   r   r     r^   zSessionBase.acreatec                 C   r   )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() methodr   r   must_creater   r   r   save  r   zSessionBase.savec                    r   r!   )r   r   r   r   r   r   asave  r   zSessionBase.asavec                 C   r   )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() methodr   r   r   r   r   r     s   zSessionBase.deletec                    r   r!   )r   r   r   r   r   r   r     r   zSessionBase.adeletec                 C   r   )z@
        Load the session data and return a dictionary.
        z6subclasses of SessionBase must provide a load() methodr   r2   r   r   r   r{     r   zSessionBase.loadc                    r   r!   )r   r{   r2   r   r   r   r     r^   zSessionBase.aloadc                 C   r   )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().r   clsr   r   r   clear_expired  s   	zSessionBase.clear_expiredc                    r   r!   )r   r   r   r   r   r   aclear_expired	  s   zSessionBase.aclear_expiredr!   )F)Pr   r   r   r   rC   rB   objectr:   r   r&   r(   r-   r/   r0   propertyr3   r4   r7   r;   r>   r?   rA   rD   rE   rF   rG   rH   rI   rN   rW   rX   r[   r\   r]   r`   rb   rc   rd   re   rf   rh   rj   rn   rp   rq   rr   ru   rw   rz   r   r   r~   r.   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   ro   r   r   r   r   r   r   r{   r   classmethodr   r   r   r   r   r   r   #   s    



		


	





	

r   )rQ   stringr   r   asgiref.syncr   django.confr   django.corer   django.utilsr   django.utils.cryptor   django.utils.module_loadingr	   ascii_lowercasedigitsrl   rT   r   r   r   r   r   r   r   <module>   s    	