
[PEc           @   s  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 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 Z d  d l Z d Z d Z e Z d Z e j   Z d   Z e   Z e e  a d   Z d   Z e j 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  j t j  r' t  j t j  }  n d }  t j t j    } | g } xW t |  d  D]E } | j	   } t j   } | j
 |  | j d  | j |  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.7/dist-packages/mod_python/Session.pyt	   _init_rnd*   s    	c           C   s9   y t  j   SWn$ t k
 r4 t t  a  t  j   SXd  S(   N(   t   rnd_itert   nextt   StopIterationt   itert   rnd_gens(    (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   _get_generatorG   s
    c         C   s   t  t j   d  } t j   } t   } | j d d  } | j d d  } |  j j } t j	 d | | | | | f  j
   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.7/dist-packages/mod_python/Session.pyt   _new_sidS   s    	s   [0-9a-f]{32}$c         C   s   t  j |   S(   N(   t   validate_sid_ret   match(   t   sid(    (    s6   /usr/lib/python2.7/dist-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   sH  | | | |  _  |  _ |  _ | |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 t
 j |   | j   } | j d  r | j d t  } n | j d t  } |  j s| r t j | | d t j d |  j d t j j } n t j | |  } | r| j |  _ qn  |  j rWt |  j  sW| rHt d |   qTd  |  _ qWn  |  j   |  j r|  j   |  j   rd |  _ qn  |  j r|  j r|  j   n  t |  j   |  _ |  j   t j |  j  |  j    t j   |  _ | r| |  _ qt  |  _ n  t j   |  _ t! j" d t#  d k rD|  j$   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.7/dist-packages/mod_python/Session.pyR>      sZ    											
	
		 
c         C   sW  |  j  j   } | j d  r3 | j d t  } n | j d t  } |  j ro t j | |  j d |  j } n t j | |  j  } | j d  r | d | _	 n  | j d  r | d | _
 n | j d  r | d | _
 nr |  j  j j } | r|  j  j   } | t |  | _
 n	 d | _
 | j
 sG|  j  j j | j
  rS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.7/dist-packages/mod_python/Session.pyRO      s,    		#c         C   s?   |  j    } d | _ t j |  j |  |  j   d |  _ d  S(   Ni    i   (   RO   t   expiresRC   RN   R3   t   deleteR<   (   RS   Ra   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt
   invalidate   s
    	
c         C   sz   |  j    } | d  k r d St j   | d | d k r> d S| d |  _ | d |  _ | d |  _ |  j | d  d S(   Ni    R9   R:   R8   t   _datai   (   t   do_loadRI   R   R8   R9   R:   t   update(   RS   R=   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRL      s    c         C   sN   |  j  sJ i |  j   d 6|  j d 6|  j d 6|  j d 6} |  j |  n  d  S(   NRg   R8   R9   R:   (   R<   t   copyR8   R9   R:   t   do_save(   RS   R=   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   save  s    	

c         C   s   |  j    |  j   d  S(   N(   t	   do_deletet   clear(   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRe     s    
c         C   s   d  S(   N(    (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRJ     s    c         C   sE   |  j  rA t j |  j j |  j  d |  _ |  j j t |   n  d  S(   Ni   (	   R6   R   t   _global_lockR3   t   serverR4   R;   t   register_cleanupt   unlock_session_cleanup(   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRK     s    		c         C   s;   |  j  r7 |  j r7 t j |  j j |  j  d |  _ n  d  S(   Ni    (   R6   R;   R   t   _global_unlockR3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRM     s    c         C   s	   |  j  S(   N(   R7   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   is_new!  s    c         C   s   |  j  S(   N(   R4   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   id$  s    c         C   s   |  j  S(   N(   R8   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   created'  s    c         C   s   |  j  S(   N(   R9   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   last_accessed*  s    c         C   s   |  j  S(   N(   R:   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRT   -  s    c         C   s   | |  _  d  S(   N(   R:   (   RS   t   secs(    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   set_timeout0  s    c         C   s   |  j    d  S(   N(   t
   do_cleanup(   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRR   3  s    c         C   s   |  j    d  S(   N(   RM   (   RS   (    (    s6   /usr/lib/python2.7/dist-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.7/dist-packages/mod_python/Session.pyR.   }   s$   	I	)														c         C   s   |  j    d  S(   N(   RM   (   t   sess(    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRr   9  s    c   	      C   s+  |  \ } } t  j | d  d  t j | d  } z g  } | j   } x | \ } } t j |  } y2 t j   | d | d k r | j	 |  n  Wn t
 k
 r | j	 |  n Xy | j   } WqI t
 k
 r PqI XqI x# | D] } y | | =Wq q Xq WWd  | j   t  j | 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.7/dist-packages/mod_python/Session.pyt   dbm_cleanup?  s2      
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  | s | j    } | j d  r. | d } q | j d  rJ | d } q | j d  r} t j j | j d t  d  } q | j d  r t j j | j d t  d  } q t j j | j d t  d  } n  | |  _ | |  _ t	 j
 |  | 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.7/dist-packages/mod_python/Session.pyR>   \  s    $$$		c         C   s.   t  j  |  j  } | r* t |  |  _ n  d  S(   N(   t   whichdbR   t
   __import__R   (   RS   t   module(    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   _set_dbm_typev  s    c         C   sL   |  j  j |  j d t j t j Bt j B } |  j  t k rH |  j   n  | S(   NRa   (	   R   R   R   t   statt   S_IRUSRt   S_IWUSRt   S_IRGRPR   R   (   RS   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   _get_dbm{  s    ,c         C   sB   |  j  |  j j g } |  j j t |  |  j j d t j  d  S(   Ns(   DbmSession: registered database cleanup.(   R   R3   Rp   Rq   R   t	   log_errorR   t   APLOG_NOTICE(   RS   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRz     s    c         C   s~   t  j |  j j d  d  |  j   } z. | j |  j  rN t j	 | |  j  Sd  SWd  | j
   t  j |  j j d  d  Xd  S(   Ni    (   R   Ro   R3   Rp   RI   R   R@   R4   R   R   R   Rs   (   RS   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRh     s    
c         C   sj   t  j |  j j d  d  |  j   } z t j |  | |  j <Wd  | j	   t  j
 |  j j d  d  Xd  S(   Ni    (   R   Ro   R3   Rp   RI   R   R   t   dumpsR4   R   Rs   (   RS   R=   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRk     s    
c         C   sv   t  j |  j j d  d  |  j   } z& y | |  j =Wn t k
 rI n XWd  | j   t  j	 |  j j d  d  Xd  S(   Ni    (
   R   Ro   R3   Rp   RI   R   R4   R   R   Rs   (   RS   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRm     s     
N(   R|   R}   RI   R   R>   R   R   Rz   Rh   Rk   Rm   (    (    (    s6   /usr/lib/python2.7/dist-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   s3  | j    } | d k rc | j d  rE t | j d t   |  _ ql t | j d t   |  _ n	 | |  _ | d k r | j d  r t | j d t   |  _ q t | j d t   |  _ n	 | |  _ | j d  r t | j d t	   |  _
 n t | j d t	   |  _
 | j d  rAt | j d t   |  _ n t | j d	 t   |  _ | j d
  rt j j | j d
 t  d  |  _ nZ | j d  rt j j | j d t  d  |  _ n$ t j j | j d t  d  |  _ | r| |  _ n	 t |  _ t j |  | 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.7/dist-packages/mod_python/Session.pyR>     s6    		''$	c         C   sy   i |  j  d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6} |  j  j t |  |  j  j	 d t
 j  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.7/dist-packages/mod_python/Session.pyRz     s    




c         C   s
  |  j    z y t j j |  j |  j d d ! } t j j | |  j  } t | d  } zH t j |  } t	 j	   | d | d k r t j
 | d   n  | SWd  | j   XWnD t j   } t j d |  | j   } |  j j d |  d  SXWd  |  j   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.7/dist-packages/mod_python/Session.pyRh     s&    
"	c         C   s   |  j    z y t j j |  j |  j d d ! } t j j |  sT t |  j  n  t j j | |  j  } t | d  } z t	 j
 | | d  Wd  | j   XWnC t j   } t j d |  | j   } |  j j d |  n XWd  |  j   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.7/dist-packages/mod_python/Session.pyRk     s"    
"c         C   s   |  j    zc yK t j j |  j |  j d d ! } t j j | |  j  } t j |  Wn t k
 rk n XWd  |  j   Xd  S(   Ni    i   (	   R   R   RZ   R   R   R4   t   unlinkt	   ExceptionR   (   RS   RZ   R   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRm   (  s    
"c         C   s2   |  j  s. t j |  j j |  j  d |  _  n  d  S(   Ni   (   R;   R   Ro   R3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyR   4  s    	c         C   s<   |  j  r8 |  j r8 t j |  j j |  j  d |  _  n  d  S(   Ni    (   R;   R6   R   Rs   R3   Rp   R4   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyR   <  s    N(
   R|   R}   RI   R>   Rz   Rh   Rk   Rm   R   R   (    (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyR     s   8					s   MPFS_3.2c          C   s  |  d } |  d } |  d } |  d } |  d } |  d } |  d } | j  d | | f t j  t j j | d	  } y* t j | t j t j Bt j	 Bd
  }	 Wnf t j
 |  j }
 |
 t j   d k  r | j  d t j  t j |  n | j  d t j  d  SXy t t j j | d  d  } | j   } | j   | j t  s]t d  n  | j   } | d } t | d  } t | d  } t | d  } t | d  } Wn% t } d } d } d } d } n Xzt j   } t j |  } t d d  | } x| D]} d | d | f } t j j |  sFqn  t j |  } | t |  7} x?| D]7} y t j j | |  } | rt j
 |  j } t j   | | | k  rwlqn  | r| rt } n^ zP t |  } t j |  } t j   | d | d | k r$t } n t } Wd  | j   X| rYt j |  | d 7} n  Wqlt  j!   } t" j# d |  | j$   } | j  d | t j  qlXqlW| d d } t j   | } | d k r| | k rPqqW| t j   | 7} | d k r:| j  d | | | f t j  d } d } d } n | j  d | f t j  t t j j | d  d   } | j% d! | | | | | f  | j   y t j |  Wn n XWd  t j |	  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.7/dist-packages/mod_python/Session.pyR   B  s    






	

*	
	



		"	
		
		
 
c         C   sm   xf t  d d  D]U } t j j |  d |  } t j j |  s t j | t j t j Bt j	 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.7/dist-packages/mod_python/Session.pyR     s    c         C   s[   xT |  j    D]F } y6 |  | } t j   | d | d k rH |  | =n  Wq q Xq Wd  S(   NR9   R:   (   t   keysR   (   t   sdictR,   t   session(    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyt   mem_cleanup  s    
t   MemorySessionc           B   sG   e  Z i  Z d  d d  d d  Z d   Z d   Z d   Z d   Z RS(   i    i   c         C   s,   t  j |  | d | d | d | d | d  S(   NR,   R1   RT   RK   (   R.   R>   (   RS   R#   R,   R1   RT   RK   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyR>     s    c         C   s0   |  j  j t t j  |  j  j d t j  d  S(   Ns*   MemorySession: registered session cleanup.(   R3   Rq   R   R   R   R   R   R   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRz     s    c         C   s'   t  j j |  j  r# t  j |  j Sd  S(   N(   R   R   R@   R4   RI   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRh     s    c         C   s   | t  j |  j <d  S(   N(   R   R   R4   (   RS   R=   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRk     s    c         C   s)   y t  j |  j =Wn t k
 r$ n Xd  S(   N(   R   R   R4   R   (   RS   (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyRm     s     N(	   R|   R}   R   RI   R>   Rz   Rh   Rk   Rm   (    (    (    s6   /usr/lib/python2.7/dist-packages/mod_python/Session.pyR     s   			i    i   c      
   C   s  |  j    } | j d  r( | d } nz | j d  rD | d } n^ t j t j  } t j t j  } t j t j  }	 | r | s |	 d k r d } n d } | d k r t }
 n7 | d k r t	 }
 n" | d k r 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.7/dist-packages/mod_python/Session.pyt   Session  s(    				c         C   se   y |  j    }  Wn n X|  d d d d t g k r9 t S|  d d d d d	 t g k r[ t St  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.7/dist-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.7/dist-packages/mod_python/Session.pyt   <module>   sN   							P		
		%