chiark / gitweb /
catacomb/pwsafe.py, pwsafe: Make GDBM support conditional.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 24 May 2015 18:32:37 +0000 (19:32 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 16 Jun 2015 10:25:18 +0000 (11:25 +0100)
Only offer the GDBM backend if the module is actually available.  Also,
make the new `flat file' backend be the default, since it's the only one
which is guaranteed to exist.

catacomb/pwsafe.py
pwsafe

index 08e946b7d97d9ac9aa2adb67aae3fbbe49e3e9d5..52bd6babb5702e8a8ce6effbdd432fc7196d5c37 100644 (file)
@@ -33,7 +33,6 @@ import os as _OS
 from cStringIO import StringIO as _StringIO
 
 import catacomb as _C
-import gdbm as _G
 
 ###--------------------------------------------------------------------------
 ### Text encoding utilities.
@@ -485,59 +484,62 @@ class StorageBackend (object):
     me._check_live()
     return me._iter_passwds()
 
-class GDBMStorageBackend (StorageBackend):
-  """
-  My instances store password data in a GDBM database.
+try: import gdbm as _G
+except ImportError: pass
+else:
+  class GDBMStorageBackend (StorageBackend):
+    """
+    My instances store password data in a GDBM database.
 
-  Metadata and password entries are mixed into the same database.  The key
-  for a metadata item is simply its name; the key for a password entry is
-  the entry's label prefixed by `$', since we're guaranteed that no
-  metadata item name begins with `$'.
-  """
+    Metadata and password entries are mixed into the same database.  The key
+    for a metadata item is simply its name; the key for a password entry is
+    the entry's label prefixed by `$', since we're guaranteed that no
+    metadata item name begins with `$'.
+    """
 
-  NAME = 'gdbm'
+    NAME = 'gdbm'
 
-  def _open(me, file, writep):
-    try: me._db = _G.open(file, writep and 'w' or 'r')
-    except _G.error, e: raise StorageBackendRefusal, e
+    def _open(me, file, writep):
+      try: me._db = _G.open(file, writep and 'w' or 'r')
+      except _G.error, e: raise StorageBackendRefusal, e
 
-  def _create(me, file):
-    me._db = _G.open(file, 'n', 0600)
+    def _create(me, file):
+      me._db = _G.open(file, 'n', 0600)
 
-  def _close(me, abruptp):
-    me._db.close()
-    me._db = None
+    def _close(me, abruptp):
+      me._db.close()
+      me._db = None
 
-  def _get_meta(me, name, default):
-    try: return me._db[name]
-    except KeyError: return default
+    def _get_meta(me, name, default):
+      try: return me._db[name]
+      except KeyError: return default
 
-  def _put_meta(me, name, value):
-    me._db[name] = value
+    def _put_meta(me, name, value):
+      me._db[name] = value
 
-  def _del_meta(me, name):
-    del me._db[name]
+    def _del_meta(me, name):
+      del me._db[name]
 
-  def _iter_meta(me):
-    k = me._db.firstkey()
-    while k is not None:
-      if not k.startswith('$'): yield k, me._db[k]
-      k = me._db.nextkey(k)
+    def _iter_meta(me):
+      k = me._db.firstkey()
+      while k is not None:
+        if not k.startswith('$'): yield k, me._db[k]
+        k = me._db.nextkey(k)
 
-  def _get_passwd(me, label):
-    return me._db['$' + label]
+    def _get_passwd(me, label):
+      return me._db['$' + label]
 
-  def _put_passwd(me, label, payload):
-    me._db['$' + label] = payload
+    def _put_passwd(me, label, payload):
+      me._db['$' + label] = payload
 
-  def _del_passwd(me, label):
-    del me._db['$' + label]
+    def _del_passwd(me, label):
+      del me._db['$' + label]
 
-  def _iter_passwds(me):
-    k = me._db.firstkey()
-    while k is not None:
-      if k.startswith('$'): yield k[1:], me._db[k]
-      k = me._db.nextkey(k)
+    def _iter_passwds(me):
+      k = me._db.firstkey()
+      while k is not None:
+        if k.startswith('$'): yield k[1:], me._db[k]
+        k = me._db.nextkey(k)
 
 class PlainTextBackend (StorageBackend):
   """
diff --git a/pwsafe b/pwsafe
index 153ee54b56b55b3856dde83abcdcff01a472e5f9..896d63aae1e9b84003b617f5d3c562f181c5ded9 100644 (file)
--- a/pwsafe
+++ b/pwsafe
@@ -69,7 +69,7 @@ def cmd_create(av):
                         ['cipher=', 'database=', 'mac=', 'hash='])
   except GetoptError:
     return 1
-  dbty = 'gdbm'
+  dbty = 'flat'
   for o, a in opts:
     if o in ('-c', '--cipher'): cipher = a
     elif o in ('-m', '--mac'): mac = a