Code

issue2550729: Fix password history display for anydbm backend, thanks to
[roundup.git] / roundup / backends / back_anydbm.py
index 4ea2a2dcdccdc5ad160733de44e8b47b9289327b..233de403cb6d1117e89834ea82e8daa3db14b3aa 100644 (file)
@@ -236,6 +236,8 @@ class Database(FileStorage, hyperdb.Database, roundupdb.Database):
             description="User is allowed to edit "+cn)
         self.security.addPermission(name="View", klass=cn,
             description="User is allowed to access "+cn)
+        self.security.addPermission(name="Retire", klass=cn,
+            description="User is allowed to retire "+cn)
 
     def getclasses(self):
         """Return a list of the names of all existing classes."""
@@ -504,9 +506,7 @@ class Database(FileStorage, hyperdb.Database, roundupdb.Database):
             elif isinstance(prop, hyperdb.Interval) and v is not None:
                 d[k] = date.Interval(v)
             elif isinstance(prop, hyperdb.Password) and v is not None:
-                p = password.Password()
-                p.unpack(v)
-                d[k] = p
+                d[k] = password.Password(encrypted=v)
             else:
                 d[k] = v
         return d
@@ -575,6 +575,21 @@ class Database(FileStorage, hyperdb.Database, roundupdb.Database):
         self.transactions.append((self.doSetJournal, (classname, nodeid,
             journal)))
 
+    def fix_journal(self, classname, journal):
+        """ fix password entries to correct type """
+        pwprops = {}
+        for pn, prop in self.getclass(classname).properties.iteritems():
+            if isinstance(prop, hyperdb.Password):
+                pwprops [pn] = 1
+        if not pwprops:
+            return journal
+        for j in journal:
+            if j[3] == 'set':
+                for k, v in j[4].items():
+                    if k in pwprops:
+                        j[4][k] = password.JournalPassword(j[4][k])
+        return journal
+
     def getjournal(self, classname, nodeid):
         """ get the journal for id
 
@@ -611,7 +626,7 @@ class Database(FileStorage, hyperdb.Database, roundupdb.Database):
                 raise
             if res:
                 # we have unsaved journal entries, return them
-                return res
+                return self.fix_journal (classname, res)
             raise IndexError('no such %s %s'%(classname, nodeid))
         try:
             journal = marshal.loads(db[nodeid])
@@ -619,14 +634,14 @@ class Database(FileStorage, hyperdb.Database, roundupdb.Database):
             db.close()
             if res:
                 # we have some unsaved journal entries, be happy!
-                return res
+                return self.fix_journal (classname, res)
             raise IndexError('no such %s %s'%(classname, nodeid))
         db.close()
 
         # add all the saved journal entries for this node
         for nodeid, date_stamp, user, action, params in journal:
             res.append((nodeid, date.Date(date_stamp), user, action, params))
-        return res
+        return self.fix_journal (classname, res)
 
     def pack(self, pack_before):
         """ Delete all journal entries except "create" before 'pack_before'.
@@ -1300,6 +1315,8 @@ class Class(hyperdb.Class):
                     raise TypeError('new property "%s" not a '
                         'Password'%propname)
                 propvalues[propname] = value
+                journalvalues[propname] = \
+                    current and password.JournalPassword(current)
 
             elif value is not None and isinstance(prop, hyperdb.Date):
                 if not isinstance(value, date.Date):
@@ -1425,23 +1442,6 @@ class Class(hyperdb.Class):
             raise hyperdb.DatabaseError(_('Database open read-only'))
         self.db.destroynode(self.classname, nodeid)
 
-    def history(self, nodeid):
-        """Retrieve the journal of edits on a particular node.
-
-        'nodeid' must be the id of an existing node of this class or an
-        IndexError is raised.
-
-        The returned list contains tuples of the form
-
-            (nodeid, date, tag, action, params)
-
-        'date' is a Timestamp object specifying the time of the change and
-        'tag' is the journaltag specified when the database was opened.
-        """
-        if not self.do_journal:
-            raise ValueError('Journalling is disabled for this class')
-        return self.db.getjournal(self.classname, nodeid)
-
     # Locating nodes:
     def hasnode(self, nodeid):
         """Determine if the given nodeid actually exists
@@ -1744,7 +1744,7 @@ class Class(hyperdb.Class):
                 l.append((OTHER, k, [float(val) for val in v]))
 
         filterspec = l
-        
+
         # now, find all the nodes that are active and pass filtering
         matches = []
         cldb = self.db.getclassdb(cn)
@@ -2028,9 +2028,7 @@ class Class(hyperdb.Class):
             elif isinstance(prop, hyperdb.Interval):
                 value = date.Interval(value)
             elif isinstance(prop, hyperdb.Password):
-                pwd = password.Password()
-                pwd.unpack(value)
-                value = pwd
+                value = password.Password(encrypted=value)
             d[propname] = value
 
         # get a new id if necessary