Add class attrs and docs to Verify, add new _parsers.Crypt class.
parent
bac7e52fc0
commit
9aa7ad8c69
|
@ -958,6 +958,37 @@ class Verify(object):
|
||||||
"TRUST_FULLY" : TRUST_FULLY,
|
"TRUST_FULLY" : TRUST_FULLY,
|
||||||
"TRUST_ULTIMATE" : TRUST_ULTIMATE,}
|
"TRUST_ULTIMATE" : TRUST_ULTIMATE,}
|
||||||
|
|
||||||
|
#: True if the signature is valid, False otherwise.
|
||||||
|
valid = False
|
||||||
|
#: A string describing the status of the signature verification.
|
||||||
|
#: Can be one of ``'signature bad'``, ``'signature good'``,
|
||||||
|
#: ``'signature valid'``, ``'signature error'``, ``'decryption failed'``,
|
||||||
|
#: ``'no public key'``, ``'key exp'``, or ``'key rev'``.
|
||||||
|
status = None
|
||||||
|
#: The fingerprint of the signing keyid.
|
||||||
|
fingerprint = None
|
||||||
|
#: The fingerprint of the corresponding public key, which may be different
|
||||||
|
#: if the signature was created with a subkey.
|
||||||
|
pubkey_fingerprint = None
|
||||||
|
#: The keyid of the signing key.
|
||||||
|
key_id = None
|
||||||
|
#: The id of the signature itself.
|
||||||
|
signature_id = None
|
||||||
|
#: The creation date of the signing key.
|
||||||
|
creation_date = None
|
||||||
|
#: The timestamp of the purported signature, if we are unable to parse it.
|
||||||
|
timestamp = None
|
||||||
|
#: The userid of the signing key which was used to create the signature.
|
||||||
|
username = None
|
||||||
|
#: When the signing key is due to expire.
|
||||||
|
expire_timestamp = None
|
||||||
|
#: The timestamp for when the signature was created.
|
||||||
|
sig_timestamp = None
|
||||||
|
#: A number 0-4 describing the trust level of the signature.
|
||||||
|
trust_level = None
|
||||||
|
#: The string corresponding to the ``trust_level`` number.
|
||||||
|
trust_text = None
|
||||||
|
|
||||||
def __init__(self, gpg):
|
def __init__(self, gpg):
|
||||||
self.gpg = gpg
|
self.gpg = gpg
|
||||||
self.valid = False
|
self.valid = False
|
||||||
|
@ -1040,6 +1071,73 @@ class Verify(object):
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unknown status message: %r" % key)
|
raise ValueError("Unknown status message: %r" % key)
|
||||||
|
|
||||||
|
|
||||||
|
class Crypt(Verify):
|
||||||
|
"""Parser for internal status messages from GnuPG for ``--encrypt``,
|
||||||
|
``--decrypt``, and ``--decrypt-files``.
|
||||||
|
"""
|
||||||
|
def __init__(self, gpg):
|
||||||
|
Verify.__init__(self, gpg)
|
||||||
|
self.gpg = gpg
|
||||||
|
self.data = ''
|
||||||
|
self.ok = False
|
||||||
|
self.status = ''
|
||||||
|
self.data_format = None
|
||||||
|
self.data_timestamp = None
|
||||||
|
self.data_filename = None
|
||||||
|
|
||||||
|
def __nonzero__(self):
|
||||||
|
if self.ok: return True
|
||||||
|
return False
|
||||||
|
__bool__ = __nonzero__
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.data.decode(self.gpg.encoding, self.gpg._decode_errors)
|
||||||
|
|
||||||
|
def handle_status(self, key, value):
|
||||||
|
"""Parse a status code from the attached GnuPG process.
|
||||||
|
|
||||||
|
:raises: :exc:`ValueError` if the status message is unknown.
|
||||||
|
"""
|
||||||
|
if key in ("ENC_TO", "USERID_HINT", "GOODMDC", "END_DECRYPTION",
|
||||||
|
"BEGIN_SIGNING", "NO_SECKEY", "ERROR", "NODATA",
|
||||||
|
"CARDCTRL"):
|
||||||
|
# in the case of ERROR, this is because a more specific error
|
||||||
|
# message will have come first
|
||||||
|
pass
|
||||||
|
elif key in ("NEED_PASSPHRASE", "BAD_PASSPHRASE", "GOOD_PASSPHRASE",
|
||||||
|
"MISSING_PASSPHRASE", "DECRYPTION_FAILED",
|
||||||
|
"KEY_NOT_CREATED"):
|
||||||
|
self.status = key.replace("_", " ").lower()
|
||||||
|
elif key == "NEED_PASSPHRASE_SYM":
|
||||||
|
self.status = 'need symmetric passphrase'
|
||||||
|
elif key == "BEGIN_DECRYPTION":
|
||||||
|
self.status = 'decryption incomplete'
|
||||||
|
elif key == "BEGIN_ENCRYPTION":
|
||||||
|
self.status = 'encryption incomplete'
|
||||||
|
elif key == "DECRYPTION_OKAY":
|
||||||
|
self.status = 'decryption ok'
|
||||||
|
self.ok = True
|
||||||
|
elif key == "END_ENCRYPTION":
|
||||||
|
self.status = 'encryption ok'
|
||||||
|
self.ok = True
|
||||||
|
elif key == "INV_RECP":
|
||||||
|
self.status = 'invalid recipient'
|
||||||
|
elif key == "KEYEXPIRED":
|
||||||
|
self.status = 'key expired'
|
||||||
|
elif key == "SIG_CREATED":
|
||||||
|
self.status = 'sig created'
|
||||||
|
elif key == "SIGEXPIRED":
|
||||||
|
self.status = 'sig expired'
|
||||||
|
elif key == "PLAINTEXT":
|
||||||
|
fmt, self.data_timestamp, self.data_filename = value.split(' ', 2)
|
||||||
|
## GnuPG give us a hex byte for an ascii char corresponding to
|
||||||
|
## the data format of the resulting plaintext,
|
||||||
|
## i.e. '62'→'b':= binary data
|
||||||
|
self.data_format = chr(int(str(fmt), 16))
|
||||||
|
else:
|
||||||
|
Verify.handle_status(key, value)
|
||||||
|
|
||||||
class ListPackets(object):
|
class ListPackets(object):
|
||||||
"""
|
"""
|
||||||
Handle status messages for --list-packets.
|
Handle status messages for --list-packets.
|
||||||
|
|
Loading…
Reference in New Issue