diff options
| author | Michael Vogt <egon@top> | 2005-11-15 14:18:07 +0100 |
|---|---|---|
| committer | Michael Vogt <egon@top> | 2005-11-15 14:18:07 +0100 |
| commit | d632109cd5964f7d4baa408d517e44f801e1be8d (patch) | |
| tree | c1acf5f14bcfa183951c260a52e5560610f3a988 /src/dialog_apt_key.py.in | |
| download | python-apt-d632109cd5964f7d4baa408d517e44f801e1be8d.tar.gz | |
* initial revision (after accidently killing it)
Diffstat (limited to 'src/dialog_apt_key.py.in')
| -rw-r--r-- | src/dialog_apt_key.py.in | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/dialog_apt_key.py.in b/src/dialog_apt_key.py.in new file mode 100644 index 00000000..d11dfd0a --- /dev/null +++ b/src/dialog_apt_key.py.in @@ -0,0 +1,163 @@ +# dialog_apt_key.py.in - edit the apt keys +# +# Copyright (c) 2004 Canonical +# +# Author: Michael Vogt <mvo@debian.org> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA + +import os +import gobject +import gtk +import gtk.glade +import subprocess +import gettext +from utils import error +from subprocess import PIPE + +# gettext convenient +_ = gettext.gettext +def dummy(e): return e +N_ = dummy + +# some known keys +N_("Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>") +N_("Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>") + +class apt_key: + def __init__(self): + self.gpg = ["/usr/bin/gpg"] + self.base_opt = self.gpg + ["--no-options", "--no-default-keyring", + "--secret-keyring", "/etc/apt/secring.gpg", + "--trustdb-name", "/etc/apt/trustdb.gpg", + "--keyring", "/etc/apt/trusted.gpg"] + self.list_opt = self.base_opt + ["--with-colons", "--batch", + "--list-keys"] + self.rm_opt = self.base_opt + ["--quiet", "--batch", + "--delete-key", "--yes"] + self.add_opt = self.base_opt + ["--quiet", "--batch", + "--import"] + + + def list(self): + res = [] + #print self.list_opt + p = subprocess.Popen(self.list_opt,stdout=PIPE).stdout + for line in p.readlines(): + fields = line.split(":") + if fields[0] == "pub": + name = fields[9] + res.append("%s %s\n%s" %((fields[4])[-8:],fields[5], _(name))) + return res + + def add(self, filename): + #print "request to add " + filename + cmd = self.add_opt[:] + cmd.append(filename) + p = subprocess.Popen(cmd) + return (p.wait() == 0) + + def update(self): + cmd = ["/usr/bin/apt-key", "update"] + p = subprocess.Popen(cmd) + return (p.wait() == 0) + + def rm(self, key): + #print "request to remove " + key + cmd = self.rm_opt[:] + cmd.append(key) + p = subprocess.Popen(cmd) + return (p.wait() == 0) + +class dialog_apt_key: + def __init__(self, parent): + # gtk stuff + if os.path.exists("../data/gnome-software-properties.glade"): + self.gladexml = gtk.glade.XML("../data/gnome-software-properties.glade") + else: + self.gladexml = gtk.glade.XML("@prefix@/share/update-manager/gnome-software-properties.glade") + self.main = self.gladexml.get_widget("dialog_apt_key") + self.main.set_transient_for(parent) + + self.gladexml.signal_connect("on_button_key_add_clicked", + self.on_button_key_add_clicked) + self.gladexml.signal_connect("on_button_key_remove_clicked", + self.on_button_key_remove_clicked) + self.gladexml.signal_connect("on_button_apt_key_update_clicked", + self.on_button_apt_key_update_clicked) + + # create apt-key object (abstraction for the apt-key command) + self.apt_key = apt_key() + + # get some widgets + self.treeview_apt_key = self.gladexml.get_widget("treeview_apt_key") + self.liststore_apt_key = gtk.ListStore(str) + self.treeview_apt_key.set_model(self.liststore_apt_key) + # Create columns and append them. + tr = gtk.CellRendererText() + tr.set_property("xpad", 10) + tr.set_property("ypad", 10) + c0 = gtk.TreeViewColumn("Key", tr, text=0) + self.treeview_apt_key.append_column(c0) + self.update_key_list() + + def on_button_apt_key_update_clicked(self, widget): + self.apt_key.update() + self.update_key_list() + + def on_button_key_add_clicked(self, widget): + chooser = gtk.FileChooserDialog(title=_("Choose a key-file"), + parent=self.main, + buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_REJECT, + gtk.STOCK_OK,gtk.RESPONSE_ACCEPT)) + res = chooser.run() + chooser.hide() + if res == gtk.RESPONSE_ACCEPT: + #print chooser.get_filename() + if not self.apt_key.add(chooser.get_filename()): + error(self.main, + _("Error importing selected file"), + _("The selected file may not be a GPG key file " + "or it might be corrupt.")) + self.update_key_list() + + def on_button_key_remove_clicked(self, widget): + selection = self.treeview_apt_key.get_selection() + (model,a_iter) = selection.get_selected() + if a_iter == None: + return + key = model.get_value(a_iter,0) + if not self.apt_key.rm(key[:8]): + error(self.main, + _("Error removing the key"), + _("The key you selected could not be removed. " + "Please report this as a bug.")) + self.update_key_list() + + def update_key_list(self): + self.liststore_apt_key.clear() + for key in self.apt_key.list(): + self.liststore_apt_key.append([key]) + + def run(self): + res = self.main.run() + self.main.hide() + + +if __name__ == "__main__": + ui = dialog_apt_key(None) + ui.run() + |
