diff options
Diffstat (limited to 'lang/python/pyme')
-rw-r--r-- | lang/python/pyme/core.py | 10 | ||||
-rw-r--r-- | lang/python/pyme/errors.py | 22 |
2 files changed, 28 insertions, 4 deletions
diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py index cd5217f3..f0eab436 100644 --- a/lang/python/pyme/core.py +++ b/lang/python/pyme/core.py @@ -680,11 +680,19 @@ class Context(GpgmeWrapper): -- the matching key Raises: + KeyError -- if the key was not found GPGMEError -- as signaled by the underlying library """ ptr = gpgme.new_gpgme_key_t_p() - errorcheck(gpgme.gpgme_get_key(self.wrapped, fpr, ptr, secret)) + + try: + errorcheck(gpgme.gpgme_get_key(self.wrapped, fpr, ptr, secret)) + except errors.GPGMEError as e: + if e.getcode() == errors.EOF: + raise errors.KeyNotFound(fpr) + raise e + key = gpgme.gpgme_key_t_p_value(ptr) gpgme.delete_gpgme_key_t_p(ptr) assert key diff --git a/lang/python/pyme/errors.py b/lang/python/pyme/errors.py index e26c7476..0fd85efa 100644 --- a/lang/python/pyme/errors.py +++ b/lang/python/pyme/errors.py @@ -21,10 +21,12 @@ del absolute_import, print_function, unicode_literals from . import gpgme from . import util -util.process_constants('GPG_ERR_', globals()) +# To appease static analysis tools, we define some constants here. +# They are overwritten with the proper values by process_constants. +NO_ERROR = None +EOF = None -# To appease static analysis tools, we define some constants here: -NO_ERROR = 0 +util.process_constants('GPG_ERR_', globals()) class PymeError(Exception): pass @@ -58,6 +60,20 @@ def errorcheck(retval, extradata = None): if retval: raise GPGMEError(retval, extradata) +class KeyNotFound(GPGMEError, KeyError): + """Raised if a key was not found + + GPGME indicates this condition with EOF, which is not very + idiomatic. We raise this error that is both a GPGMEError + indicating EOF, and a KeyError. + + """ + def __init__(self, keystr): + self.keystr = keystr + GPGMEError.__init__(self, EOF) + def __str__(self): + return self.keystr + # These errors are raised in the idiomatic interface code. class EncryptionError(PymeError): |