1from _sequoia import ffi, lib
2from .glue import sq_str
3
4class Error(Exception):
5    @classmethod
6    def _from(cls, o):
7        if o == ffi.NULL:
8            return MalformedValue()
9
10        status = lib.pgp_error_status(o)
11        return _status_map[status](o)
12
13    @classmethod
14    def _last(cls, ctx):
15        if not ctx:
16            return MalformedValue()
17        return Error._from(lib.sq_context_last_error(ctx.ref()))
18
19class MalformedValue(Error, ValueError):
20    def __init__(self, message="Malformed value"):
21        super(MalformedValue, self).__init__(message)
22
23class SQError(Error):
24    def __init__(self, o):
25        self.__o = ffi.gc(o, lib.pgp_error_free)
26        super(SQError, self).__init__(sq_str(lib.pgp_error_to_string(self.__o)))
27
28class Success(SQError):
29    pass
30
31class UnknownError(SQError):
32    pass
33
34class NetworkPolicyViolation(SQError):
35    pass
36
37class IoError(SQError):
38    pass
39
40class InvalidOperataion(SQError):
41    pass
42
43class MalformedPacket(SQError):
44    pass
45
46class UnsupportedHashAlgorithm(SQError):
47    pass
48
49class UnsupportedSymmetricAlgorithm(SQError):
50    pass
51
52class InvalidPassword(SQError):
53    pass
54
55class InvalidSessionKey(SQError):
56    pass
57
58_status_map = {
59    lib.PGP_STATUS_SUCCESS: Success,
60    lib.PGP_STATUS_UNKNOWN_ERROR: UnknownError,
61    lib.PGP_STATUS_NETWORK_POLICY_VIOLATION: NetworkPolicyViolation,
62    lib.PGP_STATUS_IO_ERROR: IoError,
63    lib.PGP_STATUS_INVALID_OPERATION: InvalidOperataion,
64    lib.PGP_STATUS_MALFORMED_PACKET: MalformedPacket,
65    lib.PGP_STATUS_UNSUPPORTED_HASH_ALGORITHM: UnsupportedHashAlgorithm,
66    lib.PGP_STATUS_UNSUPPORTED_SYMMETRIC_ALGORITHM: UnsupportedSymmetricAlgorithm,
67    lib.PGP_STATUS_INVALID_PASSWORD: InvalidPassword,
68    lib.PGP_STATUS_INVALID_SESSION_KEY: InvalidSessionKey,
69}
70