42
50
def sign(self, content):
43
51
raise errors.SigningFailed('Signing is disabled.')
53
def verify(self, content, testament):
54
raise errors.SignatureVerificationFailed('Signature verification is \
57
def set_acceptable_keys(self, key_patterns):
46
61
class LoopbackGPGStrategy(object):
47
62
"""A GPG Strategy that acts like 'cat' - data is just passed through."""
53
68
return ("-----BEGIN PSEUDO-SIGNED CONTENT-----\n" + content +
54
69
"-----END PSEUDO-SIGNED CONTENT-----\n")
71
def verify(self, content, testament):
72
return SIGNATURE_VALID, None
74
def set_acceptable_keys(self, key_patterns):
75
patterns = key_patterns.split(",")
76
self.acceptable_keys = []
77
for pattern in patterns:
78
if pattern == "unknown":
81
self.acceptable_keys.append(pattern)
57
84
def _set_gpg_tty():
58
85
tty = os.environ.get('TTY')
111
140
raise errors.SigningFailed(self._command_line())
144
def verify(self, content, testament):
145
"""Check content has a valid signature.
147
:param content: the commit signature
148
:param testament: the valid testament string for the commit
150
:return: SIGNATURE_VALID or a failed SIGNATURE_ value, key uid if valid
154
except ImportError, error:
155
raise errors.GpgmeNotInstalled(error)
157
context = gpgme.Context()
158
signature = StringIO(content)
159
plain_output = StringIO()
162
result = context.verify(signature, None, plain_output)
163
except gpgme.GpgmeError,error:
164
raise errors.SignatureVerificationFailed(error[2])
167
return SIGNATURE_NOT_VALID, None
168
fingerprint = result[0].fpr
169
if self.acceptable_keys is not None:
170
if not fingerprint in self.acceptable_keys:
171
return SIGNATURE_KEY_MISSING, fingerprint[-8:]
172
if testament != plain_output.getvalue():
173
return SIGNATURE_NOT_VALID, None
174
if result[0].summary & gpgme.SIGSUM_VALID:
175
key = context.get_key(fingerprint)
176
name = key.uids[0].name
177
email = key.uids[0].email
178
return SIGNATURE_VALID, name + " <" + email + ">"
179
if result[0].summary & gpgme.SIGSUM_RED:
180
return SIGNATURE_NOT_VALID, None
181
if result[0].summary & gpgme.SIGSUM_KEY_MISSING:
182
return SIGNATURE_KEY_MISSING, fingerprint[-8:]
183
#summary isn't set if sig is valid but key is untrusted
184
if result[0].summary == 0 and self.acceptable_keys is not None:
185
if fingerprint in self.acceptable_keys:
186
return SIGNATURE_VALID, None
188
return SIGNATURE_KEY_MISSING, None
189
raise errors.SignatureVerificationFailed("Unknown GnuPG key "\
190
"verification result")
192
def set_acceptable_keys(self, key_patterns):
195
except ImportError, error:
196
raise errors.GpgmeNotInstalled(error)
197
patterns = key_patterns.split(",")
199
self.acceptable_keys = []
200
context = gpgme.Context()
201
for pattern in patterns:
202
result = context.keylist(pattern)
206
self.acceptable_keys.append(key.subkeys[0].fpr)
207
trace.mutter("Added acceptable key: " + key.subkeys[0].fpr)
209
trace.note(i18n.gettext(
210
"No GnuPG key results for pattern: {}"