home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import datetime
- import os
-
- try:
- import cPickle as pickle
- except ImportError:
- import pickle
-
- import random
-
- try:
- from hashlib import sha1 as sha
- except ImportError:
- from sha import new as sha
-
- import time
- import threading
- import types
- from warnings import warn
- import cherrypy
- from cherrypy.lib import http
- missing = object()
-
- class Session(object):
- __metaclass__ = cherrypy._AttributeDocstrings
- _id = None
- id_observers = None
- id_observers__doc = "A list of callbacks to which to pass new id's."
- id__doc = 'The current session ID.'
-
- def _get_id(self):
- return self._id
-
-
- def _set_id(self, value):
- self._id = value
- for o in self.id_observers:
- o(value)
-
-
- id = property(_get_id, _set_id, doc = id__doc)
- timeout = 60
- timeout__doc = 'Number of minutes after which to delete session data.'
- locked = False
- locked__doc = '\n If True, this session instance has exclusive read/write access\n to session data.'
- loaded = False
- loaded__doc = '\n If True, data has been retrieved from storage. This should happen\n automatically on the first attempt to access session data.'
- clean_thread = None
- clean_thread__doc = 'Class-level Monitor which calls self.clean_up.'
- clean_freq = 5
- clean_freq__doc = 'The poll rate for expired session cleanup in minutes.'
-
- def __init__(self, id = None, **kwargs):
- self.id_observers = []
- self._data = { }
- for k, v in kwargs.iteritems():
- setattr(self, k, v)
-
- if id is None:
- self.regenerate()
- else:
- self.id = id
- if not self._exists():
- self.id = None
- self.regenerate()
-
-
-
- def regenerate(self):
- if self.id is not None:
- self.delete()
-
- old_session_was_locked = self.locked
- if old_session_was_locked:
- self.release_lock()
-
- self.id = None
- while self.id is None:
- self.id = self.generate_id()
- if self._exists():
- self.id = None
- continue
- if old_session_was_locked:
- self.acquire_lock()
-
-
-
- def clean_up(self):
- pass
-
-
- try:
- os.urandom(20)
- except (AttributeError, NotImplementedError):
-
- def generate_id(self):
- return sha('%s' % random.random()).hexdigest()
-
-
-
- def generate_id(self):
- return os.urandom(20).encode('hex')
-
-
- def save(self):
-
- try:
- if self.loaded:
- t = datetime.timedelta(seconds = self.timeout * 60)
- expiration_time = datetime.datetime.now() + t
- self._save(expiration_time)
- finally:
- if self.locked:
- self.release_lock()
-
-
-
-
- def load(self):
- data = self._load()
- if data is None or data[1] < datetime.datetime.now():
- self._data = { }
- else:
- self._data = data[0]
- self.loaded = True
- cls = self.__class__
- if self.clean_freq and not (cls.clean_thread):
- t = cherrypy.process.plugins.Monitor(cherrypy.engine, self.clean_up, self.clean_freq * 60)
- t.subscribe()
- cls.clean_thread = t
- t.start()
-
-
-
- def delete(self):
- self._delete()
-
-
- def __getitem__(self, key):
- if not self.loaded:
- self.load()
-
- return self._data[key]
-
-
- def __setitem__(self, key, value):
- if not self.loaded:
- self.load()
-
- self._data[key] = value
-
-
- def __delitem__(self, key):
- if not self.loaded:
- self.load()
-
- del self._data[key]
-
-
- def pop(self, key, default = missing):
- if not self.loaded:
- self.load()
-
- if default is missing:
- return self._data.pop(key)
- return self._data.pop(key, default)
-
-
- def __contains__(self, key):
- if not self.loaded:
- self.load()
-
- return key in self._data
-
-
- def has_key(self, key):
- if not self.loaded:
- self.load()
-
- return self._data.has_key(key)
-
-
- def get(self, key, default = None):
- if not self.loaded:
- self.load()
-
- return self._data.get(key, default)
-
-
- def update(self, d):
- if not self.loaded:
- self.load()
-
- self._data.update(d)
-
-
- def setdefault(self, key, default = None):
- if not self.loaded:
- self.load()
-
- return self._data.setdefault(key, default)
-
-
- def clear(self):
- if not self.loaded:
- self.load()
-
- self._data.clear()
-
-
- def keys(self):
- if not self.loaded:
- self.load()
-
- return self._data.keys()
-
-
- def items(self):
- if not self.loaded:
- self.load()
-
- return self._data.items()
-
-
- def values(self):
- if not self.loaded:
- self.load()
-
- return self._data.values()
-
-
-
- class RamSession(Session):
- cache = { }
- locks = { }
-
- def clean_up(self):
- now = datetime.datetime.now()
- for data, expiration_time in self.cache.items():
- if expiration_time < now:
-
- try:
- del self.cache[id]
- except KeyError:
- pass
-
-
- try:
- del self.locks[id]
- except KeyError:
- pass
- except:
- None<EXCEPTION MATCH>KeyError
-
-
- None<EXCEPTION MATCH>KeyError
-
-
-
- def _exists(self):
- return self.id in self.cache
-
-
- def _load(self):
- return self.cache.get(self.id)
-
-
- def _save(self, expiration_time):
- self.cache[self.id] = (self._data, expiration_time)
-
-
- def _delete(self):
- del self.cache[self.id]
-
-
- def acquire_lock(self):
- self.locked = True
- self.locks.setdefault(self.id, threading.RLock()).acquire()
-
-
- def release_lock(self):
- self.locks[self.id].release()
- self.locked = False
-
-
- def __len__(self):
- return len(self.cache)
-
-
-
- class FileSession(Session):
- SESSION_PREFIX = 'session-'
- LOCK_SUFFIX = '.lock'
-
- def __init__(self, id = None, **kwargs):
- kwargs['storage_path'] = os.path.abspath(kwargs['storage_path'])
- Session.__init__(self, id = id, **kwargs)
-
-
- def setup(cls, **kwargs):
- kwargs['storage_path'] = os.path.abspath(kwargs['storage_path'])
- for k, v in kwargs.iteritems():
- setattr(cls, k, v)
-
- lockfiles = _[1]
-
- setup = classmethod(setup)
-
- def _get_file_path(self):
- f = os.path.join(self.storage_path, self.SESSION_PREFIX + self.id)
- if not os.path.abspath(f).startswith(self.storage_path):
- raise cherrypy.HTTPError(400, 'Invalid session id in cookie.')
- os.path.abspath(f).startswith(self.storage_path)
- return f
-
-
- def _exists(self):
- path = self._get_file_path()
- return os.path.exists(path)
-
-
- def _load(self, path = None):
- if path is None:
- path = self._get_file_path()
-
-
- try:
- f = open(path, 'rb')
-
- try:
- return pickle.load(f)
- finally:
- f.close()
-
- except (IOError, EOFError):
- return None
-
-
-
- def _save(self, expiration_time):
- f = open(self._get_file_path(), 'wb')
-
- try:
- pickle.dump((self._data, expiration_time), f)
- finally:
- f.close()
-
-
-
- def _delete(self):
-
- try:
- os.unlink(self._get_file_path())
- except OSError:
- pass
-
-
-
- def acquire_lock(self, path = None):
- if path is None:
- path = self._get_file_path()
-
- path += self.LOCK_SUFFIX
- while True:
-
- try:
- lockfd = os.open(path, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
- except OSError:
- time.sleep(0.1)
- continue
-
- os.close(lockfd)
- break
- self.locked = True
-
-
- def release_lock(self, path = None):
- if path is None:
- path = self._get_file_path()
-
- os.unlink(path + self.LOCK_SUFFIX)
- self.locked = False
-
-
- def clean_up(self):
- now = datetime.datetime.now()
- for fname in os.listdir(self.storage_path):
- if fname.startswith(self.SESSION_PREFIX) and not fname.endswith(self.LOCK_SUFFIX):
- path = os.path.join(self.storage_path, fname)
- self.acquire_lock(path)
-
- try:
- contents = self._load(path)
- if contents is not None:
- (data, expiration_time) = contents
- if expiration_time < now:
- os.unlink(path)
-
- finally:
- self.release_lock(path)
-
- continue
-
-
-
- def __len__(self):
- return [](_[1])
-
-
-
- class PostgresqlSession(Session):
-
- def __init__(self, id = None, **kwargs):
- Session.__init__(self, id, **kwargs)
- self.cursor = self.db.cursor()
-
-
- def setup(cls, **kwargs):
- for k, v in kwargs.iteritems():
- setattr(cls, k, v)
-
- self.db = self.get_db()
-
- setup = classmethod(setup)
-
- def __del__(self):
- if self.cursor:
- self.cursor.close()
-
- self.db.commit()
-
-
- def _exists(self):
- self.cursor.execute('select data, expiration_time from session where id=%s', (self.id,))
- rows = self.cursor.fetchall()
- return bool(rows)
-
-
- def _load(self):
- self.cursor.execute('select data, expiration_time from session where id=%s', (self.id,))
- rows = self.cursor.fetchall()
- if not rows:
- return None
- (pickled_data, expiration_time) = rows[0]
- data = pickle.loads(pickled_data)
- return (data, expiration_time)
-
-
- def _save(self, expiration_time):
- pickled_data = pickle.dumps(self._data)
- self.cursor.execute('update session set data = %s, expiration_time = %s where id = %s', (pickled_data, expiration_time, self.id))
-
-
- def _delete(self):
- self.cursor.execute('delete from session where id=%s', (self.id,))
-
-
- def acquire_lock(self):
- self.locked = True
- self.cursor.execute('select id from session where id=%s for update', (self.id,))
-
-
- def release_lock(self):
- self.cursor.close()
- self.locked = False
-
-
- def clean_up(self):
- self.cursor.execute('delete from session where expiration_time < %s', (datetime.datetime.now(),))
-
-
-
- class MemcachedSession(Session):
- mc_lock = threading.RLock()
- locks = { }
- servers = [
- '127.0.0.1:11211']
-
- def setup(cls, **kwargs):
- for k, v in kwargs.iteritems():
- setattr(cls, k, v)
-
- import memcache
- cls.cache = memcache.Client(cls.servers)
-
- setup = classmethod(setup)
-
- def _exists(self):
- self.mc_lock.acquire()
-
- try:
- return bool(self.cache.get(self.id))
- finally:
- self.mc_lock.release()
-
-
-
- def _load(self):
- self.mc_lock.acquire()
-
- try:
- return self.cache.get(self.id)
- finally:
- self.mc_lock.release()
-
-
-
- def _save(self, expiration_time):
- td = int(time.mktime(expiration_time.timetuple()))
- self.mc_lock.acquire()
-
- try:
- if not self.cache.set(self.id, (self._data, expiration_time), td):
- raise AssertionError('Session data for id %r not set.' % self.id)
- self.cache.set(self.id, (self._data, expiration_time), td)
- finally:
- self.mc_lock.release()
-
-
-
- def _delete(self):
- self.cache.delete(self.id)
-
-
- def acquire_lock(self):
- self.locked = True
- self.locks.setdefault(self.id, threading.RLock()).acquire()
-
-
- def release_lock(self):
- self.locks[self.id].release()
- self.locked = False
-
-
- def __len__(self):
- raise NotImplementedError
-
-
-
- def save():
- if not hasattr(cherrypy.serving, 'session'):
- return None
- if hasattr(cherrypy.request, '_sessionsaved'):
- return None
- cherrypy.request._sessionsaved = True
- if cherrypy.response.stream:
- cherrypy.request.hooks.attach('on_end_request', cherrypy.session.save)
- elif isinstance(cherrypy.response.body, types.GeneratorType):
- cherrypy.response.collapse_body()
-
- cherrypy.session.save()
-
- save.failsafe = True
-
- def close():
- sess = getattr(cherrypy.serving, 'session', None)
- if getattr(sess, 'locked', False):
- sess.release_lock()
-
-
- close.failsafe = True
- close.priority = 90
-
- def init(storage_type = 'ram', path = None, path_header = None, name = 'session_id', timeout = 60, domain = None, secure = False, clean_freq = 5, **kwargs):
- request = cherrypy.request
- if hasattr(request, '_session_init_flag'):
- return None
- request._session_init_flag = True
- id = None
- if name in request.cookie:
- id = request.cookie[name].value
-
- storage_class = storage_type.title() + 'Session'
- storage_class = globals()[storage_class]
- if not hasattr(cherrypy, 'session'):
- if hasattr(storage_class, 'setup'):
- storage_class.setup(**kwargs)
-
-
- kwargs['timeout'] = timeout
- kwargs['clean_freq'] = clean_freq
- cherrypy.serving.session = sess = storage_class(id, **kwargs)
-
- def update_cookie(id):
- cherrypy.response.cookie[name] = id
-
- sess.id_observers.append(update_cookie)
- if not hasattr(cherrypy, 'session'):
- cherrypy.session = cherrypy._ThreadLocalProxy('session')
-
- set_response_cookie(path = path, path_header = path_header, name = name, timeout = timeout, domain = domain, secure = secure)
-
-
- def set_response_cookie(path = None, path_header = None, name = 'session_id', timeout = 60, domain = None, secure = False):
- cookie = cherrypy.response.cookie
- cookie[name] = cherrypy.serving.session.id
- if not path and cherrypy.request.headers.get(path_header):
- pass
- cookie[name]['path'] = '/'
- if timeout:
- cookie[name]['expires'] = http.HTTPDate(time.time() + timeout * 60)
-
- if domain is not None:
- cookie[name]['domain'] = domain
-
- if secure:
- cookie[name]['secure'] = 1
-
-
-
- def expire():
- name = cherrypy.request.config.get('tools.sessions.name', 'session_id')
- one_year = 31536000
- exp = time.gmtime(time.time() - one_year)
- t = time.strftime('%a, %d-%b-%Y %H:%M:%S GMT', exp)
- cherrypy.response.cookie[name]['expires'] = t
-
-