1
# pygpgme - a Python wrapper for the gpgme library
2
# Copyright (C) 2006 James Henstridge
4
# This library is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU Lesser General Public
6
# License as published by the Free Software Foundation; either
7
# version 2.1 of the License, or (at your option) any later version.
9
# This library is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
# Lesser General Public License for more details.
14
# You should have received a copy of the GNU Lesser General Public
15
# License along with this library; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
"""Utilities related to editing keys.
20
Currently only contains a utility function for editing the owner trust
21
value of a key in a keyring.
26
__all__ = ['edit_trust']
34
"""Simple base class to wrap 'edit key' interactions"""
40
self.state = self.STATE_START
42
# a default state transition to try and quit the edit on error
43
self.addTransition(self.STATE_ERROR,
44
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
45
self.STATE_ERROR, 'quit\n')
47
def addTransition(self, state, status, args, newstate, data):
48
self.transitions[state, status, args] = newstate, data
50
def do_edit(self, ctx, key):
51
output = StringIO.StringIO()
52
ctx.edit(key, self.callback, output)
54
def callback(self, status, args, fd):
55
if status in (gpgme.STATUS_EOF,
57
gpgme.STATUS_NEED_PASSPHRASE,
58
gpgme.STATUS_GOOD_PASSPHRASE,
59
gpgme.STATUS_BAD_PASSPHRASE,
60
gpgme.STATUS_USERID_HINT,
61
gpgme.STATUS_SIGEXPIRED,
62
gpgme.STATUS_KEYEXPIRED,
63
gpgme.STATUS_PROGRESS,
64
gpgme.STATUS_KEY_CREATED,
65
gpgme.STATUS_ALREADY_SIGNED):
68
#print 'S: %s (%d)' % (args, status)
70
if (self.state, status, args) in self.transitions:
71
self.state, data = self.transitions[self.state, status, args]
76
self.state = STATE_ERROR
77
raise gpgme.error(gpgme.ERR_SOURCE_UNKNOWN, gpgme.ERR_GENERAL)
80
class _EditTrust(_EditData):
87
def __init__(self, trust):
88
_EditData.__init__(self)
90
self.addTransition(self.STATE_START,
91
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
92
self.STATE_COMMAND, 'trust\n')
94
self.addTransition(self.STATE_COMMAND,
95
gpgme.STATUS_GET_LINE, 'edit_ownertrust.value',
96
self.STATE_VALUE, '%d\n' % trust)
98
self.addTransition(self.STATE_VALUE,
99
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
100
self.STATE_QUIT, 'quit\n')
102
self.addTransition(self.STATE_VALUE,
103
gpgme.STATUS_GET_BOOL, 'edit_ownertrust.set_ultimate.okay',
104
self.STATE_CONFIRM, 'Y\n')
106
self.addTransition(self.STATE_CONFIRM,
107
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
108
self.STATE_QUIT, 'quit\n')
110
self.addTransition(self.STATE_QUIT,
111
gpgme.STATUS_GET_BOOL, 'keyedit.save.okay',
112
self.STATE_CONFIRM, 'Y\n')
114
class _EditSign(_EditData):
120
def __init__(self, index, command, expire, check):
121
_EditData.__init__(self)
123
self.addTransition(self.STATE_START,
124
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
125
self.STATE_UID, 'uid %d\n' % index)
127
self.addTransition(self.STATE_UID,
128
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
129
self.STATE_COMMAND, '%s\n' % command)
131
self.addTransition(self.STATE_COMMAND,
132
gpgme.STATUS_GET_BOOL, 'keyedit.sign_all.okay',
133
self.STATE_COMMAND, 'Y\n')
134
self.addTransition(self.STATE_COMMAND,
135
gpgme.STATUS_GET_LINE, 'sign_uid.expire',
136
self.STATE_COMMAND, '%s\n' % (expire and 'Y' or 'N'))
137
self.addTransition(self.STATE_COMMAND,
138
gpgme.STATUS_GET_LINE, 'sign_uid.class',
139
self.STATE_COMMAND, '%d\n' % check)
140
self.addTransition(self.STATE_COMMAND,
141
gpgme.STATUS_GET_BOOL, 'sign_uid.okay',
142
self.STATE_COMMAND, 'Y\n')
143
self.addTransition(self.STATE_COMMAND,
144
gpgme.STATUS_GET_LINE, 'keyedit.prompt',
145
self.STATE_QUIT, 'quit\n')
147
self.addTransition(self.STATE_QUIT,
148
gpgme.STATUS_GET_BOOL, 'keyedit.save.okay',
149
self.STATE_COMMAND, 'Y\n')
152
def edit_trust(ctx, key, trust):
153
if trust not in (gpgme.VALIDITY_UNDEFINED,
154
gpgme.VALIDITY_NEVER,
155
gpgme.VALIDITY_MARGINAL,
157
gpgme.VALIDITY_ULTIMATE):
158
raise ValueError('Bad trust value %d' % trust)
159
statemachine = _EditTrust(trust)
160
statemachine.do_edit(ctx, key)
162
def edit_sign(ctx, key, index=0, local=False, norevoke=False,
163
expire=True, check=0):
164
"""Sign the given key.
166
index: the index of the user ID to sign, starting at 1. Sign all
167
user IDs if set to 0.
168
local: make a local signature
169
norevoke: make a non-revokable signature
170
command: the type of signature. One of sign, lsign, tsign or nrsign.
171
expire: whether the signature should expire with the key.
172
check: Amount of checking performed. One of:
178
if index < 0 or index > len(key.uids):
179
raise ValueError('user ID index out of range')
182
command = 'l%s' % command
184
command = 'nr%s' % command
185
if check not in [0, 1, 2, 3]:
186
raise ValueError('check must be one of 0, 1, 2, 3')
187
statemachine = _EditSign(index, command, expire, check)
188
statemachine.do_edit(ctx, key)