python: Rename compiled SWIG module.
[gpgme.git] / lang / python / pyme / errors.py
1 # Copyright (C) 2004 Igor Belyi <belyi@users.sourceforge.net>
2 # Copyright (C) 2002 John Goerzen <jgoerzen@complete.org>
3 #
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.
8 #
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.
13 #
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
17
18 from . import gpgme
19 from . import util
20
21 util.process_constants('GPG_ERR_', globals())
22
23 class PymeError(Exception):
24     pass
25
26 class GPGMEError(PymeError):
27     def __init__(self, error = None, message = None):
28         self.error = error
29         self.message = message
30
31     @classmethod
32     def fromSyserror(cls):
33         return cls(gpgme.gpgme_err_code_from_syserror())
34
35     def getstring(self):
36         message = "%s: %s" % (gpgme.gpgme_strsource(self.error),
37                               gpgme.gpgme_strerror(self.error))
38         if self.message != None:
39             message = "%s: %s" % (self.message, message)
40         return message
41
42     def getcode(self):
43         return gpgme.gpgme_err_code(self.error)
44
45     def getsource(self):
46         return gpgme.gpgme_err_source(self.error)
47
48     def __str__(self):
49         return self.getstring()
50
51 def errorcheck(retval, extradata = None):
52     if retval:
53         raise GPGMEError(retval, extradata)
54
55 # These errors are raised in the idiomatic interface code.
56
57 class EncryptionError(PymeError):
58     pass
59
60 class InvalidRecipients(EncryptionError):
61     def __init__(self, recipients):
62         self.recipients = recipients
63     def __str__(self):
64         return ", ".join("{}: {}".format(r.fpr,
65                                          gpgme.gpgme_strerror(r.reason))
66                          for r in self.recipients)
67
68 class DeryptionError(PymeError):
69     pass
70
71 class UnsupportedAlgorithm(DeryptionError):
72     def __init__(self, algorithm):
73         self.algorithm = algorithm
74     def __str__(self):
75         return self.algorithm
76
77 class SigningError(PymeError):
78     pass
79
80 class InvalidSigners(SigningError):
81     def __init__(self, signers):
82         self.signers = signers
83     def __str__(self):
84         return ", ".join("{}: {}".format(s.fpr,
85                                          gpgme.gpgme_strerror(s.reason))
86                          for s in self.signers)
87
88 class VerificationError(PymeError):
89     pass
90
91 class BadSignatures(VerificationError):
92     def __init__(self, result):
93         self.result = result
94     def __str__(self):
95         return ", ".join("{}: {}".format(s.fpr,
96                                          gpgme.gpgme_strerror(s.status))
97                          for s in self.result.signatures
98                          if s.status != NO_ERROR)
99
100 class MissingSignatures(VerificationError):
101     def __init__(self, result, missing):
102         self.result = result
103         self.missing = missing
104     def __str__(self):
105         return ", ".join(k.subkeys[0].fpr for k in self.missing)