annotate roundup/backends/sessions_rdbms.py @ 5806:abee2c2c822e

More cgi.escape/html.escape fixes.
author John Rouillard <rouilj@ieee.org>
date Wed, 12 Jun 2019 19:17:37 -0400
parents 62de601bdf6f
children 883c9e90b403
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 """This module defines a very basic store that's used by the CGI interface
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 to store session and one-time-key information.
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 Yes, it's called "sessions" - because originally it only defined a session
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 class. It's now also used for One Time Key handling too.
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 """
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 __docformat__ = 'restructuredtext'
5319
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
8 import os, time, logging
5806
abee2c2c822e More cgi.escape/html.escape fixes.
John Rouillard <rouilj@ieee.org>
parents: 5319
diff changeset
9
abee2c2c822e More cgi.escape/html.escape fixes.
John Rouillard <rouilj@ieee.org>
parents: 5319
diff changeset
10 try:
abee2c2c822e More cgi.escape/html.escape fixes.
John Rouillard <rouilj@ieee.org>
parents: 5319
diff changeset
11 from html import escape
abee2c2c822e More cgi.escape/html.escape fixes.
John Rouillard <rouilj@ieee.org>
parents: 5319
diff changeset
12 except ImportError:
abee2c2c822e More cgi.escape/html.escape fixes.
John Rouillard <rouilj@ieee.org>
parents: 5319
diff changeset
13 from cgi import escape
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 class BasicDatabase:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 ''' Provide a nice encapsulation of an RDBMS table.
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 Keys are id strings, values are automatically marshalled data.
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 '''
5252
0b154486ed38 Make sure that the name property is initialized to none.
John Rouillard <rouilj@ieee.org>
parents: 5213
diff changeset
20 name = None
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 def __init__(self, db):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 self.db = db
5319
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
23 self.conn, self.cursor = self.db.sql_open_connection()
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 def clear(self):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 self.cursor.execute('delete from %ss'%self.name)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27
2169
12cd4fa91eb7 OTK generation was busted (thanks Stuart D. Gathman)
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
28 def exists(self, infoid):
12cd4fa91eb7 OTK generation was busted (thanks Stuart D. Gathman)
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
29 n = self.name
12cd4fa91eb7 OTK generation was busted (thanks Stuart D. Gathman)
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
30 self.cursor.execute('select count(*) from %ss where %s_key=%s'%(n,
12cd4fa91eb7 OTK generation was busted (thanks Stuart D. Gathman)
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
31 n, self.db.arg), (infoid,))
2244
ac4f295499a4 fixed journal marshalling in RDBMS backends [SF#943627]
Richard Jones <richard@users.sourceforge.net>
parents: 2169
diff changeset
32 return int(self.cursor.fetchone()[0])
2169
12cd4fa91eb7 OTK generation was busted (thanks Stuart D. Gathman)
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
33
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 _marker = []
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 def get(self, infoid, value, default=_marker):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 n = self.name
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 self.cursor.execute('select %s_value from %ss where %s_key=%s'%(n,
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 n, n, self.db.arg), (infoid,))
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 res = self.cursor.fetchone()
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 if not res:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 if default != self._marker:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 return default
4585
033a550812fc Fix another XSS with the "otk" parameter.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4570
diff changeset
43 raise KeyError('No such %s "%s"'%(self.name, escape(infoid)))
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 values = eval(res[0])
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 return values.get(value, None)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 def getall(self, infoid):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 n = self.name
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 self.cursor.execute('select %s_value from %ss where %s_key=%s'%(n,
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 n, n, self.db.arg), (infoid,))
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 res = self.cursor.fetchone()
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 if not res:
4585
033a550812fc Fix another XSS with the "otk" parameter.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4570
diff changeset
53 raise KeyError('No such %s "%s"'%(self.name, escape (infoid)))
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 return eval(res[0])
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 def set(self, infoid, **newvalues):
5213
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
57 """ Store all newvalues under key infoid with a timestamp in database.
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
58
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
59 If newvalues['__timestamp'] exists and is representable as a floating point number
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
60 (i.e. could be generated by time.time()), that value is used for the <name>_time
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
61 column in the database.
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
62 """
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 c = self.cursor
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 n = self.name
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 a = self.db.arg
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 c.execute('select %s_value from %ss where %s_key=%s'%(n, n, n, a),
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 (infoid,))
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 res = c.fetchone()
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 if res:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 values = eval(res[0])
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 else:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 values = {}
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 values.update(newvalues)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 if res:
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 sql = 'update %ss set %s_value=%s where %s_key=%s'%(n, n,
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 a, n, a)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 args = (repr(values), infoid)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 else:
5213
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
80 if '__timestamp' in newvalues:
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
81 try:
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
82 # __timestamp must be represntable as a float. Check it.
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
83 timestamp = float(newvalues['__timestamp'])
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
84 except ValueError:
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
85 timestamp = time.time()
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
86 else:
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
87 timestamp = time.time()
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
88
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 sql = 'insert into %ss (%s_key, %s_time, %s_value) '\
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 'values (%s, %s, %s)'%(n, n, n, n, a, a, a)
5213
bf13b28156f3 This change didn't make it into the last commit. Allow the user to
John Rouillard <rouilj@ieee.org>
parents: 4585
diff changeset
91 args = (infoid, timestamp, repr(values))
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 c.execute(sql, args)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93
4390
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
94 def list(self):
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
95 c = self.cursor
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
96 n = self.name
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
97 c.execute('select %s_key from %ss'%(n, n))
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
98 return [res[0] for res in c.fetchall()]
936bd9bf732d session API consistency
Richard Jones <richard@users.sourceforge.net>
parents: 4362
diff changeset
99
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 def destroy(self, infoid):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 self.cursor.execute('delete from %ss where %s_key=%s'%(self.name,
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 self.name, self.db.arg), (infoid,))
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 def updateTimestamp(self, infoid):
3848
7ad206564007 Use """ instead of ''' in comments, or emacs python-mode bails out.
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3606
diff changeset
105 """ don't update every hit - once a minute should be OK """
3606
04dc3eef67b7 reduced frequency of session timestamp update
Richard Jones <richard@users.sourceforge.net>
parents: 2244
diff changeset
106 now = time.time()
04dc3eef67b7 reduced frequency of session timestamp update
Richard Jones <richard@users.sourceforge.net>
parents: 2244
diff changeset
107 self.cursor.execute('''update %ss set %s_time=%s where %s_key=%s
04dc3eef67b7 reduced frequency of session timestamp update
Richard Jones <richard@users.sourceforge.net>
parents: 2244
diff changeset
108 and %s_time < %s'''%(self.name, self.name, self.db.arg,
04dc3eef67b7 reduced frequency of session timestamp update
Richard Jones <richard@users.sourceforge.net>
parents: 2244
diff changeset
109 self.name, self.db.arg, self.name, self.db.arg),
04dc3eef67b7 reduced frequency of session timestamp update
Richard Jones <richard@users.sourceforge.net>
parents: 2244
diff changeset
110 (now, infoid, now-60))
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111
3989
0112e9e1d068 improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents: 3920
diff changeset
112 def clean(self):
0112e9e1d068 improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents: 3920
diff changeset
113 ''' Remove session records that haven't been used for a week. '''
0112e9e1d068 improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents: 3920
diff changeset
114 now = time.time()
0112e9e1d068 improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents: 3920
diff changeset
115 week = 60*60*24*7
0112e9e1d068 improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents: 3920
diff changeset
116 old = now - week
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 self.cursor.execute('delete from %ss where %s_time < %s'%(self.name,
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 self.name, self.db.arg), (old, ))
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119
5319
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
120 def commit(self):
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
121 logger = logging.getLogger('roundup.hyperdb.backend')
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
122 logger.info('commit %s' % self.name)
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
123 self.conn.commit()
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
124 self.cursor = self.conn.cursor()
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
125
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
126 def close(self):
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
127 self.conn.close()
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5252
diff changeset
128
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 class Sessions(BasicDatabase):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 name = 'session'
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 class OneTimeKeys(BasicDatabase):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 name = 'otk'
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134
3920
416606b09b27 fix vim modelines
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3918
diff changeset
135 # vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/