diff options
| author | Ben McGinnes <[email protected]> | 2015-08-02 01:06:14 +0000 | 
|---|---|---|
| committer | Ben McGinnes <[email protected]> | 2015-08-02 01:06:14 +0000 | 
| commit | a7fbd5293ed0ba2c179837a4a2b859376d30e35e (patch) | |
| tree | 1abc2aff6a990ed7b90da9d181ecf75c3e41c638 /lang/py3-pyme/examples/pygpa.py | |
| parent | Removed GUI examples (diff) | |
| download | gpgme-a7fbd5293ed0ba2c179837a4a2b859376d30e35e.tar.gz gpgme-a7fbd5293ed0ba2c179837a4a2b859376d30e35e.zip | |
More GTK2 removalpyme3
* Missed a couple of files, these 2 go for the same reason as the
  previous 3.
Diffstat (limited to 'lang/py3-pyme/examples/pygpa.py')
| -rwxr-xr-x | lang/py3-pyme/examples/pygpa.py | 1457 | 
1 files changed, 0 insertions, 1457 deletions
| diff --git a/lang/py3-pyme/examples/pygpa.py b/lang/py3-pyme/examples/pygpa.py deleted file mode 100755 index 341a87cb..00000000 --- a/lang/py3-pyme/examples/pygpa.py +++ /dev/null @@ -1,1457 +0,0 @@ -#!/usr/bin/env python3 -# $Id$ -# Copyright (C) 2005,2008 Igor Belyi <[email protected]> -# -#    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 gtk, gobject, gtk.glade -import gettext -import time, sys, os -from pyme import errors, core -from pyme.core import Context, Data, pubkey_algo_name -from pyme.constants import validity, status, keylist, sig, sigsum - -# Enable internationalization using gpa translation pages. -gettext.install('gpa', None, 1) -gtk.glade.bindtextdomain('gpa') -gtk.glade.textdomain('gpa') - -# Thanks to Bernhard Reiter for pointing out the following: -# gpgme_check_version() necessary for initialisation according to  -# gpgme 1.1.6 and this is not done automatically in pyme-0.7.0 -print("gpgme version:", core.check_version()) - -# Helper functions to convert non-string data into printable strings -def sec2str(secs, empty="_(Unknown)"): -    "Convert seconds since 1970 into mm/dd/yy string" -    if secs > 0:    return time.strftime("%m/%d/%y", time.localtime(secs)) -    elif secs == 0: return empty -    else:           return "" - -trusts = { -    validity.UNDEFINED: "Unknown", -    validity.NEVER: "Never", -    validity.MARGINAL: "Marginal", -    validity.FULL: "Full", -    validity.ULTIMATE: "Ultimate" -    } - -def validity2str(valid): -    "Convert trust integer into a human understandable string" -    if valid in trusts: return _("%s" % trusts[valid]) -    else:                     return _("Unknown") - -def keyvalid2str(key): -    "Create a string representing validity of a key" -    if key.owner_trust==validity.ULTIMATE: -        return _("Fully Valid") -    if key.revoked: return _("Revoked") -    if key.expired: return _("Expired") -    if key.disabled: return _("Disabled") -    if not key.uids or key.uids[0].invalid: return _("Incomplete") -    return _("Unknown") - -def subvalid2str(subkey): -    "Create a string representing validity of a subkey" -    if subkey.revoked: return _("Revoked") -    if subkey.expired: return _("Expired") -    if subkey.disabled: return _("Disabled") -    if subkey.invalid: return _("Unsigned") -    return _("Valid") - -def signstat2str(sig): -    "Create a string representing validity of a signature" -    status = _("Unknown") -    if sig.status == 1: status = _("Valid") -    elif sig.status == 2: status = _("Bad") -    if sig.expired: status = _("Expired") -    elif sig.revoked: status = _("Revoked") -    return status - -def sigsum2str(summary): -    if summary & sigsum.VALID: return _("Valid") -    if summary & sigsum.RED: return _("Bad") -    if summary & sigsum.KEY_MISSING: return _("Unknown Key") -    if summary & sigsum.KEY_REVOKED: return _("Revoked Key") -    if summary & sigsum.KEY_EXPIRED: return _("Expired Key") -    return _("Key NOT valid") - -def class2str(cls): -    "Convert signature class integer into a human understandable string"     -    if cls==0x10: return _("Generic") -    if cls==0x11: return _("Persona") -    if cls==0x12: return _("Casual") -    if cls==0x13: return _("Positive") -    return _("Unknown") - -def algo2str(algo): -    "Convert algorithm integer into a human understandable string" -    return pubkey_algo_name(algo) - -def fpr2str(fpr): -    "Convert fpr string in a sparsely spaced string for easy reading" -    result = [] -    while fpr: -        result.append(fpr[:4]) -        fpr = fpr[4:] -    return " ".join(result) - -# Helper functions for tasks unrelated to any class -def obj2model(objs, columns): -    "Create a model from the obj (key, subkey, or signature) using columns" -    model = gtk.ListStore(*[x.ctype for x in columns]) -    for obj in objs: -        model.append([x.cfunc(obj) for x in columns]) -    return model - -def labels2table(key_labels): -    "Create a gtk.Table from an array of 2-tuples of strings" -    table = gtk.Table(len(key_labels), 2) -    for i, row in enumerate(key_labels): -        if len(row) != 2: -            raise ValueError("Unexpected number of rows in labels2table call") -        label1 = gtk.Label(row[0]) -        label1.set_alignment(1.0, 0.5) -        label2 = gtk.Label(row[1]) -        label2.set_alignment(0.0, 0.5) -        label2.set_padding(5, 0) -        table.attach(label1, 0, 1, i, i+1, gtk.FILL, gtk.FILL) -        table.attach(label2, 1, 2, i, i+1, gtk.FILL, gtk.FILL) -    return table - -status2str = {} -for name in dir(status): -    if not name.startswith('__') and name != "util": -        status2str[getattr(status, name)] = name - -def editor_func(status, args, val_dict): -    prompt = "%s %s" % (val_dict["state"], args) -    if prompt in val_dict: -        val_dict["state"] = val_dict[prompt][0] -        return val_dict[prompt][1] -    elif args and "ignore %s" % status2str[status] not in val_dict: -        for error in ["error %s" % status2str[status], "error %s" % prompt]: -            if error in val_dict: -                raise errors.GPGMEError(val_dict[error]) -        sys.stderr.write(_("Unexpected status and prompt in editor_func: " + -                           "%s %s\n") % (status2str[status], prompt)) -        raise EOFError() -    return "" - -common_dict = { -        "state": "start", -        "quit keyedit.save.okay": ("save", "Y"), -        "ignore NEED_PASSPHRASE": None, -        "ignore NEED_PASSPHRASE_SYM": None, -        "ignore BAD_PASSPHRASE": None, -        "ignore USERID_HINT": None -        }   - -def change_key_expire(context, key, date): -    "Change key's expiration date to date" -    val_dict = common_dict.copy() -    val_dict.update({ -        "start keyedit.prompt": ("expire", "expire"), -        "expire keygen.valid": ("date", date), -        "date keyedit.prompt": ("quit", "quit") -        }) -    out = Data() -    context.op_edit(key, editor_func, val_dict, out) - -def change_key_trust(context, key, new_trust): -    "Change key's trust to new_trust" -    val_dict = common_dict.copy() -    val_dict.update({ -        "start keyedit.prompt": ("trust", "trust"), -        "trust edit_ownertrust.value": ("value", "%d" % new_trust), -        "value edit_ownertrust.set_ultimate.okay": ("value", "Y"), -        "value keyedit.prompt": ("quit", "quit") -        }) -    out = Data() -    context.op_edit(key, editor_func, val_dict, out) - -def sign_key(context, key, sign_key, local): -    "Sign key using sign_key. Signature is exportable if local is False" -    # Values copied from <gpg-error.h> -    GPG_ERR_CONFLICT = 70 -    GPG_ERR_UNUSABLE_PUBKEY = 53 -    val_dict = common_dict.copy() -    val_dict.update({ -        "start keyedit.prompt": ("sign", (local and "lsign") or "sign"), -        "sign keyedit.sign_all.okay": ("sign", "Y"), -        "sign sign_uid.expire": ("sign", "Y"), -        "sign sign_uid.class": ("sign", "0"), -        "sign sign_uid.okay": ("okay", "Y"), -        "okay keyedit.prompt": ("quit", "quit"), -        "error ALREADY_SIGNED": GPG_ERR_CONFLICT, -        "error sign keyedit.prompt": GPG_ERR_UNUSABLE_PUBKEY -        }) -    out = Data() -    context.signers_clear() -    context.signers_add(sign_key) -    context.op_edit(key, editor_func, val_dict, out) - -def trigger_change_password(context, key): -    "Trigger sequence of passphrase_cb callbacks to change password of the key" -    val_dict = common_dict.copy() -    val_dict.update({ -        "start keyedit.prompt": ("passwd", "passwd"), -        "passwd keyedit.prompt": ("quit", "quit") -        }) -    out = Data() -    context.op_edit(key, editor_func, val_dict, out) - -# Helper classes whose instances are used in the major PyGpa class -class KeyInfo: -    """Helper class to represent key information in different views. -    If KeyInfo instance is initialized with an integer as a key the views -    correspond to a state when multiple or no keys are selected""" -    def __init__(self, key, secret=None): -        self.key = key -        self.secret = secret - -    def key_print_labels(self, fpr=False): -        "Create an array of 2-tuples for 'User Name' and 'Key ID' fields" -        labels = [] -        if type(self.key) != int: -            if self.key.uids: -                labels.append((_("User Name:"), self.key.uids[0].uid)) -		for uid in self.key.uids[1:]: -                    labels.append(("", uid.uid)) -            if fpr: -                labels += [(_("Fingerprint:"), fpr2str(self.key.subkeys[0].fpr))] -            else: -                labels += [(_("Key ID:"), self.key.subkeys[0].keyid[-8:])] -        return labels - -    def key_expires_label(self): -        return sec2str(self.key.subkeys[0].expires,_("never expires")) - -    def details(self): -        "Create a widget for 'Details' notebook tab" -        if type(self.key) == int: -            if self.key: -                details=gtk.Label(_("%d keys selected") % self.key) -            else: -                details=gtk.Label(_("No keys selected")) -            details.set_alignment(0.5, 0) -            return details -         -        if self.secret: -            header = _("The key has both a private and a public part") -        else: -            header = _("The key has only a public part") -        key_info_labels = [("", header)] - -        if self.key.can_certify: -            if self.key.can_sign: -                if self.key.can_encrypt: -                    ability = _("The key can be used for certification, " + -                                "signing and encryption.") -                else: -                    ability = _("The key can be used for certification and " + -                                "signing, but not for encryption.") -            else: -                if self.key.can_encrypt: -                    ability = _("The key can be used for certification and " + -                                "encryption.") -                else: -                    ability = _("The key can be used only for certification.") -        else: -            if self.key.can_sign: -                if self.key.can_encrypt: -                    ability = _("The key can be used only for signing and " + -                                "encryption, but not for certification.") -                else: -                    ability = _("The key can be used only for signing.") -            else: -                if self.key.can_encrypt: -                    ability = _("The key can be used only for encryption.") -                else: -                    ability = _("This key is useless.") -        key_info_labels.append(("", ability)) - -        key_info_labels += self.key_print_labels() + [ -            (_("Fingerprint:"), fpr2str(self.key.subkeys[0].fpr)), -            (_("Expires at:"), self.key_expires_label()), -            (_("Owner Trust:"), validity2str(self.key.owner_trust)), -            (_("Key Validity:"), keyvalid2str(self.key)), -            (_("Key Type:"), _("%s %u bits") % \ -             (algo2str(self.key.subkeys[0].pubkey_algo),self.key.subkeys[0].length)), -            (_("Created at:"), sec2str(self.key.subkeys[0].timestamp)) -            ] - -        return labels2table(key_info_labels) - -    def sign_model(self): -        "Create a model for ComboBox of uids in 'Signatures' notebook tab" -        model = gtk.ListStore(str, gtk.ListStore) -        if type(self.key) != int: -            for uid in self.key.uids: -                model.append([uid.uid, obj2model(uid.signatures,sign_columns)]) -        return model - -    def subkey_model(self): -        "Create a model for TreeView in 'Subkeys' notebook tab" -        if type(self.key) == int: -            return gtk.ListStore(*[x.ctype for x in subkey_columns]) -        else: -            return obj2model(self.key.subkeys, subkey_columns) - -class Column: -    "Helper class to represent a column in a TreeView" -    def __init__(self, name, ctype, cfunc, detail=False): -        """Column(name, ctype, cfunc): -        name  - Name to use as a column header -        ctype - type to use in a model definition for this column -        cfunc - function retrieving column's infromation from an object -        detail- indicate if it's a detail visible only in detailed view""" -        self.name = name -        self.ctype = ctype -        self.cfunc = cfunc -        self.detail = detail - -# Columns for the list of keys which can be used as default -def_keys_columns = [ -    Column(_("Key ID"), str, lambda x,y: x.subkeys[0].keyid[-8:]), -    Column(_("User Name"), str, -           lambda x,y: (x.uids and x.uids[0].uid) or _("[Unknown user ID]")), -    Column(None, gobject.TYPE_PYOBJECT, lambda x,y: KeyInfo(x,y)) -    ] - -# Columns for the list of all keys in the keyring -keys_columns = [ -    Column("", str, lambda x,y: (y and "sec") or "pub"), -    def_keys_columns[0], -    Column(_("Expiry Date"), str, -           lambda x,y: sec2str(x.subkeys[0].expires, _("never expires")), True), -    Column(_("Owner Trust"),str,lambda x,y:validity2str(x.owner_trust),True), -    Column(_("Key Validity"), str, lambda x,y: keyvalid2str(x), True) -    ] + def_keys_columns[1:] - -# Columns for the list of signatures on a uid -sign_columns = [ -    Column(_("Key ID"), str, lambda x: x.keyid[-8:]), -    Column(_("Status"), str, lambda x: signstat2str(x)), -    Column(_("Level"), str, lambda x: class2str(x.sig_class)), -    Column(_("Local"), type(True), lambda x: x.exportable==0), -    Column(_("User Name"), str, lambda x: x.uid or _("[Unknown user ID]")) -    ] - -# Columns for the list of subkeys -subkey_columns = [ -    Column(_("Subkey ID"), str, lambda x: x.keyid[-8:]), -    Column(_("Status"), str, lambda x: subvalid2str(x)), -    Column(_("Algorithm"), str, lambda x: algo2str(x.pubkey_algo)), -    Column(_("Size"), str, lambda x: _("%u bits") % x.length), -    Column(_("Expiry Date"), str, -           lambda x: sec2str(x.expires, _("never expires"))), -    Column(_("Can sign"), type(True), lambda x: x.can_sign), -    Column(_("Can certify"), type(True), lambda x: x.can_certify), -    Column(_("Can encrypt"), type(True), lambda x: x.can_encrypt), -    Column(_("Can authenticate"), type(True), lambda x: x.can_authenticate) -    ] - -file_columns = [ -    Column(_("File"), str, lambda x: x) -    ] - -class PyGpa: -    "Major class representing PyGpa application" -    def popup(self, dialog, parent=None, title=None): -        "Common way to popup a dialog defined in Glade" -        dialog.set_transient_for(parent or self.main_window) -        if title: dialog.set_title(title) -        result = dialog.run() -        dialog.hide() -        return result - -    def file_popup(self, dialog, parent=None, title=None): -        return self.popup(dialog, parent or self.filemanager_window, title) -         -    def error_message(self, text, parent=None, title=_("Warning")): -        "Pop up an error message dialog" -        if type(text) == int: -            text = errors.GPGMEError(text).getstring() -            title = "GPGME error" -        elif isinstance(text, errors.GPGMEError): -            text = text.getstring() -            title = "GPGME error" -        self.error_label.set_text(text) -        self.popup(self.error_dialog, parent, title) - -    def file_error_message(self, text, parent=None, title=_("Warning")): -        self.error_message(text, parent or self.filemanager_window, title) - -    def info_message(self, text, parent=None, title=_("Information")): -        "Pop up an information dialog" -        self.info_label.set_text(text) -        self.popup(self.info_dialog, parent, title) - -    def yesno_message(self, text, parent=None): -        "Pop up a dialog requiring yes/no answer" -        self.yesno_label.set_text(text) -        return self.popup(self.yesno_dialog, parent, -                          _("Warning")) == gtk.RESPONSE_YES - -    def on_uid_list_changed(self, uid_list): -        "this callback is called when uid selection is changed" -        index = uid_list.get_active() -        if index == -1: -            self.sign_treeview.set_model(KeyInfo(0).sign_model()) -        else: -            self.sign_treeview.set_model(uid_list.get_model()[index][1]) - -    def get_selected_keys(self, treeview=None): -        "Helper function to get all selected rows in a treeview" -        if not treeview: -            treeview = self.keys_treeview -        model, rows = treeview.get_selection().get_selected_rows() -        return [model[path] for path in rows] - -    def on_keys_changed(self, keys_treeview): -        "this callback is called when key selection is changed" -        selection = keys_treeview.get_selection() -        count = selection.count_selected_rows() -        if count == 1: -            key_info = self.get_selected_keys()[0][-1] -        else: -            key_info = KeyInfo(count) - -        self.update_menu(key_info) - -        # Update Details tab of the notebook -        old_child = self.details_view.get_child() -        if old_child: self.details_view.remove(old_child) -        self.details_view.add(key_info.details()) -        self.details_view.show_all() - -        # Update Subkeys tab of the notebook -        self.subkeys_treeview.set_model(key_info.subkey_model()) - -        # Update Signatures tab of the notebook -        sign_model = key_info.sign_model() -        self.uid_list.set_model(sign_model) -        if len(sign_model) < 2: -            self.uid_list_box.hide() -        else: -            self.uid_list_box.show_all() -        self.uid_list.set_active(0) -        self.on_uid_list_changed(self.uid_list) - -    def on_keys_button_press(self, obj, event): -        "callback on a mouse press in the keys_treeview" -        if event.button == 3: -            self.popup_menu.popup(None, None, None, event.button, event.time) -            return True -        return False - -    def create_popup_menu(self): -        "create the popup menu shown on right mouse click" -        self.items = [ -            (gtk.ImageMenuItem(gtk.STOCK_COPY), self.on_copy_activate), -            (gtk.ImageMenuItem(gtk.STOCK_PASTE), self.on_paste_activate), -            (gtk.ImageMenuItem(gtk.STOCK_DELETE), self.on_delete_activate), -            (gtk.SeparatorMenuItem(), None), -            (gtk.MenuItem(_("_Sign Keys...")), self.on_sign_keys_activate), -            (gtk.MenuItem(_("Set _Owner Trust...")), -             self.on_set_owner_trust_activate), -            (gtk.MenuItem(_("_Edit Private Key...")), -             self.on_edit_private_key_activate), -            (gtk.SeparatorMenuItem(), None), -            (gtk.MenuItem(_("E_xport Keys...")), self.on_export_keys_activate) -            ] -        self.popup_menu = gtk.Menu() -        for item, callback in self.items: -            if callback: item.connect("activate", callback) -            self.popup_menu.append(item) -        self.popup_menu.show_all()         -     -    def update_menu(self, key_info): -        "update sensitivity of menu items depending on what keys are selected" -        #                  copy, delete, sign, trust, edit, export -        if key_info.secret == None: -            if key_info.key:            # more than one key selected -                values = ( True,  True,  True, False, False,  True) -            else:                       # no keys selected -                values = (False, False, False, False, False, False) -        elif key_info.secret: -            if key_info.key == self.default_key: # default key seleted -                values = ( True,  True, False,  True,  True,  True) -            else:                       # secret (not default) key selected -                values = ( True,  True,  True,  True,  True,  True) -        else:                           # public key selected -            values   =   ( True,  True,  True,  True, False,  True) - -        for w,v in zip((self.copy, self.delete, self.sign_keys, -                        self.set_owner_trust, self.edit_private_key, -                        self.export_keys), values): -            w.set_sensitive(v) -        for w,v in zip((self.items[0][0], self.items[2][0], self.items[4][0], -                        self.items[5][0], self.items[6][0], self.items[8][0]), -                       values): -            w.set_sensitive(v)                 -     -    def setup_columns(self): -        "Helper function to setup columns of different treeviews" -        for treeview, columns in \ -                [(self.keys_treeview, keys_columns), -                 (self.sign_treeview, sign_columns), -                 (self.subkeys_treeview, subkey_columns), -                 (self.def_keys_treeview, def_keys_columns), -                 (self.sign_with_keys_treeview, def_keys_columns), -                 (self.encrypt_with_keys_treeview, def_keys_columns), -                 (self.files_treeview, file_columns)]: -            for index, item in enumerate([x for x in columns if x.name!=None]): -                if item.ctype == str: -                    renderer = gtk.CellRendererText() -                    attrs = {"text": index} -                else: -                    renderer = gtk.CellRendererToggle() -                    attrs = {"active": index} -                column = treeview.insert_column_with_attributes( -                    index, item.name, renderer, **attrs) -                column.set_sort_column_id(index) -                column.set_visible(not item.detail) - -        for index,item in enumerate([x for x in keys_columns if x.name!=None]): -            if item.name and not item.detail: -                renderer = gtk.CellRendererText() -                column = gtk.TreeViewColumn(item.name, renderer, text=index) -                column.set_sort_column_id(index) -                self.encrypt_for_keys_treeview.append_column(column) - -        for treeview in [self.encrypt_with_keys_treeview, self.keys_treeview, -                         self.encrypt_for_keys_treeview, self.files_treeview, -                         self.sign_with_keys_treeview]: -            treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) -        self.def_keys_treeview.get_selection().set_mode(gtk.SELECTION_SINGLE) - -        cell = gtk.CellRendererText() -        self.uid_list.pack_start(cell, True) -        self.uid_list.add_attribute(cell, 'text', 0) - -        model = gtk.ListStore(str, str) -        for lines in [(_("days"), "d"), (_("weeks"), "w"), -                      (_("months"), "m"), (_("years"), "y")]: -            model.append(lines) -        self.new_expire_unit_combo.set_model(model) -        self.new_expire_unit_combo.child.set_editable(False) -        self.new_algorithm_combo.child.set_editable(False) - -        self.files_treeview.set_model(gtk.ListStore(str)) - -    def setup_default_views(self): -        "Setup initial values for different views" -        self.update_default_keys() -        self.on_advanced_mode_toggled(self.advanced_mode_rb) -        self.create_popup_menu() -        self.on_keys_changed(self.keys_treeview) - -    def load_keys(self): -        "Download keys from the keyring" -        context = Context() -        sec_keys = {} -        for key in context.op_keylist_all(None, 1): -            sec_keys[key.subkeys[0].fpr] = 1 -        model = gtk.ListStore(*[x.ctype for x in keys_columns]) -        encrypt_model = gtk.ListStore(*[x.ctype for x in keys_columns]) -        context.set_keylist_mode(keylist.mode.SIGS) -        for key in context.op_keylist_all(None, 0): -            secret = key.subkeys[0].fpr in sec_keys -            data = [x.cfunc(key, secret) for x in keys_columns] -            if key.can_encrypt: encrypt_model.append(data) -            model.append(data) -        self.keys_treeview.set_model(model) -        self.encrypt_for_keys_treeview.set_model(encrypt_model) - -    def set_default_key(self, key): -        "Setup default key and update status bar with it" -        self.default_key = key -        self.status_uid.set_text((key.uids and key.uids[0].uid) or \ -                                 _("[Unknown user ID]")) -        self.status_keyid.set_text(key.subkeys[0].keyid[-8:]) - -    def on_default_keys_changed(self, treeview): -        "This callback is called when default key is changed in Preferences" -        model, rows = treeview.get_selection().get_selected_rows() -        if model and rows: -            self.set_default_key(model[rows[0]][-1].key) - -    def add_default_key(self, model, path, iter, def_model): -        "Helper function to add secret keys to the list of possible defaults" -        key = model[path][-1] -        if key.secret: -            def_model.append([x.cfunc(key.key,True) for x in def_keys_columns]) - -    def add_sig_key(self, model, path, iter, sign_model): -        "Helper function to add secret keys to the list of possible defaults" -        key = model[path][-1].key -        if key.can_sign: -            sign_model.append([x.cfunc(key,True) for x in def_keys_columns]) - -    def select_default_key(self, model, path, iter): -        "Helper function to select current default key from the available list" -        if model[path][-1].key == self.default_key: -            self.def_keys_treeview.get_selection().select_path(path) - -    def update_default_keys(self): -        "Update list of default keys" -        model = gtk.ListStore(*[x.ctype for x in def_keys_columns]) -        self.keys_treeview.get_model().foreach(self.add_default_key, model) -        self.def_keys_treeview.set_model(model) -        model.foreach(self.select_default_key) -        selection = self.def_keys_treeview.get_selection() -        if selection.count_selected_rows() != 1: -            selection.select_path((0,)) -            self.on_default_keys_changed(self.def_keys_treeview) -        model = gtk.ListStore(*[x.ctype for x in def_keys_columns]) -        self.def_keys_treeview.get_model().foreach(self.add_sig_key, model) -        self.sign_with_keys_treeview.set_model(model) -        self.encrypt_with_keys_treeview.set_model(model) - -    def on_select_all_activate(self, obj): -        "This callback is called when SelectAll menu item is selected" -        self.keys_treeview.get_selection().select_all() - -    def on_file_preferences_activate(self, obj): -        "Callback called when Preferences menu item is selected in filemanager" -        self.show_preferences(self.filemanager_window) - -    def on_preferences_activate(self, obj): -        "Callback called when Preferences menu item is selected in key editor" -        self.show_preferences(None) - -    def show_preferences(self, parent): -        "Show preferences positioning its window in the middle of the parent" -        self.popup(self.preferences_dialog, parent) -        self.def_keyserver = self.default_keyserver_combox.child.get_text() - -    def on_advanced_mode_toggled(self, radiobutton): -        "This callback is called when Advanced Mode selection is changed" -        if radiobutton.get_active(): -            self.subkeys_notebook_tab.show() -            self.get_generate_params = self.get_advanced_generate_params -        else: -            self.subkeys_notebook_tab.hide() -            self.get_generate_params = self.get_novice_generate_params - -    def popup_progress_dialog(self, label, parent): -        self.progress_dialog.set_transient_for(parent) -        self.progress_label.set_text(label) -        self.progress_dialog.show_all() -        gobject.timeout_add(100, self.update_progress) - -    def on_progress_cancel_clicked(self, obj): -        self.progress_context.cancel() - -    def update_progress(self): -        "Helper function to show progress while a work on a key is being done" -        try: -            status = self.progress_context.wait(0) -            if status == None or self.progress_func(status): -                self.new_progressbar.pulse() -                return True -        except errors.GPGMEError as exc: -            self.error_message(exc) -         -        self.progress_context = None -        self.progress_func = None -        self.progress_dialog.hide() - -        # Let callback to be removed. -        return False - -    def key_generate_done(self, status): -        "Helper function called on the completion of a key generation" -        if status == 0: -            fpr = self.progress_context.op_genkey_result().fpr -            self.progress_context.set_keylist_mode(keylist.mode.SIGS) -            key = self.progress_context.get_key(fpr, 0) -            data = [x.cfunc(key, True) for x in keys_columns] -            self.keys_treeview.get_model().append(data) -            if key.can_encrypt: -                self.encrypt_for_keys_treeview.get_model().append(data) -            self.update_default_keys() -        else: -            self.error_message(status) -        return False - -    def on_new_activate(self, obj): -        "Callback for 'New Key' menu item" -        params = self.get_generate_params() -        if params == None: -            return - -        (key_algo, subkeys, size, userid, email, -         comment, expire, password, backup) = params - -        gen_string = "<GnupgKeyParms format=\"internal\">\n" + \ -                         "Key-Type: %s\n" % key_algo + \ -                         "Key-Length: %d\n" % size -        if subkeys: -            gen_string += "Subkey-Type: %s\n" % subkeys + \ -                          "Subkey-Length: %d\n" % size -        gen_string += "Name-Real: %s\n" % userid -        if email: -            gen_string += "Name-Email: %s\n" % email -        if comment: -            gen_string += "Name-Comment: %s\n" % comment -        if expire: -            gen_string += "Expire-Date: %s\n" % expire -        if password: -            gen_string += "Passphrase: %s\n" % password -        gen_string += "</GnupgKeyParms>\n" - -        self.progress_context = Context() -        self.progress_context.op_genkey_start(gen_string, None, None) -        self.progress_func = self.key_generate_done -        self.popup_progress_dialog(_("Generating Key..."), self.main_window) - -    def check_passphrase(self, passphrase, repeat_passphrase, parent): -        """Helper function to check that enetered password satisfies our -        requirements""" -        if not passphrase: -            self.error_message(_('You did not enter a passphrase.\n' + -                                 'It is needed to protect your private key.'), -                               parent) -        elif repeat_passphrase != passphrase: -            self.error_message(_('In "Passphrase" and "Repeat passphrase",\n' + -                                 'you must enter the same passphrase.'), -                               parent) -        else: -            return True -        return False - -    def get_novice_generate_params(self): -        "Helper function to get generate key parameter in Novice mode" -        dialogs = [self.generate_userid_dialog, -                   self.generate_email_dialog, -                   self.generate_comment_dialog, -                   self.generate_passphrase_dialog, -                   self.generate_backup_dialog] -        step = 0 -        params = None -        while step>=0: -            dialog = dialogs[step] -            dialog.set_transient_for(self.main_window) -            result = dialog.run() -            newstep = step -            if result == 2: -                if step == 0: -                    userid = self.generate_novice_userid_entry.get_text() -                    if userid: newstep = step + 1 -                    else: self.error_message(_("Please insert your name.")) -                elif step == 1: -                    email = self.generate_novice_email_entry.get_text() -                    if email: newstep = step + 1 -                    else: -                        self.error_message(_("Please insert your email address")) -                elif step == 2: -                    comment = self.generate_novice_comment_entry.get_text() -                    newstep = step + 1 -                elif step == 3: -                    passphrase=self.generate_novice_passphrase_entry.get_text() -                    if self.check_passphrase( -                        passphrase, -                        self.generate_novice_repeat_passphrase_entry.get_text(), -                        dialog): -                        newstep = step + 1 -                elif step == 4: -                    backup = self.generate_novice_backup_rb.get_active() -                    params = ("DSA", "ELG-E", 1024, userid, email, -                              comment, "", passphrase, backup) -                    newstep = -1 -            elif result == 1: -                newstep = step - 1 -            else: -                newstep = -1 - -            if newstep != step: -                dialog.hide() -                step = newstep - -        self.generate_novice_userid_entry.set_text("") -        self.generate_novice_email_entry.set_text("") -        self.generate_novice_comment_entry.set_text("") -        self.generate_novice_passphrase_entry.set_text("") -        self.generate_novice_repeat_passphrase_entry.set_text("") -        return params - -    def on_new_expire_on_rb_toggled(self, expireon_rb): -        self.new_expire_calendar.set_sensitive(expireon_rb.get_active()) - -    def on_new_expire_after_rb_toggled(self, expireafter_rb): -        active = expireafter_rb.get_active() -        self.new_expire_count_entry.set_sensitive(active) -        self.new_expire_unit_combo.set_sensitive(active) - -    def get_advanced_generate_params(self): -        "Helper function to get generate key parameter in Advanced mode" -        params = None -        self.new_expire_unit_combo.set_active(0) -        self.new_algorithm_combo.set_active(0) -        self.new_key_size_combo.set_active(1) -        self.generate_dialog.set_transient_for(self.main_window) -        while params == None and self.generate_dialog.run() == gtk.RESPONSE_OK: -            passphrase = self.new_passphrase_entry.get_text() -            if not self.check_passphrase( -                passphrase, -                self.new_repeat_passphrase_entry.get_text(), -                self.generate_dialog): -                continue -            key_algo, subkeys = { -                'DSA and ElGamal (default)': ("DSA", "ELG-E"), -                'DSA (sign only)': ("DSA", ""), -                'RSA (sign only)': ("RSA", "") -                }[self.new_algorithm_combo.child.get_text()] -            try: -                size = int(self.new_key_size_combo.child.get_text()) -            except ValueError: -                self.new_key_size_combo.child.grab_focus() -                continue -            userid = self.new_userid_entry.get_text() -            email = self.new_email_entry.get_text() -            comment = self.new_comment_entry.get_text() -            expire = "" -            if self.new_expire_after_rb.get_active(): -                model = self.new_expire_unit_combo.get_model() -                unit = model[(self.new_expire_unit_combo.get_active(),)][1] -                try: -                    value = int(self.new_expire_count_entry.get_text()) -                except ValueError: -                    self.new_expire_count_entry.grab_focus() -                    continue -                expire = "%d%s" % (value, unit) -            elif self.new_expire_on_rb.get_active(): -                (year, month, day) = self.new_expire_calendar.get_date() -                expire = "%04d-%02d-%02d" % (year, month+1, day) -            params = (key_algo, subkeys, size, userid, email, -                      comment, expire, passphrase, False) -        self.generate_dialog.hide() -        self.new_passphrase_entry.set_text("") -        self.new_repeat_passphrase_entry.set_text("") -        return params - -    def del_key(self, key, treeview): -        "Helper function to delete a key from a treeview list" -        row_list = [] -        treeview.get_model().foreach(lambda m,p,i,l: l.append(m[p]), row_list) -        for row in row_list: -            if row[-1].key.subkeys[0].fpr == key.subkeys[0].fpr: -                row.model.remove(row.iter) - -    def on_delete_activate(self, obj): -        "Callback for 'Delete Keys' menu item" -        message = { -            True:  _("This key has a secret key. Deleting this key cannot be"+ -                     " undone, unless you have a backup copy."), -            False: _("This key is a public key. Deleting this key cannot be "+ -                     "undone easily, although you may be able to get a new " + -                     "copy  from the owner or from a key server.") -            } -        keytag = self.delete_key_keyinfo -        for row in self.get_selected_keys(): -            self.delete_key_label.set_text(message[row[-1].secret]) -            table = labels2table(row[-1].key_print_labels()) -            keytag.add(table) -            keytag.show_all() -            if self.popup(self.delete_key_dialog) == gtk.RESPONSE_YES: -                context = Context() -                context.op_delete(row[-1].key, 1) -                if row[-1].key.can_encrypt: -                    self.del_key(row[-1].key, self.encrypt_for_keys_treeview) -                row.model.remove(row.iter) -                self.update_default_keys() -                self.on_keys_changed(self.keys_treeview) -            keytag.remove(table) - -    def password_cb(self, hint, desc, prev_bad, hook=None): -        "Callback to setup verification of a passphrase" -        if prev_bad: -            header = _("Wrong passphrase, please try again:") -        else: -            header = _("Please enter the passphrase for the following key:") -        self.password_prompt_label.set_text(header) -        keyid, userid = hint.split(" ", 1) -        table = labels2table([(_("User Name:"), userid), -                              (_("Key ID:"), keyid[-8:])]) -        self.password_prompt_keyinfo.add(table) -        self.password_prompt_keyinfo.show_all() -        password = None -        if self.popup(self.password_prompt_dialog) == gtk.RESPONSE_OK: -            password = self.password_prompt_entry.get_text() -        self.password_prompt_keyinfo.remove(table) -        self.password_prompt_entry.set_text("") -        if not password: -            GPG_ERR_CANCELED = 99 -            raise errors.GPGMEError(GPG_ERR_CANCELED) -        return password - -    def password_change_cb(self, hint, desc, prev_bad, hook): -        "Callback to setup for passphrase change" -        if not prev_bad: -            hook["count"] += 1 -             -        if hook["count"] == 1: -            return self.password_cb(hint, desc, prev_bad) -        else: -            password = None -            self.password_change_dialog.set_transient_for(self.main_window) -            while password == None and \ -                      self.password_change_dialog.run() == gtk.RESPONSE_OK: -                password = self.password_change_passphrase.get_text() -                if not self.check_passphrase( -                    password, -                    self.password_change_repeat_passphrase.get_text(), -                    self.password_change_dialog): -                    password = None -            self.password_change_dialog.hide() -            self.password_change_passphrase.set_text("") -            self.password_change_repeat_passphrase.set_text("") -            if not password: -                GPG_ERR_CANCELED = 99 -                raise errors.GPGMEError(GPG_ERR_CANCELED) -            return password - -    def on_sign_keys_activate(self, obj): -        "Callback for 'Sign keys' menu item" -        context = Context() -        context.set_passphrase_cb(self.password_cb) -        context.set_keylist_mode(keylist.mode.SIGS) -        keytag = self.sign_key_keyinfo -        for row in self.get_selected_keys(): -            if row[-1].key == self.default_key: -                continue -            if len(row[-1].key.uids) > 1: -                self.sign_manyuids_label.show() -            else: -                self.sign_manyuids_label.hide() -            table = labels2table(row[-1].key_print_labels(True)) -            keytag.add(table) -            keytag.show_all() -            if self.popup(self.sign_key_dialog) == gtk.RESPONSE_YES: -                try: -                    sign_key(context, row[-1].key, self.default_key, -                             self.sign_locally_cb.get_active()) -                    row[-1].key=context.get_key(row[-1].key.subkeys[0].fpr,0) -                    self.on_keys_changed(self.keys_treeview) -                except errors.GPGMEError as exc: -                    self.error_message(exc) -            keytag.remove(table) - -    def on_change_passphrase_clicked(self, obj, key_info): -        "Callback for 'Change passphrase' button in editor for a private key" -        try: -            context = Context() -            context.set_passphrase_cb(self.password_change_cb, {"count": 0}) -            trigger_change_password(context, key_info.key) -        except errors.GPGMEError as exc: -            self.error_message(exc) - -    def on_change_expiry_expireon_rb_toggled(self, expire_rb): -        "Callback for 'never expire' radiobutton in editor for a private key" -        self.change_expiry_calendar.set_sensitive(expire_rb.get_active()) - -    def on_change_expiration_clicked(self, obj, key_info): -        "Callback for 'Change expiration' button in editor for a private key" -        if key_info.key.subkeys[0].expires: -            year, month, day = time.localtime(key_info.key.subkeys[0].expires)[:3] -            self.change_expiry_calendar.select_month(month-1, year) -            self.change_expiry_calendar.select_day(day) -            self.change_expiry_expireon_rb.set_active(True) -        else: -            self.change_expiry_never_rb.set_active(True) -        if self.popup(self.change_expiry_dialog, -                      self.edit_key_dialog) == gtk.RESPONSE_OK: -            year, month, day = self.change_expiry_calendar.get_date() -            expire = "%04d-%02d-%02d" % (year, month+1, day) -            try: -                context = Context() -                context.set_passphrase_cb(self.password_cb) -                change_key_expire(context, key_info.key, expire) -                context.set_keylist_mode(keylist.mode.SIGS) -                key_info.key=context.get_key(key_info.key.subkeys[0].fpr,0) -                self.on_keys_changed(self.keys_treeview) -                self.edit_key_date_label.set_text(key_info.key_expires_label()) -            except errors.GPGMEError as exc: -                self.error_message(exc) - -    def on_edit_private_key_activate(self, obj): -        "Callback for 'Edit Private Key' menu item" -        keys = self.get_selected_keys() -        if len(keys) != 1 or not keys[0][-1].secret: -            return -         -        key_info = keys[0][-1] -        table = labels2table(key_info.key_print_labels()) -        self.edit_key_date_label.set_text(key_info.key_expires_label()) -        self.edit_key_keyinfo.add(table) -        self.edit_key_keyinfo.show_all() -        connect1_id = self.edit_key_change_expiration.connect( -            "clicked", self.on_change_expiration_clicked, key_info) -        connect2_id = self.edit_key_change_passphrase.connect( -            "clicked", self.on_change_passphrase_clicked, key_info) -        self.popup(self.edit_key_dialog) -        self.edit_key_change_expiration.disconnect(connect1_id) -        self.edit_key_change_passphrase.disconnect(connect2_id) -        self.edit_key_keyinfo.remove(table) - -    def on_set_owner_trust_activate(self, obj): -        "Callback for 'Set Owner Trust' menu item" -        keys = self.get_selected_keys() -        if len(keys) != 1: -            return - -        key_info = keys[0][-1] -        table = labels2table(key_info.key_print_labels()) -        self.ownertrust_key.add(table) -        self.ownertrust_key.show_all() -        trust = key_info.key.owner_trust -        if trust < 0 or trust not in trusts: -            trust = validity.UNDEFINED -        getattr(self, "ownertrust_"+trusts[trust]).set_active(True) -        if self.popup(self.ownertrust_dialog) == gtk.RESPONSE_OK: -            for trust, name in trusts.items(): -                if getattr(self, "ownertrust_"+name).get_active(): -                    try: -                        context = Context() -                        change_key_trust(context, key_info.key, trust) -                        key_info.key.owner_trust = trust -                        self.on_keys_changed(self.keys_treeview) -                    except errors.GPGMEError as exc: -                        self.error_message(exc)             -                    break -        self.ownertrust_key.remove(table) - -    def import_keys_from_data(self, data): -        "Helper function to import keys into application from a Data() object" -        context = Context() -        status = context.op_import(data) -        if status: -            self.error_message(status) -        else: -            result = context.op_import_result() -            if result.considered == 0: -                self.error_message(_("No keys were found.")) -            else: -                self.load_keys() -                self.info_message(_("%i public keys read\n" + -                                    "%i public keys imported\n" + -                                    "%i public keys unchanged\n" + -                                    "%i secret keys read\n" + -                                    "%i secret keys imported\n" + -                                    "%i secret keys unchanged") % \ -                                  (result.considered, -                                   result.imported, -                                   result.unchanged, -                                   result.secret_read, -                                   result.secret_imported, -                                   result.secret_unchanged)) - -    def import_from_clipboard(self, clipboard, text, data): -        "Callback to setup extraction of data from a clipboard" -        if text: -            self.import_keys_from_data(Data(text)) - -    def on_paste_activate(self, obj): -        "Callback for 'Paste' menu item" -        gtk.clipboard_get().request_text(self.import_from_clipboard) - -    def on_import_keys_activate(self, obj): -        "Callback for 'Import Keys' menu item" -        import_file = None -        dialog = self.import_file_dialog -        dialog.set_transient_for(self.main_window) -        while import_file == None and dialog.run() == gtk.RESPONSE_OK: -            try: -                import_file = open(dialog.get_filename(), "rb") -            except IOError as strerror: -                self.error_message(strerror, dialog) -                import_file = None -        dialog.hide() -        if import_file != None: -            self.import_keys_from_data(Data(file=import_file)) -            import_file.close() - -    def export_selected_keys(self, armor): -        "Helper function to export selected keys into a Data() object" -        context = Context() -        context.set_armor(armor) -        export_keys = Data() -        for row in self.get_selected_keys(): -            context.op_export(row[-1].key.subkeys[0].fpr, 0, export_keys) -        export_keys.seek(0,0) -        return export_keys -         -    def on_copy_activate(self, obj): -        "Callback for 'Copy' menu item" -        if self.keys_treeview.get_selection().count_selected_rows() > 0: -            export_keys = self.export_selected_keys(True) -            gtk.clipboard_get().set_text(export_keys.read()) - -    def verify_output(self, filename, parent): -        "Helper function to verify that user can write into the filename" -        if os.path.exists(filename): -            if os.path.isdir(filename): -                self.error_message(_("%s is a directory")%filename, parent) -                return False -            else: -                return self.yesno_message(_("The file %s already exists.\n" + -                                            "Do you want to overwrite it?") % -                                          filename, parent) -        return True -         -    def on_export_keys_activate(self, obj): -        "Callback for 'Export Keys' menu item" -        if self.keys_treeview.get_selection().count_selected_rows() < 1: -            return - -        export_file = None -        dialog = self.export_file_dialog -        dialog.set_transient_for(self.main_window) -        while export_file == None and dialog.run() == gtk.RESPONSE_OK: -            filename = dialog.get_filename() -            if self.verify_output(filename, dialog): -                try: -                    export_file = open(filename, "wb") -                except IOError as strerror: -                    self.error_message(strerror, dialog) -                    export_file = None -        dialog.hide() -        if export_file == None: -            return - -        export_keys = self.export_selected_keys(export_armor_cb.get_active()) -        export_file.write(export_keys.read()) -        export_file.close()                 - -    def on_files_changed(self, obj): -        "Callback called when selection of files in filemanager is changed" -        if self.files_treeview.get_selection().count_selected_rows() < 1: -            value = False -        else: -            value = True -        for item in (self.sign, self.verify, self.encrypt, self.decrypt): -            item.set_sensitive(value) - -    def open(self, filename, complain=False): -        "Helper function to add a file into filemanager treeview" -        model = self.files_treeview.get_model() -        row_list = [] -        model.foreach(lambda m,p,i,l: l.append(m[p][0]), row_list) -        if filename in row_list: -            if complain: -                self.file_error_message(_("The file is already open.")) -        else: -            item = model.append([filename]) -            self.files_treeview.get_selection().select_iter(item) -            self.on_files_changed(None)         - -    def on_open_activate(self, obj): -        "Callback for 'Open' menu item" -        if self.file_popup(self.open_file_dialog) == gtk.RESPONSE_OK: -            self.add_file(self.open_file_dialog.get_filename(), True) -        self.open_file_dialog.unselect_all() - -    def get_selected_files(self): -        "Helper function to return selected rows in filemanager treeview" -        return self.get_selected_keys(self.files_treeview) - -    def on_clear_activate(self, obj): -        "Callback for 'Clear' menu item" -        for row in self.get_selected_files(): -            row.model.remove(row.iter) - -    def process_file_start(self, in_name, out_name): -        "Helper function to start asynchronous processing of one file" -        if self.verify_output(out_name, self.filemanager_window): -            try: -                self.in_data = Data(file=in_name) -                self.out_data = Data() -                self.out_name = out_name -                self.file_func(self.in_data, self.out_data) -            except errors.GPGMEError as exc: -                self.file_error_message(exc) - -    def process_file_done(self, status): -        "The function called when asynchronous processing of the file is done." -        try: -            errors.errorcheck(status) -            self.out_data.seek(0,0) -            out_file = file(self.out_name, "wb") -            out_file.write(self.out_data.read()) -            out_file.close() -            self.add_file(self.out_name) -            if self.file_list: -                self.process_file_start(*(self.file_list.pop(0))) -                return True -        except (errors.GPGMEError, IOError) as exc: -            self.file_error_message(exc) - -        # Let python to free the memory. -        self.out_data = None -        self.in_data = None -        self.out_name = None -        self.file_list = [] -        self.file_func = None -        return False - -    def process_files_async(self, file_list, func, label): -        "Helper function to initialize async processing of the file list" -        self.file_list = file_list -        self.file_func = func -        self.progress_func = self.process_file_done -        self.process_file_start(*(self.file_list.pop(0))) -        self.popup_progress_dialog(label, self.filemanager_window) - -    def on_sign_activate(self, obj): -        "Callback for 'Sign' menu item" -        files = self.get_selected_files() -        if not files: return -         -        if self.file_popup(self.sign_dialog) == gtk.RESPONSE_OK: -            context = Context() -            context.set_passphrase_cb(self.password_cb) -            context.set_armor(self.sign_armor_cb.get_active()) -            for rw in self.get_selected_keys(self.sign_with_keys_treeview): -                context.signers_add(rw[-1].key) -            for cb,md,ext in [(self.sign_normal, sig.mode.NORMAL, ".gpg"), -                              (self.sign_clear, sig.mode.CLEAR, ".asc"), -                              (self.sign_separate,sig.mode.DETACH,".sig")]: -                if cb.get_active(): -                    sigmode = md -                    sigext = ext -                    break -            self.progress_context = context -            def sign(x,y):self.progress_context.op_sign_start(x,y,sigmode) -            self.process_files_async([(f[0], f[0]+sigext) for f in files], -                                     sign, _("Signing...")) - -    def verify_file_start(self, in_name, out_name): -        "Helper function to start file signature verification process" -        try: -            self.in_name = in_name -            self.out_name = out_name -            self.signed = Data(file=self.in_name) -            if out_name: -                self.plain1 = Data(file=self.out_name) -                self.plain2 = None -            else: -                self.plain1 = None -                self.plain2 = Data() -            self.progress_context.op_verify_start(self.signed, self.plain1, -                                                  self.plain2) -        except errors.GPGMEError as exc: -            self.file_error_message(exc) - -    def verify_file_done(self, status): -        "The function called when asynchronous file signature verify is done." -        try: -            errors.errorcheck(status) -            result = self.progress_context.op_verify_result() - -            model = gtk.ListStore(str, str, str) -            treeview = gtk.TreeView(model) -            treeview.set_rules_hint(True) -            for index, title in enumerate([_("Key ID"), _("Status"), -                                           _("User Name")]): -                treeview.append_column(gtk.TreeViewColumn( -                    title, gtk.CellRendererText(), text=index)) -            for sign in result.signatures: -                key = self.progress_context.get_key(sign.fpr, 0) -                if key and key.uids: -                    keyid = key.subkeys[0].keyid[-8:] -                    userid = key.uids[0].uid -                else: -                    keyid = sign.fpr[-8:] -                    userid = _("[Unknown user ID]") -                model.append([keyid, sigsum2str(sign.summary), userid]) -                     -            vbox = gtk.VBox() -            if self.out_name: -                vbox.add(gtk.Label(_("Verified data in file: %s") % -                                   self.out_name)) -            label = gtk.Label(_("Signatures:")) -            label.set_alignment(0, 1) -            vbox.add(label) -            vbox.add(treeview) -            self.verified.append((vbox, gtk.Label(self.in_name))) -            if self.file_list: -                self.verify_file_start(*(self.file_list.pop(0))) -                return True -        except errors.GPGMEError as exc: -            self.file_error_message(exc) - -        # Let python to free the memory. -        self.signed = None -        self.plain1 = None -        self.plain2 = None -        self.in_name = None -        self.out_name = None -        self.file_list = [] -        self.progress_dialog.hide() -         -        if self.verified: -            notebook = gtk.Notebook() -            for page in self.verified: notebook.append_page(*page) -            self.verify_result.add(notebook) -            self.verify_result.show_all() -            self.file_popup(self.verify_dialog) -            self.verify_result.remove(notebook) -            self.verified = [] -         -        return False - -    def on_verify_activate(self, obj): -        "Callback for 'Verify' menu item" -        files = self.get_selected_files() -        if not files: return -         -        self.file_list = [] -        for onefile in files: -            in_name = onefile[0] -            if in_name[-4:] == ".sig": -                out_name = in_name[:-4] -            elif in_name[-5:] == ".sign": -                out_name = in_name[:-5] -            else: -                out_name = None -            self.file_list.append((in_name, out_name)) -        self.verified = [] -        self.progress_context = Context() -        self.progress_func = self.verify_file_done -        self.verify_file_start(*(self.file_list.pop(0))) -        self.popup_progress_dialog(_("Verifying..."), self.filemanager_window) - -    def on_encrypt_sign_toggled(self, cb): -        "Callback for change of the 'Sign' check box in 'Encrypt files' dialog" -        self.encrypt_with_keys_treeview.set_sensitive(cb.get_active()) - -    def on_encrypt_activate(self, obj): -        "Callback for 'Encrypt' menu item" -        files = self.get_selected_files() -        if not files: return -         -        self.on_encrypt_sign_toggled(self.encrypt_sign_cb) -        if self.file_popup(self.encrypt_dialog) == gtk.RESPONSE_OK: -            context = Context() -            context.set_passphrase_cb(self.password_cb) -            if self.encrypt_armor_cb.get_active(): -                context.set_armor(True) -                ext = ".asc" -            else: -                context.set_armor(False) -                ext = ".gpg" -            keylist = [row[-1].key for row in self.get_selected_keys( -                self.encrypt_for_keys_treeview)] -            if self.encrypt_sign_cb.get_active(): -                for row in self.get_selected_keys( -                    self.encrypt_with_keys_treeview): -                    context.signers_add(row[-1].key) -                def encrypt(x,y): -                    self.progress_context.op_encrypt_sign_start( -                        keylist, 1, x, y) -            else: -                def encrypt(x,y): -                    self.progress_context.op_encrypt_start( -                        keylist, 1, x, y) -            self.progress_context = context -            self.process_files_async([(f[0], f[0]+sigext) for f in files], -                                     encrypt, _("Encrypting...")) -                 -    def on_decrypt_activate(self, obj): -        "Callback for 'Decrypt' menu item" -        files = self.get_selected_files() -        if not files: return -         -        file_list = [] -        for onefile in self.get_selected_files(): -            in_name = onefile[0] -            if in_name[-4:] in [".asc", ".gpg", ".pgp"]: -                out_name = in_name[:-4] -            else: -                out_name = in_name + ".txt" -            file_list.append((in_name, out_name)) -        self.process_context = Context() -        self.process_files_async(file_list, -                                 self.process_context.op_decrypt_start, -                                 _("Decrypting...")) - -    def on_select_all_files_activate(self, obj): -        "Callback for 'Select All' menu item in filemanager" -        self.files_treeview.get_selection().select_all() - -    def on_keyring_editor_activate(self, obj): -        "Callback for 'Keyring Editor' menu item" -        self.main_window.show() - -    def on_keyring_editor_close_activate(self, obj, event=None): -        "Callback for 'Close' menu item in Keyring Editor" -        if self.filemanager_window.get_property("visible"): -            self.main_window.hide() -            return True -        else: -            self.on_quit_activate(None)     - -    def on_filemanager_activate(self, obj): -        "Callback for 'Filemanager' menu item" -        self.on_files_changed(None) -        self.filemanager_window.show() - -    def on_filemanager_close_activate(self, obj, event=None): -        "Callback for 'Close' menu item in Filemanager" -        if self.main_window.get_property("visible"): -            self.filemanager_window.hide() -            return True -        else: -            self.on_quit_activate(None) - -    def on_about_activate(self, obj): -        "Callback for 'About' menu item" -        self.popup(self.about_dialog) - -    def __repr__(self): -        return self.__class__.__name__ - -    def __getattr__(self, name): -        "Dynamic retrieval of widgets from the glade XML" -        if name.startswith("on_"): -            self.__dict__[name] = lambda x: sys.stderr.write( -                _("Callback %s is not implimented yet\n") % name) -        elif name.startswith("_"): -            return None -        else: -            self.__dict__[name] = self.wtree.get_widget(name) -            return self.__dict__[name] -         -    def __init__(self, path): -        "PyGpa(path) - path is where pygpa.glade file can be found" -        gladefile = os.path.join(path, "pygpa.glade") -        self.wtree = gtk.glade.XML(gladefile, None, gtk.glade.textdomain()) -        self.wtree.signal_autoconnect(self) - -        self.default_key = None -        self.load_keys() -        self.setup_columns() -        self.setup_default_views() -        self.in_progress = {} -         -        gtk.main() - -    def on_quit_activate(self, obj): -        gtk.main_quit() - -PyGpa(os.path.dirname(sys.argv[0])) | 
