/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
399.3.28 by Daniel Schierbeck
Added license and copyright information to crypt module.
1
# This program is free software; you can redistribute it and/or modify
2
# it under the terms of the GNU General Public License as published by
3
# the Free Software Foundation; either version 2 of the License, or
4
# (at your option) any later version.
5
6
# This program is distributed in the hope that it will be useful,
7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
8
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9
# GNU General Public License for more details.
10
11
# You should have received a copy of the GNU General Public License
12
# along with this program; if not, write to the Free Software
13
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
14
399.3.32 by Daniel Schierbeck
Fixed encoding error.
15
__copyright__ = 'Copyright (C) 2008 Daniel Schierbeck'
399.3.28 by Daniel Schierbeck
Added license and copyright information to crypt module.
16
__author__ = 'Daniel Schierbeck <daniel.schierbeck@gmail.com>'
399.3.4 by Daniel Schierbeck
Moved crypt code to crypt.py.
17
18
import dbus
19
20
BUS_NAME = 'org.gnome.seahorse'
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
21
399.3.4 by Daniel Schierbeck
Moved crypt code to crypt.py.
22
CRYPTO_INTERFACE = 'org.gnome.seahorse.CryptoService'
23
CRYPTO_PATH = '/org/gnome/seahorse/crypto'
24
399.3.5 by Daniel Schierbeck
Added support for key fingerprints.
25
OPENPGP_INTERFACE = 'org.gnome.seahorse.Keys'
26
OPENPGP_PATH = '/org/gnome/seahorse/keys/openpgp'
27
399.3.4 by Daniel Schierbeck
Moved crypt code to crypt.py.
28
KEY_TYPE_OPENPGP = 'openpgp'
29
KEY_TYPE_SSH = 'ssh'
30
498.1.2 by Elliot Murphy
Trying to fix bug 107169 so that visualize can be used even if there are DBus problems which prevent seahorse from being loaded
31
try:
32
    bus = dbus.SessionBus()
33
except dbus.exceptions.DBusException, e:
498.1.6 by Elliot Murphy
Fix stupid typo, add johns latest suggestion.
34
    get_name = getattr(e, 'get_dbus_name', None)
35
    if get_name is not None:
36
        name = get_name()
37
    else:
38
        name = getattr(e, '_dbus_error_name', None)
39
    # DBus sometimes fails like this, just treat it as if seahorse is not
40
    # available rather than crashing.
498.1.5 by Elliot Murphy
Using _dbus_error_name instead of get_dbus_name() to work with older
41
    if name == "org.freedesktop.DBus.Error.Spawn.ExecFailed":
498.1.3 by Elliot Murphy
Match DBus Spawn.ExecFailed exception rather than all DBus exceptions.
42
        raise ImportError
498.1.4 by Elliot Murphy
fix silly typo
43
    else:
498.1.3 by Elliot Murphy
Match DBus Spawn.ExecFailed exception rather than all DBus exceptions.
44
        raise
399.3.27 by Daniel Schierbeck
Only show Signature tab if DBus and Seahorse are installed.
45
487.4.4 by Sabin Iacob (m0n5t3r)
gracefully handle old versions of dbus-python (it appears that DBusException.get_bus_name was introduced in 0.81.1)
46
if hasattr(bus, 'list_activatable_names'):
47
    bus_names = bus.list_activatable_names()
48
else:
49
    bus_object = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
50
    bus_names = bus_object.ListNames(dbus_interface='org.freedesktop.DBus')
51
52
if BUS_NAME not in bus_names:
53
    raise ImportError
54
55
crypto = dbus.Interface(bus.get_object(BUS_NAME, CRYPTO_PATH), 
56
                        CRYPTO_INTERFACE)
57
openpgp = dbus.Interface(bus.get_object(BUS_NAME, OPENPGP_PATH),
58
                         OPENPGP_INTERFACE)
399.3.4 by Daniel Schierbeck
Moved crypt code to crypt.py.
59
399.3.7 by Daniel Schierbeck
Made Seahorse discover unknown keys, and added trust level to the UI.
60
FLAG_VALID = 0x0001
61
FLAG_CAN_ENCRYPT = 0x0002
62
FLAG_CAN_SIGN = 0x0004
63
FLAG_EXPIRED = 0x0100
64
FLAG_REVOKED = 0x0200
65
FLAG_DISABLED = 0x0400
66
FLAG_TRUSTED = 0x1000
67
399.3.6 by Daniel Schierbeck
Added support for key trust.
68
TRUST_NEVER = -1
69
TRUST_UNKNOWN = 0
70
TRUST_MARGINAL = 1
71
TRUST_FULL = 5
72
TRUST_ULTIMATE = 10
73
399.3.24 by Daniel Schierbeck
Added key location getter.
74
LOCATION_MISSING = 10
75
LOCATION_SEARCHING = 20
76
LOCATION_REMOTE = 50
77
LOCATION_LOCAL = 100
78
450.5.3 by Daniel Schierbeck
Made the signature checking code not try to discover the signature key.
79
keyset = dict()
399.3.7 by Daniel Schierbeck
Made Seahorse discover unknown keys, and added trust level to the UI.
80
399.3.4 by Daniel Schierbeck
Moved crypt code to crypt.py.
81
def verify(crypttext):
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
82
    (cleartext, key) = crypto.VerifyText(KEY_TYPE_OPENPGP, 1, crypttext)
83
450.5.3 by Daniel Schierbeck
Made the signature checking code not try to discover the signature key.
84
    if key != "":
85
        if key not in keyset:
86
            keyset[key] = Key(key)
87
88
        return keyset[key]
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
89
90
class Key:
91
92
    def __init__(self, key):
93
        self.key = key
450.5.4 by Daniel Schierbeck
Made the crypt code only use one DBus call to get key fields.
94
450.5.3 by Daniel Schierbeck
Made the signature checking code not try to discover the signature key.
95
        (keys, unmatched) = openpgp.MatchKeys([self.get_id()], 0x00000010)
96
        self.available = (key in keys)
399.3.25 by Daniel Schierbeck
Added discovery of unknown keys.
97
450.5.4 by Daniel Schierbeck
Made the crypt code only use one DBus call to get key fields.
98
        if self.available:
99
            fields = openpgp.GetKeyFields(key, ['fingerprint', 'trust', 'flags', 'display-name', 'location'])
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
100
        else:
450.5.4 by Daniel Schierbeck
Made the crypt code only use one DBus call to get key fields.
101
            fields = dict()
102
103
        self.fingerprint = fields.get('fingerprint', 'N/A')
104
        self.trust = fields.get('trust', TRUST_UNKNOWN)
105
        self.flags = fields.get('flags', 0)
106
        self.display_name = fields.get('display-name', '')
107
        self.location = fields.get('location', LOCATION_MISSING)
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
108
    
109
    def get_flags(self):
110
        return self.flags
111
399.3.10 by Daniel Schierbeck
Added getter for display name field.
112
    def get_display_name(self):
113
        return self.display_name
114
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
115
    def get_id(self):
116
        return self.key.split(':')[1][8:]
117
118
    def get_fingerprint(self):
119
        return self.fingerprint
120
121
    def get_trust(self):
122
        return self.trust
123
399.3.24 by Daniel Schierbeck
Added key location getter.
124
    def get_location(self):
125
        return self.location
126
399.3.11 by Daniel Schierbeck
Fixed error with unavailable keys.
127
    def is_available(self):
450.5.3 by Daniel Schierbeck
Made the signature checking code not try to discover the signature key.
128
        return self.available
399.3.8 by Daniel Schierbeck
Moved crypt code into a Key class.
129
130
    def is_trusted(self):
450.5.4 by Daniel Schierbeck
Made the crypt code only use one DBus call to get key fields.
131
        return self.flags & FLAG_TRUSTED != 0