diff options
author | Lars Wirzenius <liw@liw.fi> | 2013-09-06 19:59:10 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2013-09-06 19:59:10 +0100 |
commit | 02e1087c4c29fe18c6a8d8af27cca75d7bd8be5c (patch) | |
tree | 07bc3f4165b1169ef72d37ec8c00c95a028d1889 | |
parent | 2a3a1e574f5be7161f147f65912d428768e4739f (diff) | |
download | obnam-02e1087c4c29fe18c6a8d8af27cca75d7bd8be5c.tar.gz |
Add --key-details option
Patch by Lars Kruse.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | obnamlib/__init__.py | 1 | ||||
-rw-r--r-- | obnamlib/encryption.py | 12 | ||||
-rw-r--r-- | obnamlib/plugins/encryption_plugin.py | 21 |
4 files changed, 34 insertions, 4 deletions
@@ -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'] |