
[PEc           @   s  d  d k  Z  d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k	 Z	 d  d k
 Z
 d  d k Z d  d k Z d  d k Z d  d k Z d Z d Z e Z d Z e i   Z d   Z e   Z e e  a d   Z d   Z e i d	  Z d
   Z d e f d     YZ  d   Z! d   Z" d e  f d     YZ# e Z$ e Z% d Z& d Z' d e  f d     YZ( d Z) d   Z* d   Z+ d   Z, d e  f d     YZ- d d d d d  Z/ d   Z0 d S(    iNt   pysidi   i<   i  c          C   s   t  i t i  o t  i t i  }  n d }  t i t i    } | g } xW t |  d  D]E } | i	   } t i   } | i
 |  | i d  | i |  q^ W| S(   sj    initialize random number generators
    this is key in multithreaded env, see
    python docs for random i
   i   i@B (   t   _apachet	   mpm_queryt   apachet   AP_MPMQ_IS_THREADEDt   AP_MPMQ_MAX_SPARE_THREADSt   randomt   Randomt   timet   ranget   getstatet   setstatet	   jumpaheadt   append(   t   gennumt   gt   resultt   it	   laststate(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt	   _init_rnd*   s    	 c           C   s>   y t  i   SWn) t j
 o t t  a  t  i   Sn Xd  S(   N(   t   rnd_itert   nextt   StopIterationt   itert   rnd_gens(    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   _get_generatorG   s
    c         C   s   t  t i   d  } t i   } t   } | i d d  } | i d d  } |  i i } t i	 d | | | | | f  i
   S(   Ni'  i    iɚ;s
   %d%d%d%d%s(   t   longR   t   ost   getpidR   t   randintt
   connectiont	   remote_ipt   md5t   newt	   hexdigest(   t   reqt   tt   pidR   t   rnd1t   rnd2t   ip(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   _new_sidS   s    	s   [0-9a-f]{32}$c         C   s   t  i |   S(   N(   t   validate_sid_ret   match(   t   sid(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt
   _check_sidp   s    t   BaseSessionc           B   s   e  Z d d d  d d  Z d   Z d   Z d   Z d   Z d   Z d   Z	 d	   Z
 d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   i   i    c   	   	   C   sb  | | | |  _  |  _ |  _ | |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 t
 i |   | i   } | i d  o | i d t  } n | i d t  } |  i ph | o4 t i | | d t i d |  i d t i i } n t i | |  } | o | i |  _ qn |  i o< t |  i  p( | o t d |   qad  |  _ qen |  i   |  i o( |  i   |  i   o d |  _ qn |  i o} |  i o |  i   n t |  i   |  _ |  i   t i |  i  |  i    t i   |  _ | o | |  _ q(t  |  _ n t i   |  _ t! i" d t#  d j o |  i$   n d  S(	   Ni   i    s   mod_python.session.cookie_namet   session_cookie_namet   Classt   secrett   mismatchs   Invalid Session ID: sid=%s(%   t   _reqt   _sidt   _secrett   _lockt   _newt   _createdt	   _accessedt   _timeoutt   _lockedt   _invalidt   dictt   __init__t   get_optionst   has_keyt   gett   COOKIE_NAMEt   Cookiet
   get_cookiet   SignedCookiet   IGNOREt   valueR-   t
   ValueErrort   Nonet	   init_lockt   lockt   loadt   unlockR)   t
   add_cookiet   make_cookieR   t   DFT_TIMEOUTR   R   t   CLEANUP_CHANCEt   cleanup(	   t   selfR#   R,   R1   RK   t   timeoutt   configR/   t   cookie(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR>      sZ    							
		





 
c         C   sf  |  i  i   } | i d  o | i d t  } n | i d t  } |  i o" t i | |  i d |  i } n t i | |  i  } | i d  o | d | _	 n | i d  o | d | _
 n | i d  o | d | _
 nx |  i  i i } | o& |  i  i   } | t |  | _
 n
 d | _
 | i
 p |  i  i i | i
  o d | _
 n | S(   Ns   mod_python.session.cookie_nameR/   R1   s%   mod_python.session.application_domains#   mod_python.session.application_patht   ApplicationPatht   /(   R3   R?   R@   RA   RB   R5   RC   RE   R4   t   domaint   patht   hlistt	   directoryt   document_roott   lent   urit
   startswith(   RS   RU   R/   t   ct   dirpatht   docroot(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRO      s,    
	%c         C   s?   |  i    } d | _ t i |  i |  |  i   d |  _ d  S(   Ni    i   (   RO   t   expiresRC   RN   R3   t   deleteR<   (   RS   Ra   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt
   invalidate   s
    	
c         C   s   |  i    } | d  j o d Sn t i   | d | d j o d Sn | d |  _ | d |  _ | d |  _ |  i | d  d S(   Ni    R9   R:   R8   t   _datai   (   t   do_loadRI   R   R8   R9   R:   t   update(   RS   R=   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRL      s    c         C   sX   |  i  pJ h  |  i   d <|  i d <|  i d <|  i d <} |  i |  n d  S(   NRg   R8   R9   R:   (   R<   t   copyR8   R9   R:   t   do_save(   RS   R=   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   save  s    
c         C   s   |  i    |  i   d  S(   N(   t	   do_deletet   clear(   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRe     s    
c         C   s   d  S(   N(    (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRJ     s    c         C   sG   |  i  o9 t i |  i i |  i  d |  _ |  i i t |   n d  S(   Ni   (	   R6   R   t   _global_lockR3   t   serverR4   R;   t   register_cleanupt   unlock_session_cleanup(   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRK     s    
	c         C   s>   |  i  o0 |  i o& t i |  i i |  i  d |  _ n d  S(   Ni    (   R6   R;   R   t   _global_unlockR3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRM     s    c         C   s	   |  i  S(   N(   R7   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   is_new!  s    c         C   s   |  i  S(   N(   R4   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   id$  s    c         C   s   |  i  S(   N(   R8   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   created'  s    c         C   s   |  i  S(   N(   R9   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   last_accessed*  s    c         C   s   |  i  S(   N(   R:   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRT   -  s    c         C   s   | |  _  d  S(   N(   R:   (   RS   t   secs(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   set_timeout0  s    c         C   s   |  i    d  S(   N(   t
   do_cleanup(   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRR   3  s    c         C   s   |  i    d  S(   N(   RM   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   __del__6  s    N(   t   __name__t
   __module__RI   R>   RO   Rf   RL   Rl   Re   RJ   RK   RM   Rt   Ru   Rv   Rw   RT   Ry   RR   R{   (    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR.   }   s$   	I	)														c         C   s   |  i    d  S(   N(   RM   (   t   sess(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRr   9  s    c   	      C   s1  |  \ } } t  i | d  d  t i | d  } z g  } | i   } x | \ } } t i |  } y4 t i   | d | d j o | i	 |  n Wn  t
 j
 o | i	 |  n Xy | i   } WqI t
 j
 o PqI XqI x# | D] } y | | =Wq q Xq WWd  | i   t  i | d  d  Xd  S(   Ni    Ra   R9   R:   (   R   Ro   RI   t   anydbmt   opent   firstt   cPicklet   loadsR   R   t   KeyErrorR   t   closeRs   (	   t   datat   dbmRp   t   dbt   oldt   st   keyt   valR=   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   dbm_cleanup?  s4     	  
t
   DbmSessionc           B   sY   e  Z d	 d  d	 e d  d d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(
   i    i   c   	      C   s  | p | i    } | i d  o | d } q | i d  o | d } q | i d  o% t i i | i d t  d  } q | i d  o% t i i | i d t  d  } q t i i | i d t  d  } n | |  _ | |  _ t	 i
 |  | d | d | d	 | d
 | d  S(   Ns(   mod_python.dbm_session.database_filenamet   session_dbms)   mod_python.dbm_session.database_directorys   mp_sess.dbms%   mod_python.session.database_directoryt   session_directoryR,   R1   RT   RK   (   R?   R@   R   RZ   t   joinRA   t   tempdirt   _dbmfilet   _dbmtypeR.   R>   (	   RS   R#   R   R,   R1   t   dbmtypeRT   RK   t   opts(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR>   \  s    %%%		c         C   s0   t  i  |  i  } | o t |  |  _ n d  S(   N(   t   whichdbR   t
   __import__R   (   RS   t   module(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   _set_dbm_typev  s    c         C   sN   |  i  i |  i d t i t i Bt i B } |  i  t j o |  i   n | S(   NRa   (	   R   R   R   t   statt   S_IRUSRt   S_IWUSRt   S_IRGRPR   R   (   RS   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   _get_dbm{  s    ,c         C   sB   |  i  |  i i g } |  i i t |  |  i i d t i  d  S(   Ns(   DbmSession: registered database cleanup.(   R   R3   Rp   Rq   R   t	   log_errorR   t   APLOG_NOTICE(   RS   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRz     s    c         C   s   t  i |  i i d  d  |  i   } z3 | i |  i  o t i	 | |  i  Sn d  SWd  | i
   t  i |  i i d  d  Xd  S(   Ni    (   R   Ro   R3   Rp   RI   R   R@   R4   R   R   R   Rs   (   RS   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRh     s    
c         C   sj   t  i |  i i d  d  |  i   } z t i |  | |  i <Wd  | i	   t  i
 |  i i d  d  Xd  S(   Ni    (   R   Ro   R3   Rp   RI   R   R   t   dumpsR4   R   Rs   (   RS   R=   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRk     s    
c         C   sx   t  i |  i i d  d  |  i   } z( y | |  i =Wn t j
 o n XWd  | i   t  i	 |  i i d  d  Xd  S(   Ni    (
   R   Ro   R3   Rp   RI   R   R4   R   R   Rs   (   RS   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRm     s     	
N(   R|   R}   RI   R   R>   R   R   Rz   Rh   Rk   Rm   (    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR   Z  s   						i   i   t   FileSessionc           B   sY   e  Z d  d
 d  d d d d  Z d   Z d   Z d   Z d   Z d   Z d	   Z	 RS(   i    i   ic   	      C   sE  | i    } | d j oN | i d  o t | i d t   |  _ qp t | i d t   |  _ n
 | |  _ | d j oN | i d  o t | i d t   |  _ q t | i d t   |  _ n
 | |  _ | i d  o t | i d t	   |  _
 n t | i d t	   |  _
 | i d  o t | i d t   |  _ n t | i d	 t   |  _ | i d
  o( t i i | i d
 t  d  |  _ n] | i d  o( t i i | i d t  d  |  _ n% t i i | i d t  d  |  _ | o | |  _ n
 t |  _ t i |  | d | d | d | d | d  S(   Nis+   mod_python.file_session.enable_fast_cleanupt   session_fast_cleanups.   mod_python.file_session.verify_session_timeoutt   session_verify_cleanups,   mod_python.file_session.cleanup_grace_periodt   session_grace_periods*   mod_python.file_session.cleanup_time_limitt   session_cleanup_time_limits*   mod_python.file_session.database_directoryt   mp_sesss%   mod_python.session.database_directoryR   R,   R1   RT   RK   (   R?   R@   t   true_or_falseRA   t   DFT_FAST_CLEANUPt   _fast_cleanupt   DFT_VERIFY_CLEANUPt   _verify_cleanupt   intt   DFT_GRACE_PERIODt   _grace_periodt   DFT_CLEANUP_TIME_LIMITt   _cleanup_time_limitR   RZ   R   R   t   _sessdirt   _cleanup_timeoutRP   R.   R>   (	   RS   R#   R,   R1   RT   RK   t   fast_cleanupt   verify_cleanupR   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR>     s6    		(($	c         C   s   h  |  i  d <|  i d <|  i d <|  i d <|  i d <|  i d <|  i d <} |  i  i t |  |  i  i	 d t
 i  d  S(	   NR#   t   sessdirR   R   RT   t   grace_periodt   cleanup_time_limits,   FileSession: registered filesession cleanup.(   R3   R   R   R   R   R   R   Rq   t   filesession_cleanupR   R   R   (   RS   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRz     s    c         C   s  |  i    z y t i i |  i |  i d d ! } t i i | |  i  } t | d  } zJ t i |  } t	 i	   | d | d j o t i
 | d   n | SWd  | i   XWnG t i   } t i d |  | i   } |  i i d |  d  Sn XWd  |  i   Xd  S(   Ni    i   t   rbR9   R:   t   files"   Error while loading a session : %s(   t	   lock_fileR   RZ   R   R   R4   R   R   RL   R   t   utimeRI   R   t	   cStringIOt   StringIOt	   tracebackt	   print_exct   getvalueR3   R   t   unlock_file(   RS   RZ   t   filenamet   fpR   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRh     s&    
"c         C   s   |  i    z y t i i |  i |  i d d ! } t i i |  p t |  i  n t i i | |  i  } t | d  } z t	 i
 | | d  Wd  | i   XWnC t i   } t i d |  | i   } |  i i d |  n XWd  |  i   Xd  S(   Ni    i   t   wbR   s!   Error while saving a session : %s(   R   R   RZ   R   R   R4   t   existst   make_filesession_dirsR   R   t   dumpR   R   R   R   R   R   R3   R   R   (   RS   R=   RZ   R   R   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRk     s"    
"c         C   s   |  i    ze yK t i i |  i |  i d d ! } t i i | |  i  } t i |  Wn t j
 o n XWd  |  i   Xd  S(   Ni    i   (	   R   R   RZ   R   R   R4   t   unlinkt	   ExceptionR   (   RS   RZ   R   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRm   (  s    
"	c         C   s4   |  i  p& t i |  i i |  i  d |  _  n d  S(   Ni   (   R;   R   Ro   R3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR   4  s    
c         C   s?   |  i  o1 |  i o& t i |  i i |  i  d |  _  n d  S(   Ni    (   R;   R6   R   Rs   R3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR   <  s    N(
   R|   R}   RI   R>   Rz   Rh   Rk   Rm   R   R   (    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR     s   8					s   MPFS_3.2c          C   s  |  d } |  d } |  d } |  d } |  d } |  d } |  d } | i  d | | f t i  t i i | d	  } y* t i | t i t i Bt i	 Bd
  }	 Wnk t i
 |  i }
 |
 t i   d j  o$ | i  d t i  t i |  n | i  d t i  d  Sn Xy t t i i | d  d  } | i   } | i   | i t  p t d  n | i   } | d } t | d  } t | d  } t | d  } t | d  } Wn% t } d } d } d } d } n Xzt i   } t i |  } t d d  | } x| D]} d | d | f } t i i |  p qn t i |  } | t |  7} xJ| D]B} y t i i | |  } | o8 t i
 |  i } t i   | | | j  o wuqn | o | o
 t } na zR t |  } t i |  } t i   | d | d | j o
 t } n t } Wd  | i   X| o t i |  | d 7} n Wqut  i!   } t" i# d |  | i$   } | i  d | t i  quXquW| d d } t i   | } | d j o | | j o PqqW| t i   | 7} | d j o6 | i  d | | | f t i  d } d } d } n | i  d | f t i  t t i i | d  d   } | i% d! | | | | | f  | i   y t i |  Wn n XWd  t i |	  Xd  S("   NR#   R   R   R   RT   R   R   s-   FileSession cleanup: (fast=%s, verify=%s) ...s   .mp_sess.lcki  i  s7   FileSession cleanup: stale lockfile found - deleting its7   FileSession cleanup: another process is already runnings   fs_status.txtt   rs   wrong status file versioni    i   i   i   i   g        i   s   %s/%ss   %02xR9   R:   R   s   FileSession cleanup error: %ss5   FileSession cleanup: deleted %d of %d in %.4f secondssJ   FileSession cleanup incomplete: next cleanup will start at index %d (%02x)t   ws   %s %d %d %d %f
(&   R   R   R   R   RZ   R   R   t   O_CREATt   O_EXCLt   O_WRONLYR   t   st_mtimeR   t   removeR   t   readlineR   R`   t   FS_STAT_VERSIONR   t   splitR   t   floatt   listdirR	   R   R^   t   TrueR   RL   t   FalseR   R   R   R   R   R   t   write(    R   R#   R   R   R   RT   R   R   t   lockfilet   lockfpt   mtimet   status_filet   dt   partst   stat_versiont   next_it   expired_file_countt   total_file_countt
   total_timet
   start_timet   filelistt	   dir_indexR   RZ   t   fR   t   accessedt   delete_sessionR   R=   R   t	   time_used(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR   B  s    






	

*	
	



  
#

			

	
 
c         C   so   xh t  d d  D]W } t i i |  d |  } t i i |  p% t i | t i t i Bt i	 B q q Wd S(   s>   Creates the directory structure used for storing session filesi    i   s   %02xN(
   R	   R   RZ   R   R   t   makedirsR   t   S_IRWXUR   t   S_IXGRP(   t   sess_dirR   RZ   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR     s
     c         C   s]   xV |  i    D]H } y8 |  | } t i   | d | d j o |  | =n Wq q Xq Wd  S(   NR9   R:   (   t   keysR   (   t   sdictR,   t   session(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   mem_cleanup  s     
t   MemorySessionc           B   sG   e  Z h  Z d  d d  d d  Z d   Z d   Z d   Z d   Z RS(   i    i   c         C   s,   t  i |  | d | d | d | d | d  S(   NR,   R1   RT   RK   (   R.   R>   (   RS   R#   R,   R1   RT   RK   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR>     s    c         C   s0   |  i  i t t i  |  i  i d t i  d  S(   Ns*   MemorySession: registered session cleanup.(   R3   Rq   R   R   R   R   R   R   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRz     s    c         C   s,   t  i i |  i  o t  i |  i Sn d  S(   N(   R   R   R@   R4   RI   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRh     s    c         C   s   | t  i |  i <d  S(   N(   R   R   R4   (   RS   R=   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRk     s    c         C   s+   y t  i |  i =Wn t j
 o n Xd  S(   N(   R   R   R4   R   (   RS   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyRm     s     N(	   R|   R}   R   RI   R>   Rz   Rh   Rk   Rm   (    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR     s   			i    i   c      
   C   s  |  i    } | i d  o | d } n | i d  o | d } nc t i t i  } t i t i  } t i t i  }	 | o | p |	 d j o
 d } n d } | d j o
 t }
 n< | d j o
 t	 }
 n% | d j o
 t
 }
 n t d |  |
 |  d | d	 | d
 | d | S(   Ns   mod_python.session.session_typeR   i   R   R   R   s   Unknown session type %sR,   R1   RT   RK   (   R?   R@   R   R   R   R   t   AP_MPMQ_IS_FORKEDt   AP_MPMQ_MAX_DAEMONSR   R   R   R   (   R#   R,   R1   RT   RK   R   t	   sess_typet   threadedt   forkedt   daemonsR~   (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyt   Session  s(    



c      
   C   so   y |  i    }  Wn n X|  d d d d t g j o t Sn. |  d d d d d	 t g j o t Sn t  d	 S(
   sj   This function is used to assist in getting appropriate
    values set with the PythonOption directive
    t   yest   truet   1i   t   not   falset   0i    N(   t   lowerR   RI   R   R   (   t   item(    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pyR   '  s    i  (1   R   RC   R   R   R   R   R   R   R   R    R   R   t   tempfileR   t   reRB   RP   R   t   DFT_LOCKRQ   t
   gettempdirR   R   R   R   R   R   R)   t   compileR*   R-   R=   R.   Rr   R   R   R   R   R   R   R   R   R   R   R   R   RI   R   R   (    (    (    s6   /usr/lib/python2.5/site-packages/mod_python/Session.pys   <module>   sN   							P		
		%