a
    mzfU2                     @   sb  d Z ddlZddlZddlZ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 zddlZW n ey   ddlZY n0 dd	lmZmZ g d
Zeddddddddddddej_G dd dejZG dd deZG dd dZG dd deZ G dd deZ!G dd dZ"G dd deZ#e$d kr^ddl%Z%e%&  dS )!z"
Session Management
(from web.py)
    N)deepcopy)sha1   )utils)webapi)	iteritems)encodebytesdecodebytes)SessionSessionExpiredStore	DiskStoreDBStoreMemoryStoreZwebpy_session_idiQ TZfLjUfxqXtfNoIldA0A0JzSession expiredF)cookie_namecookie_domaincookie_pathsamesitetimeoutignore_expiryignore_change_ip
secret_keyexpired_messagehttponlysecurec                   @   s   e Zd Zdd ZdS )r   c                 C   s   t jj| di |d d S )Nz200 OK)data)web	HTTPError__init__)selfmessage r!   9/var/www/media/lib/python3.9/site-packages/web/session.pyr   0   s    zSessionExpired.__init__N)__name__
__module____qualname__r   r!   r!   r!   r"   r   /   s   r   c                   @   s   e Zd ZdZg dZd%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dZdd Zdd Zdd  Zd!d" Zd#d$ ZdS )'r
   zSession management for web.py)store_initializer_last_cleanup_time_config_data__getitem____setitem____delitem__Nc                 C   s^   || _ || _d| _ttjj| _t	 | _
| j
j| _| j
j| _| j
j| _|rZ|| j d S )Nr   )r&   r'   r(   r   storager   configsession_parametersr)   Zthreadeddictr*   r+   r,   r-   Zadd_processor
_processor)r   Zappr&   Zinitializerr!   r!   r"   r   B   s    



zSession.__init__c                 C   s
   || j v S N)r*   r   namer!   r!   r"   __contains__P   s    zSession.__contains__c                 C   s   t | j|S r2   )getattrr*   r3   r!   r!   r"   __getattr__S   s    zSession.__getattr__c                 C   s,   || j v rt| || nt| j|| d S r2   )	__slots__object__setattr__setattrr*   )r   r4   valuer!   r!   r"   r:   V   s    
zSession.__setattr__c                 C   s   t | j| d S r2   )delattrr*   r3   r!   r!   r"   __delattr__\   s    zSession.__delattr__c                 C   s0   |    |   z| W |   S |   0 dS )z8Application processor to setup session for every requestN)_cleanup_load_save)r   handlerr!   r!   r"   r1   _   s    zSession._processorc                 C   s   | j j}t || _| jr0| | js0d| _|   | jr\| j| j }| 	| | 
  | js|  | _| jrt| jtr| 	t| j nt| jdr|   tjj| _dS )z6Load the session from the store, by the id from cookieN__call__)r)   r   r   cookiesget
session_id_valid_session_id_check_expiryr&   update_validate_ip_generate_session_idr'   
isinstancedictr   hasattrctxip)r   r   dr!   r!   r"   r@   j   s"    

zSession._loadc                 C   s.   | j r*| j | jvr*| jjr"d | _ n|  S d S r2   )rF   r&   r)   r   expiredr   r!   r!   r"   rH      s    zSession._check_expiryc                 C   s.   | j r*| dd tjjkr*| jjs*|  S d S )NrP   )rF   rE   r   rO   rP   r)   r   rR   rS   r!   r!   r"   rJ      s    zSession._validate_ipc                 C   sf   t | j}|d= |d= | ds@| | j t | j| j| j< n"t | jj	rb| j| jdd d S )NrF   rP   _killed)expires)
rM   r*   rE   
_setcookierF   r&   r   rD   r)   r   )r   Zcurrent_valuesr!   r!   r"   rA      s    

zSession._save c           
   
   K   s\   | j j}| j j}| j j}| j j}| j j}|d| j dd }	tj||||||||	d d S )Nr   )rV   domainr   r   pathr   )	r)   r   r   r   r   r   rE   r   Z	setcookie)
r   rF   rV   kwr   r   r   r   r   r   r!   r!   r"   rW      s     zSession._setcookiec                 C   sX   t d}t }| jj}d||ttjj	|f }t
|d }|| jvr qTq |S )z Generate a random id for session   z%s%s%s%szutf-8)osurandomtimer)   r   r   Zsafestrr   rO   rP   r   encode	hexdigestr&   )r   Zrandnowr   ZhashablerF   r!   r!   r"   rK      s    

zSession._generate_session_idc                 C   s   t d}||S )Nz^[0-9a-fA-F]+$)r   Z
re_compilematch)r   rF   rxr!   r!   r"   rG      s    
zSession._valid_session_idc                 C   s4   t   }| jj}|| j |kr0| j| || _dS )zCleanup the stored sessionsN)r_   r)   r   r(   r&   cleanup)r   current_timer   r!   r!   r"   r?      s
    zSession._cleanupc                 C   s   d| _ |   t| jjdS )z'Called when an expired session is atimeTN)rT   rA   r   r)   r   rS   r!   r!   r"   rR      s    zSession.expiredc                 C   s   | j | j= d| _dS )z-Kill the session, make it no longer availableTN)r&   rF   rT   rS   r!   r!   r"   kill   s    
zSession.kill)N)rX   )r#   r$   r%   __doc__r8   r   r5   r7   r:   r>   r1   r@   rH   rJ   rA   rW   rK   rG   r?   rR   rg   r!   r!   r!   r"   r
   4   s$   

r
   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r   zBase class for session storesc                 C   s
   t  d S r2   NotImplementedErrorr   keyr!   r!   r"   r5      s    zStore.__contains__c                 C   s
   t  d S r2   ri   rk   r!   r!   r"   r+      s    zStore.__getitem__c                 C   s
   t  d S r2   ri   r   rl   r<   r!   r!   r"   r,      s    zStore.__setitem__c                 C   s
   t  dS )z removes all the expired sessionsNri   )r   r   r!   r!   r"   re      s    zStore.cleanupc                 C   s   t |}t|S )z encodes session dict as a string)pickledumpsr   )r   Zsession_dictpickledr!   r!   r"   r`      s    
zStore.encodec                 C   s$   t |tr| }t|}t|S )z.decodes the data to get back the session dict )rL   strr`   r	   rn   loads)r   Zsession_datarp   r!   r!   r"   decode   s    
zStore.decodeN)
r#   r$   r%   rh   r5   r+   r,   re   r`   rs   r!   r!   r!   r"   r      s   r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )r   ai  
    Store for saving a session on disk.

        >>> import tempfile
        >>> root = tempfile.mkdtemp()
        >>> s = DiskStore(root)
        >>> s['a'] = 'foo'
        >>> s['a']
        'foo'
        >>> time.sleep(0.01)
        >>> s.cleanup(0.01)
        >>> s['a']
        Traceback (most recent call last):
            ...
        KeyError: 'a'
    c                 C   s(   t j|st t j| || _d S r2   )r]   rZ   existsmakedirsabspathroot)r   rw   r!   r!   r"   r     s    zDiskStore.__init__c                 C   s,   t jj|v rtdt| t j| j|S )NzBad key: %s)r]   rZ   sep
ValueErrorreprjoinrw   rk   r!   r!   r"   	_get_path  s    zDiskStore._get_pathc                 C   s   |  |}tj|S r2   )r|   r]   rZ   rt   r   rl   rZ   r!   r!   r"   r5     s    
zDiskStore.__contains__c                 C   s^   |  |}tj|rRt|d}| }W d    n1 s>0    Y  | |S t|d S )Nrb)r|   r]   rZ   rt   openreadrs   KeyError)r   rl   rZ   fhrp   r!   r!   r"   r+     s    
&
zDiskStore.__getitem__c              
   C   s   |  |}| |}z\|d t   }t|d}z"|| W |  t	|| n|  t	|| 0 W n t
y   Y n0 d S )N.wb)r|   r`   	threadingcurrent_threadgetNamer   writecloseshutilmoveIOError)r   rl   r<   rZ   rp   Ztnamefr!   r!   r"   r,     s    


zDiskStore.__setitem__c                 C   s$   |  |}tj|r t| d S r2   )r|   r]   rZ   rt   remover}   r!   r!   r"   r-   -  s    
zDiskStore.__delitem__c                 C   st   t j| jsd S t }t | jD ]H}| |}t |j}|| |kr&t j|rdt	
| q&t | q&d S r2   )r]   rZ   isdirrw   r_   listdirr|   statst_atimer   rmtreer   )r   r   rb   r   rZ   atimer!   r!   r"   re   2  s    
zDiskStore.cleanupN)r#   r$   r%   rh   r   r|   r5   r+   r,   r-   re   r!   r!   r!   r"   r      s   
r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r   zStore for saving a session in database
    Needs a table with the following columns:

        session_id CHAR(128) UNIQUE NOT NULL,
        atime DATETIME NOT NULL default current_timestamp,
        data TEXT
    c                 C   s   || _ || _d S r2   )dbtable)r   r   Z
table_namer!   r!   r"   r   J  s    zDBStore.__init__c                 C   s"   | j j| jdt d}tt|S Nsession_id=$keywherevars)r   selectr   localsboollist)r   rl   r   r!   r!   r"   r5   N  s    zDBStore.__contains__c                 C   sl   t j  }z6| jj| jdt dd }| jj| jd|t d W n tyZ   t|Y n0 | 	|j
S d S )Nr   r   r   )r   r   r   )datetimerb   r   r   r   r   rI   
IndexErrorr   rs   r   )r   rl   rb   sr!   r!   r"   r+   R  s    

zDBStore.__getitem__c                 C   sX   |  | }tj }|| v r<| jj| jd||t d n| jj| jd|||d d S )Nr   )r   r   r   r   F)rF   r   r   )	r`   rs   r   rb   r   rI   r   r   insert)r   rl   r<   rp   rb   r!   r!   r"   r,   ^  s    
zDBStore.__setitem__c                 C   s   | j j| jdt d d S r   )r   deleter   r   rk   r!   r!   r"   r-   o  s    zDBStore.__delitem__c                 C   s6   t |d }t j  | }| jj| jdt d d S )Ng     @z$last_allowed_time > atimer   )r   	timedeltarb   r   r   r   r   )r   r   Zlast_allowed_timer!   r!   r"   re   r  s
    zDBStore.cleanupN
r#   r$   r%   rh   r   r5   r+   r,   r-   re   r!   r!   r!   r"   r   A  s   r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )
ShelfStorezStore for saving session using `shelve` module.

        import shelve
        store = ShelfStore(shelve.open('session.shelf'))

    XXX: is shelve thread-safe?
    c                 C   s
   || _ d S r2   shelf)r   r   r!   r!   r"   r     s    zShelfStore.__init__c                 C   s
   || j v S r2   r   rk   r!   r!   r"   r5     s    zShelfStore.__contains__c                 C   s   | j | \}}|| |< |S r2   r   )r   rl   r   vr!   r!   r"   r+     s    zShelfStore.__getitem__c                 C   s   t   |f| j|< d S r2   r_   r   rm   r!   r!   r"   r,     s    zShelfStore.__setitem__c                 C   s$   z| j |= W n ty   Y n0 d S r2   )r   r   rk   r!   r!   r"   r-     s    zShelfStore.__delitem__c                 C   s8   t   }| jD ]$}| j| \}}|| |kr| |= qd S r2   r   )r   r   rb   kr   r   r!   r!   r"   re     s
    
zShelfStore.cleanupNr   r!   r!   r!   r"   r   z  s   r   c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )r   zStore for saving a session in memory.
    Useful where there is limited fs writes on the disk, like
    flash memories

    Data will be saved into a dict:
    k: (time, pydata)
    Nc                 C   s   |d u ri }|| _ d S r2   d_store)r   r   r!   r!   r"   r     s    zMemoryStore.__init__c                 C   s
   || j v S r2   r   rk   r!   r!   r"   r5     s    zMemoryStore.__contains__c                 C   s$   | j | \}}t |f| j |< |S )z/Return the value and update the last seen value)r   r_   )r   rl   tr<   r!   r!   r"   r+     s    zMemoryStore.__getitem__c                 C   s   t   |f| j|< d S r2   )r_   r   rm   r!   r!   r"   r,     s    zMemoryStore.__setitem__c                 C   s   | j |= d S r2   r   rk   r!   r!   r"   r-     s    zMemoryStore.__delitem__c                 C   sP   t   }g }t| jD ]"\}\}}|| |kr|| q|D ]}| j|= q>d S r2   )r_   r   r   append)r   r   rb   Zto_delr   r   r<   r!   r!   r"   re     s    zMemoryStore.cleanup)Nr   r!   r!   r!   r"   r     s   
r   __main__)'rh   r   r]   os.pathr   r   r_   copyr   hashlibr   rX   r   r   r   Z
py3helpersr   cPicklern   ImportErrorbase64r   r	   __all__r.   r/   r0   r   r   r9   r
   r   r   r   r   r   r#   doctesttestmodr!   r!   r!   r"   <module>   sT    #M9%)
