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