-import threading, time, pickle, random, os
+import threading, time, pickle, random, os, binascii
from . import cookie, env
__all__ = ["db", "get"]
-def hexencode(str):
- ret = ""
- for byte in str:
- ret += "%02X" % (ord(byte),)
- return ret
-
def gennonce(length):
- nonce = ""
- for i in range(length):
- nonce += chr(random.randint(0, 255))
- return nonce
+ return os.urandom(length)
class session(object):
- def __init__(self, lock, expire = 86400 * 7):
- self.id = hexencode(gennonce(16))
+ def __init__(self, lock, expire=86400 * 7):
+ self.id = binascii.b2a_hex(gennonce(16)).decode("us-ascii")
self.dict = {}
self.lock = lock
self.ctime = self.atime = self.mtime = int(time.time())
def __getitem__(self, key):
return self.dict[key]
- def get(self, key, default = None):
+ def get(self, key, default=None):
return self.dict.get(key, default)
def __setitem__(self, key, value):
return "<session %s>" % self.id
class db(object):
- def __init__(self, backdb = None, cookiename = "wrwsess", path = "/"):
+ def __init__(self, backdb=None, cookiename="wrwsess", path="/"):
self.live = {}
self.cookiename = cookiename
self.path = path
self.cthread.setDaemon(True)
self.cthread.start()
+ def mksession(self, req):
+ return session(threading.RLock())
+
+ def mkcookie(self, req, sess):
+ cookie.add(req, self.cookiename, sess.id,
+ path=self.path,
+ expires=cookie.cdate(time.time() + sess.expire))
+
def fetch(self, req):
now = int(time.time())
sessid = cookie.get(req, self.cookiename)
raise KeyError()
sess = self._fetch(sessid)
except KeyError:
- sess = session(threading.RLock())
+ sess = self.mksession(req)
new = True
def ckfreeze(req):
if sess.dirty():
if new:
- cookie.add(req, self.cookiename, sess.id, self.path)
+ self.mkcookie(req, sess)
with self.lock:
self.live[sess.id] = [sess.lock, sess]
try:
with open(os.path.join(self.path, key), "w") as out:
out.write(value)
-default = env.var(db(backdb = dirback(os.path.join("/tmp", "wrwsess-" + str(os.getuid())))))
+default = env.var(db(backdb=dirback(os.path.join("/tmp", "wrwsess-" + str(os.getuid())))))
def get(req):
return default.val.get(req)