summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-09-06 19:59:10 +0100
committerLars Wirzenius <liw@liw.fi>2013-09-06 19:59:10 +0100
commit02e1087c4c29fe18c6a8d8af27cca75d7bd8be5c (patch)
tree07bc3f4165b1169ef72d37ec8c00c95a028d1889
parent2a3a1e574f5be7161f147f65912d428768e4739f (diff)
downloadobnam-02e1087c4c29fe18c6a8d8af27cca75d7bd8be5c.tar.gz
Add --key-details option
Patch by Lars Kruse.
-rw-r--r--NEWS4
-rw-r--r--obnamlib/__init__.py1
-rw-r--r--obnamlib/encryption.py12
-rw-r--r--obnamlib/plugins/encryption_plugin.py21
4 files changed, 34 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index c4ef2950..38470051 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,10 @@ Version 1.6, released UNRELEASED
* The nagios plugin to report errors in a way Nagios expects.
Patch by Martijn Grendelman.
+* The list-keys, client-keys, and list-toplevels commands now
+ obey a new option, `--key-details`, to show the usernames
+ attached to each public key. Patch by Lars Kruse.
+
Bug fixes:
* Fix "obnam list-toplevels" so it doesn't give an error when it's
diff --git a/obnamlib/__init__.py b/obnamlib/__init__.py
index 8caa77da..fe751c3c 100644
--- a/obnamlib/__init__.py
+++ b/obnamlib/__init__.py
@@ -77,6 +77,7 @@ from encryption import (generate_symmetric_key,
encrypt_symmetric,
decrypt_symmetric,
get_public_key,
+ get_public_key_user_ids,
Keyring,
SecretKeyring,
encrypt_with_keyring,
diff --git a/obnamlib/encryption.py b/obnamlib/encryption.py
index 3381c61f..9fa849a9 100644
--- a/obnamlib/encryption.py
+++ b/obnamlib/encryption.py
@@ -135,6 +135,18 @@ def get_public_key(keyid, gpghome=None):
return _gpg(['--export', '--armor', keyid], gpghome=gpghome)
+def get_public_key_user_ids(keyid, gpghome=None): # pragma: no cover
+ '''Return the ASCII armored export form of a given public key.'''
+ user_ids = []
+ output = _gpg(['--with-colons', '--list-keys', keyid], gpghome=gpghome)
+ for line in output.splitlines():
+ token = line.split(":")
+ if len(token) >= 10:
+ user_id = token[9].strip().replace(r'\x3a', ":")
+ if user_id:
+ user_ids.append(user_id)
+ return user_ids
+
class Keyring(object):
diff --git a/obnamlib/plugins/encryption_plugin.py b/obnamlib/plugins/encryption_plugin.py
index 8d4662f9..c137b561 100644
--- a/obnamlib/plugins/encryption_plugin.py
+++ b/obnamlib/plugins/encryption_plugin.py
@@ -37,6 +37,9 @@ class EncryptionPlugin(obnamlib.ObnamPlugin):
'use /dev/urandom instead of /dev/random '
'to generate symmetric keys',
group=encryption_group)
+ self.app.settings.boolean(['key-details'],
+ 'show additional user IDs for all keys',
+ group=encryption_group)
self.app.settings.string(['symmetric-key-bits'],
'size of symmetric key, in bits',
group=encryption_group)
@@ -188,8 +191,10 @@ class EncryptionPlugin(obnamlib.ObnamPlugin):
for client in clients:
keyid = repo.clientlist.get_client_keyid(client)
if keyid is None:
- keyid = 'no key'
- print client, keyid
+ key_info = 'no key'
+ else:
+ key_info = self._get_key_string(keyid)
+ print client, key_info
def _find_keys_and_toplevels(self, repo):
toplevels = repo.fs.listdir('.')
@@ -210,6 +215,14 @@ class EncryptionPlugin(obnamlib.ObnamPlugin):
tops[toplevel] = tops.get(toplevel, []) + [keyid]
return keys, tops
+ def _get_key_string(self, keyid):
+ verbose = self.app.settings['key-details']
+ if verbose:
+ user_ids = obnamlib.get_public_key_user_ids(keyid)
+ if user_ids:
+ return "%s (%s)" % (keyid, ", ".join(user_ids))
+ return str(keyid)
+
def list_keys(self, args):
'''List keys and the repository toplevels they're used in.'''
if self.quit_if_unencrypted():
@@ -217,7 +230,7 @@ class EncryptionPlugin(obnamlib.ObnamPlugin):
repo = self.app.open_repository()
keys, tops = self._find_keys_and_toplevels(repo)
for keyid in keys:
- print 'key: %s' % keyid
+ print 'key: %s' % self._get_key_string(keyid)
for toplevel in keys[keyid]:
print ' %s' % toplevel
@@ -230,7 +243,7 @@ class EncryptionPlugin(obnamlib.ObnamPlugin):
for toplevel in tops:
print 'toplevel: %s' % toplevel
for keyid in tops[toplevel]:
- print ' %s' % keyid
+ print ' %s' % self._get_key_string(keyid)
_shared = ['chunklist', 'chunks', 'chunksums', 'clientlist']