From: Mark Wooding Date: Sun, 24 May 2015 18:32:37 +0000 (+0100) Subject: catacomb/pwsafe.py, pwsafe: Make GDBM support conditional. X-Git-Tag: 1.1.0~5 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/commitdiff_plain/8501dc39671df3dd7dbbcd4f1788701b80a4511e catacomb/pwsafe.py, pwsafe: Make GDBM support conditional. 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. --- diff --git a/catacomb/pwsafe.py b/catacomb/pwsafe.py index 08e946b..52bd6ba 100644 --- a/catacomb/pwsafe.py +++ b/catacomb/pwsafe.py @@ -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 153ee54..896d63a 100644 --- 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