1
2
3
4
5
6
7 """Base class for SharedKeyDB and VerifierDB."""
8
9 try:
10 import anydbm
11 except ImportError:
12
13 import dbm as anydbm
14 import threading
15
18 self.type = type
19 self.filename = filename
20 if self.filename:
21 self.db = None
22 else:
23 self.db = {}
24 self.lock = threading.Lock()
25
27 """Create a new on-disk database.
28
29 @raise anydbm.error: If there's a problem creating the database.
30 """
31 if self.filename:
32 self.db = anydbm.open(self.filename, "n")
33 self.db["--Reserved--type"] = self.type
34 self.db.sync()
35 else:
36 self.db = {}
37
39 """Open a pre-existing on-disk database.
40
41 @raise anydbm.error: If there's a problem opening the database.
42 @raise ValueError: If the database is not of the right type.
43 """
44 if not self.filename:
45 raise ValueError("Can only open on-disk databases")
46 self.db = anydbm.open(self.filename, "w")
47 try:
48 if self.db["--Reserved--type"] != self.type:
49 raise ValueError("Not a %s database" % self.type)
50 except KeyError:
51 raise ValueError("Not a recognized database")
52
54 if self.db == None:
55 raise AssertionError("DB not open")
56
57 self.lock.acquire()
58 try:
59 valueStr = self.db[username]
60 finally:
61 self.lock.release()
62
63 return self._getItem(username, valueStr)
64
66 if self.db == None:
67 raise AssertionError("DB not open")
68
69 valueStr = self._setItem(username, value)
70
71 self.lock.acquire()
72 try:
73 self.db[username] = valueStr
74 if self.filename:
75 self.db.sync()
76 finally:
77 self.lock.release()
78
80 if self.db == None:
81 raise AssertionError("DB not open")
82
83 self.lock.acquire()
84 try:
85 del(self.db[username])
86 if self.filename:
87 self.db.sync()
88 finally:
89 self.lock.release()
90
92 """Check if the database contains the specified username.
93
94 @type username: str
95 @param username: The username to check for.
96
97 @rtype: bool
98 @return: True if the database contains the username, False
99 otherwise.
100
101 """
102 if self.db == None:
103 raise AssertionError("DB not open")
104
105 self.lock.acquire()
106 try:
107 return username in self.db
108 finally:
109 self.lock.release()
110
111 - def check(self, username, param):
114
116 """Return a list of usernames in the database.
117
118 @rtype: list
119 @return: The usernames in the database.
120 """
121 if self.db == None:
122 raise AssertionError("DB not open")
123
124 self.lock.acquire()
125 try:
126 usernames = self.db.keys()
127 finally:
128 self.lock.release()
129 usernames = [u for u in usernames if not u.startswith("--Reserved--")]
130 return usernames
131