From 879825398666e201656462ab11465070d0f7b1e0 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sat, 31 Mar 2007 10:24:51 +0000 Subject: [PATCH] Added load_keys() as a faster alternative to load_key(). git-svn-id: file:///home/talex/Backups/sf.net/Subversion/zero-install/trunk/0launch@1635 9f8c893c-44ee-0310-b757-c8ca8341c71e --- zeroinstall/0launch-gui/preferences.py | 8 ++++--- zeroinstall/injector/gpg.py | 39 ++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/zeroinstall/0launch-gui/preferences.py b/zeroinstall/0launch-gui/preferences.py index dbee355..a522c61 100644 --- a/zeroinstall/0launch-gui/preferences.py +++ b/zeroinstall/0launch-gui/preferences.py @@ -176,12 +176,14 @@ class KeyList(gtk.VBox): def update_keys(self, trusted_keys): trusted_keys.clear() domains = {} - for fingerprint in trust.trust_db.keys: - key = gpg.load_key(fingerprint) + + keys = gpg.load_keys(trust.trust_db.keys.keys()) + + for fingerprint in keys: for domain in trust.trust_db.keys[fingerprint]: if domain not in domains: domains[domain] = Set() - domains[domain].add(key) + domains[domain].add(keys[fingerprint]) for domain in domains: iter = trusted_keys.append(None, [domain, None]) for key in domains[domain]: diff --git a/zeroinstall/injector/gpg.py b/zeroinstall/injector/gpg.py index 6477337..18aa21e 100644 --- a/zeroinstall/injector/gpg.py +++ b/zeroinstall/injector/gpg.py @@ -97,22 +97,43 @@ class Key: def get_short_name(self): return self.name.split(' (', 1)[0].split(' <', 1)[0] -def load_key(fingerprint): - """Query gpg for information about this key. - @return: a new key - @rtype: L{Key} - @since: 0.27""" - key = Key(fingerprint) - cin, cout = os.popen2(('gpg', '--fixed-list-mode', '--with-colons', '--list-keys', fingerprint)) +def load_keys(fingerprints): + """Load a set of keys at once. + This is much more efficient than making individual calls to L{load_key}. + @return: a list of loaded keys, indexed by fingerprint + @rtype: {str: L{Key}} + @since 0.27""" + + keys = {} + for fp in fingerprints: + keys[fp] = Key(fp) + + current_fpr = None + + cin, cout = os.popen2(['gpg', '--fixed-list-mode', '--with-colons', '--list-keys', '--with-fingerprint'] + fingerprints) cin.close() try: for line in cout: + if line.startswith('pub:'): + current_fpr = None + if line.startswith('fpr:'): + assert current_fpr is None + current_fpr = line.split(':')[9] if line.startswith('uid:'): + assert current_fpr is not None parts = line.split(':') - key.name = parts[9] + keys[current_fpr].name = parts[9] finally: cout.close() - return key + + return keys + +def load_key(fingerprint): + """Query gpg for information about this key. + @return: a new key + @rtype: L{Key} + @since: 0.27""" + return load_keys([fingerprint])[fingerprint] def import_key(stream): """Run C{gpg --import} with this stream as stdin.""" -- 2.11.4.GIT