From 1509e3c7d404f2413584ef17eee7ed7cc40ad528 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sat, 5 Mar 2005 16:29:38 +0000 Subject: [PATCH] Added GUI to confirm trusted keys. git-svn-id: file:///home/talex/Backups/sf.net/Subversion/zero-install/injector/head/injector-gui/head@71 9f8c893c-44ee-0310-b757-c8ca8341c71e --- gui.py | 5 +++- trust_box.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 trust_box.py diff --git a/gui.py b/gui.py index 7358aea..2897f92 100644 --- a/gui.py +++ b/gui.py @@ -27,7 +27,6 @@ class GUIPolicy(Policy): def monitor_download(self, dl): error_stream = dl.start() def error_ready(src, cond): - print src, "ready" got = os.read(src.fileno(), 100) if not got: error_stream.close() @@ -62,6 +61,10 @@ class GUIPolicy(Policy): progress = self.window.progress self.pulse = gtk.timeout_add(50, lambda: progress.pulse() or True) progress.show() + + def confirm_trust_keys(self, interface, sigs, iface_xml): + import trust_box + box = trust_box.trust_box.confirm_trust(interface, sigs, iface_xml) def main(self): self.window.show() diff --git a/trust_box.py b/trust_box.py new file mode 100644 index 0000000..a819ec5 --- /dev/null +++ b/trust_box.py @@ -0,0 +1,98 @@ +import gtk + +import gui +import dialog +import gpg +import trust + +def pretty_fp(fp): + s = fp[0:4] + for x in range(4, len(fp), 4): + s += ' ' + fp[x:x + 4] + return s + +class TrustBox(dialog.Dialog): + model = None + tree_view = None + interfaces = None # Interface -> (xml, [Keys]) + + def __init__(self): + dialog.Dialog.__init__(self) + self.set_title('Confirm trust') + self.interfaces = {} + + label = gtk.Label('Please confirm that you trust ' + 'these keys to sign software updates:') + label.set_padding(8, 8) + self.vbox.pack_start(label, False, True, 0) + + swin = gtk.ScrolledWindow() + self.vbox.pack_start(swin, True, True, 0) + swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + swin.set_shadow_type(gtk.SHADOW_IN) + swin.set_border_width(8) + + self.model = gtk.ListStore(str, object) + self.tree_view = gtk.TreeView(self.model) + self.tree_view.get_selection().set_mode(gtk.SELECTION_NONE) + swin.add(self.tree_view) + + self.tree_view.set_size_request(-1, 100) + + text = gtk.CellRendererText() + toggle = gtk.CellRendererToggle() + + for column in [gtk.TreeViewColumn('Key fingerprint', text, text = 0)]: + self.tree_view.append_column(column) + + self.vbox.show_all() + + self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) + self.add_button(gtk.STOCK_ADD, gtk.RESPONSE_OK) + self.set_default_response(gtk.RESPONSE_OK) + + def response(box, resp): + if resp == gtk.RESPONSE_OK: + self.trust_keys() + self.hide() + self.connect('response', response) + + self.connect('delete-event', lambda box, ev: True) + + def confirm_trust(self, interface, sigs, iface_xml): + valid_sigs = [s for s in sigs if isinstance(s, gpg.ValidSig)] + if not valid_sigs: + raise SafeException('No valid signatures found') + + self.interfaces[interface] = (iface_xml, valid_sigs) + + self.rebuild_model() + self.tree_view.expand_all() + trust_box.present() + + def rebuild_model(self): + ifaces = self.interfaces.keys() + ifaces.sort() # Keep the order stable + self.model.clear() + for i in ifaces: + for sig in self.interfaces[i][1]: + titer = self.model.append() + self.model[titer][0] = pretty_fp(sig.fingerprint) + self.model[titer][1] = sig + + def trust_keys(self): + for row in self.model: + sig = row[1] + print "Trusing", sig.fingerprint + trust.trust_db.trust_key(sig.fingerprint) + + ifaces = self.interfaces + self.interfaces = {} + self.rebuild_model() + for i in ifaces: + iface_xml, sigs = ifaces[i] + if not gui.policy.update_interface_if_trusted(i, sigs, iface_xml): + raise Exception('Bug: still not trusted!!') + +# Singleton, to avoid opening too many windows at once +trust_box = TrustBox() -- 2.11.4.GIT