
    DfU2                        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 	 ddlZn# e$ r ddlZY nw xY wdd	lmZmZ g d
Z ej        dddddddddddd          ej        _         G d dej                  Z G d de          Z G d d          Z G d de          Z  G d de          Z! G d d          Z" G d de          Z#e$d k    rddl%Z% e%j&                     dS dS )!z"
Session Management
(from web.py)
    N)deepcopy)sha1   )utils)webapi)	iteritems)encodebytesdecodebytes)SessionSessionExpiredStore	DiskStoreDBStoreMemoryStorewebpy_session_idiQ TfLjUfxqXtfNoIldA0A0JzSession expiredF)cookie_namecookie_domaincookie_pathsamesitetimeoutignore_expiryignore_change_ip
secret_keyexpired_messagehttponlysecurec                       e Zd Zd ZdS )r   c                 L    t           j                            | di |           d S )Nz200 OK)data)web	HTTPError__init__)selfmessages     :/var/www/media/lib/python3.11/site-packages/web/session.pyr#   zSessionExpired.__init__0   s'    tXr@@@@@    N)__name__
__module____qualname__r#    r'   r&   r   r   /   s(        A A A A Ar'   r   c                   ~    e Zd ZdZg dZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZddZd Zd Zd Zd Zd ZdS )r   zSession management for web.py)store_initializer_last_cleanup_time_config_data__getitem____setitem____delitem__Nc                 R   || _         || _        d| _        t          j        t
          j        j                  | _        t          j	                    | _
        | j
        j        | _        | j
        j        | _        | j
        j        | _        |r|                    | j                   d S d S )Nr   )r-   r.   r/   r   storager!   configsession_parametersr0   threadeddictr1   r2   r3   r4   add_processor
_processor)r$   appr-   initializers       r&   r#   zSession.__init__B   s    
'"#}SZ%BCC'))
:1:1:1 	/do.....	/ 	/r'   c                     || j         v S N)r1   r$   names     r&   __contains__zSession.__contains__P   s    tz!!r'   c                 ,    t          | j        |          S r?   )getattrr1   r@   s     r&   __getattr__zSession.__getattr__S   s    tz4(((r'   c                     || j         v rt                              | ||           d S t          | j        ||           d S r?   )	__slots__object__setattr__setattrr1   )r$   rA   values      r&   rI   zSession.__setattr__V   sG    4>!!tT511111DJe,,,,,r'   c                 0    t          | j        |           d S r?   )delattrr1   r@   s     r&   __delattr__zSession.__delattr__\   s    
D!!!!!r'   c                     |                                   |                                  	  |            |                                  S # |                                  w xY w)z8Application processor to setup session for every request)_cleanup_load_save)r$   handlers     r&   r;   zSession._processor_   sM     	

	799JJLLLLDJJLLLLs   	A Ac                    | j         j        }t          j                                        |          | _        | j        r!|                     | j                  sd| _        |                                  | j        r;| j        | j                 }| 	                    |           | 
                                 | j        s|                                 | _        | j        rkt          | 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__)r0   r   r!   cookiesget
session_id_valid_session_id_check_expiryr-   update_validate_ip_generate_session_idr.   
isinstancedictr   hasattrctxip)r$   r   ds      r&   rQ   zSession._loadj   s/   l.+--++K88 ? 	#4#9#9$/#J#J 	#"DO? 	 
4?+AKKNNN 	("7799DO  (d/66 (KK): ; ;<<<<T.
;; (%%''''*r'   c                     | j         r7| j         | j        vr+| j        j        r	d | _         d S |                                 S d S d S r?   )rX   r-   r0   r   expiredr$   s    r&   rZ   zSession._check_expiry   sP    ? 	&tdj@@|) &"&||~~%		& 	&@@r'   c                     | j         rI|                     dd           t          j        j        k    r"| j        j        s|                                 S d S d S d S )Nrb   )rX   rW   r!   ra   rb   r0   r   re   rf   s    r&   r\   zSession._validate_ip   s]    ? 	&txxd33swzAA<0 &||~~%	& 	&AA& &r'   c                 z   t          | j                  }|d= |d= |                     d          s=|                     | j                   t          | j                  | j        | j        <   d S t          j                                        | j        j	                  r|                     | j        d           d S d S )NrX   rb   _killed)expires)
r_   r1   rW   
_setcookierX   r-   r!   rV   r0   r   )r$   current_valuess     r&   rR   zSession._save   s    dj))<(4 xx	"" 	=OODO,,,*.tz*:*:DJt'''{}}  !9:: =<<<<<= =r'    c           
         | j         j        }| j         j        }| j         j        }| j         j        }| j         j        }|                    d| j                             dd                     }	t          j        ||||||||	           d S )Nr   )rk   domainr   r   pathr   )	r0   r   r   r   r   r   rW   r!   	setcookie)
r$   rX   rk   kwr   r   r   r   r   r   s
             r&   rl   zSession._setcookie   s    l.2l.<($66*dl&6&6z4&H&HII 		
 		
 		
 		
 		
 		
r'   c                 B   	 t          j        d          }t          j                    }| j        j        }||t          j        t          j        j	                  |}t          |                    d                                                    }|| j        vrn|S )z Generate a random id for sessionT   zutf-8)osurandomtimer0   r   r   safestrr!   ra   rb   r   encode	hexdigestr-   )r$   randnowr   hashablerX   s         r&   r]   zSession._generate_session_id   s    	:b>>D)++C0J%)T33cgj0I0I0I::VHhoog6677AACCJ++	 r'   c                 T    t          j        d          }|                    |          S )Nz^[0-9a-fA-F]+$)r   
re_compilematch)r$   rX   rxs      r&   rY   zSession._valid_session_id   s%    .//xx
###r'   c                     t          j                     }| j        j        }|| j        z
  |k    r#| j                            |           || _        dS dS )zCleanup the stored sessionsN)rx   r0   r   r/   r-   cleanup)r$   current_timer   s      r&   rP   zSession._cleanup   sV    y{{,&$11G;;Jw'''&2D### <;r'   c                 j    d| _         |                                  t          | j        j                  )z'Called when an expired session is atimeT)ri   rR   r   r0   r   rf   s    r&   re   zSession.expired   s)    

T\9:::r'   c                 .    | j         | j        = d| _        dS )z-Kill the session, make it no longer availableTN)r-   rX   ri   rf   s    r&   killzSession.kill   s    Jt'r'   r?   )rn   )r(   r)   r*   __doc__rG   r#   rB   rE   rI   rN   r;   rQ   rZ   r\   rR   rl   r]   rY   rP   re   r   r+   r'   r&   r   r   4   s%       ''	 	 	I/ / / /" " ") ) )- - -" " "	 	 	  4& & && & &
= 
= 
=
 
 
 
$  $ $ $3 3 3; ; ;    r'   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	r   zBase class for session storesc                     t                      r?   NotImplementedErrorr$   keys     r&   rB   zStore.__contains__       !###r'   c                     t                      r?   r   r   s     r&   r2   zStore.__getitem__   r   r'   c                     t                      r?   r   r$   r   rK   s      r&   r3   zStore.__setitem__   r   r'   c                     t                      )z removes all the expired sessionsr   )r$   r   s     r&   r   zStore.cleanup   s    !###r'   c                 H    t          j        |          }t          |          S )z encodes session dict as a string)pickledumpsr	   )r$   session_dictpickleds      r&   rz   zStore.encode   s    ,|,,7###r'   c                     t          |t                    r|                                }t          |          }t	          j        |          S )z.decodes the data to get back the session dict )r^   strrz   r
   r   loads)r$   session_datar   s      r&   decodezStore.decode   sB    lC(( 	1'..00Ll++|G$$$r'   N)
r(   r)   r*   r   rB   r2   r3   r   rz   r   r+   r'   r&   r   r      st        ''$ $ $$ $ $$ $ $$ $ $$ $ $
% % % % %r'   r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	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                     t           j                            |          s1t          j        t           j                            |                     || _        d S r?   )rv   rq   existsmakedirsabspathroot)r$   r   s     r&   r#   zDiskStore.__init__  sA    w~~d## 	/K--...			r'   c                     t           j        j        |v rt          dt	          |          z            t           j                            | j        |          S )NzBad key: %s)rv   rq   sep
ValueErrorreprjoinr   r   s     r&   	_get_pathzDiskStore._get_path  sB    7;#]T#YY6777w||DIs+++r'   c                 j    |                      |          }t          j                            |          S r?   )r   rv   rq   r   r$   r   rq   s      r&   rB   zDiskStore.__contains__  s'    ~~c""w~~d###r'   c                 *   |                      |          }t          j                            |          rQt	          |d          5 }|                                }d d d            n# 1 swxY w Y   |                     |          S t          |          )Nrb)r   rv   rq   r   openreadr   KeyError)r$   r   rq   fhr   s        r&   r2   zDiskStore.__getitem__  s    ~~c""7>>$ 	 dD!! $R''))$ $ $ $ $ $ $ $ $ $ $ $ $ $ $;;w'''3--s   A&&A*-A*c                    |                      |          }|                     |          }	 |dz   t          j                                                    z   }t          |d          }	 |                    |           |                                 t          j	        ||           d S # |                                 t          j	        ||           w xY w# t          $ r Y d S w xY w)N.wb)r   rz   	threadingcurrent_threadgetNamer   writecloseshutilmoveIOError)r$   r   rK   rq   r   tnamefs          r&   r3   zDiskStore.__setitem__  s    ~~c""++e$$		3J!9!;!;!C!C!E!EEEUD!!A)   			E4((((( 			E4(((( 	 	 	DD	s)   ;C (B( =)C (+CC 
C$#C$c                     |                      |          }t          j                            |          rt          j        |           d S d S r?   )r   rv   rq   r   remover   s      r&   r4   zDiskStore.__delitem__-  sD    ~~c""7>>$ 	IdOOOOO	 	r'   c                    t           j                            | j                  sd S t	          j                    }t          j        | j                  D ]}|                     |          }t          j        |          j        }||z
  |k    rHt           j                            |          rt          j
        |           mt          j        |           d S r?   )rv   rq   isdirr   rx   listdirr   statst_atimer   rmtreer   )r$   r   r}   r   rq   atimes         r&   r   zDiskStore.cleanup2  s    w}}TY'' 	FikkDI&& 	$ 	$A>>!$$DGDMM*EU{W$$7==&& $M$''''IdOOO	$ 	$r'   N)r(   r)   r*   r   r#   r   rB   r2   r3   r4   r   r+   r'   r&   r   r      s         "  , , ,
$ $ $         
$ $ $ $ $r'   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Z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                 "    || _         || _        d S r?   )dbtable)r$   r   
table_names      r&   r#   zDBStore.__init__J  s    


r'   c                     | j                             | j        dt                                }t	          t          |                    S Nsession_id=$keywherevars)r   selectr   localsboollist)r$   r   r    s      r&   rB   zDBStore.__contains__N  s6    w~~dj0A~QQDJJr'   c                 t   t           j                                         }	 | j                            | j        dt                                d         }| j                            | j        d|t                                 |                     |j                  S # t          $ r t          |          w xY w)Nr   r   r   )r   r   r   )datetimer}   r   r   r   r   r[   r   r    
IndexErrorr   )r$   r   r}   ss       r&   r2   zDBStore.__getitem__R  s    ##%%	'tz1BRRSTUAGNN
"33VXX     ;;qv&&&  	  	  	 3--	 s   A#B B7c                 D   |                      |                                          }t          j                                        }|| v r2| j                            | j        d||t                                 d S | j                            | j        d|||           d S )Nr   )r   r    r   r   F)rX   r   r    )	rz   r   r   r}   r   r[   r   r   insert)r$   r   rK   r   r}   s        r&   r3   zDBStore.__setitem__^  s     ++e$$++--##%%$;;GNN
'XX       GNN4:uCgNVVVVVr'   c                 b    | j                             | j        dt                                 d S r   )r   deleter   r   r   s     r&   r4   zDBStore.__delitem__o  s)    tz):JJJJJr'   c                     t          j        |dz            }t           j                                         |z
  }| j                            | j        dt                                 d S )Ng     @z$last_allowed_time > atimer   )r   	timedeltar}   r   r   r   r   )r$   r   last_allowed_times      r&   r   zDBStore.cleanupr  s_    $~&
 
 %-1133g=tz)EFHHUUUUUr'   N
r(   r)   r*   r   r#   rB   r2   r3   r4   r   r+   r'   r&   r   r   A  s                   
' 
' 
'W W W"K K KV V V V Vr'   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Z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                     || _         d S r?   shelf)r$   r   s     r&   r#   zShelfStore.__init__  s    


r'   c                     || j         v S r?   r   r   s     r&   rB   zShelfStore.__contains__  s    dj  r'   c                 0    | j         |         \  }}|| |<   |S r?   r   )r$   r   r   vs       r&   r2   zShelfStore.__getitem__  s    :c?qS	r'   c                 @    t          j                     |f| j        |<   d S r?   rx   r   r   s      r&   r3   zShelfStore.__setitem__  s    )++u,
3r'   c                 :    	 | j         |= d S # t          $ r Y d S w xY wr?   )r   r   r   s     r&   r4   zShelfStore.__delitem__  s6    	
3 	 	 	DD	s    
c                 x    t          j                     }| j        D ]}| j        |         \  }}||z
  |k    r| |= d S r?   r   )r$   r   r}   kr   r   s         r&   r   zShelfStore.cleanup  sN    ikk 	 	Az!}HE1U{W$$G	 	r'   Nr   r+   r'   r&   r   r   z  sx           ! ! !  
- - -      r'   r   c                   8    e Zd ZdZd	dZd Zd Zd Zd Z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                     |i }|| _         d S r?   d_store)r$   r   s     r&   r#   zMemoryStore.__init__  s    ?Gr'   c                     || j         v S r?   r   r   s     r&   rB   zMemoryStore.__contains__  s    dl""r'   c                 `    | j         |         \  }}t          j                    |f| j         |<   |S )z/Return the value and update the last seen value)r   rx   )r$   r   trK   s       r&   r2   zMemoryStore.__getitem__  s.    <$5!Y[[%0Sr'   c                 @    t          j                     |f| j        |<   d S r?   )rx   r   r   s      r&   r3   zMemoryStore.__setitem__  s    !Y[[%0Sr'   c                     | j         |= d S r?   r   r   s     r&   r4   zMemoryStore.__delitem__  s    Lr'   c                     t          j                     }g }t          | j                  D ]&\  }\  }}||z
  |k    r|                    |           '|D ]
}| j        |= d S r?   )rx   r   r   append)r$   r   r}   to_delr   r   rK   s          r&   r   zMemoryStore.cleanup  s|    ikk!*4<!8!8 	! 	!A~uU{W$$a     	  	 AQ	  	 r'   r?   r   r+   r'   r&   r   r     s}            
# # #  1 1 1  	  	  	  	  	 r'   r   __main__)'r   r   rv   os.pathr   r   rx   copyr   hashlibr   rn   r   r   r!   
py3helpersr   cPickler   ImportErrorbase64r	   r
   __all__r6   r7   r8   r"   r   rH   r   r   r   r   r   r   r(   doctesttestmodr+   r'   r&   <module>r     s   
  				                                ! ! ! ! ! !   MMMMM , + + + + + + + X
W
W -) ,, ! !
 "A A A A AS] A A A
_ _ _ _ _f _ _ _D% % % % % % % %<J$ J$ J$ J$ J$ J$ J$ J$Z6V 6V 6V 6V 6Ve 6V 6V 6Vr" " " " " " " "J&  &  &  &  & % &  &  & R zNNNGO s   ? 	A
A