2016-06-14 15:33:12 +00:00
|
|
|
# Robust result objects
|
|
|
|
#
|
|
|
|
# Copyright (C) 2016 g10 Code GmbH
|
|
|
|
#
|
|
|
|
# This file is part of GPGME.
|
|
|
|
#
|
|
|
|
# GPGME is free software; you can redistribute it and/or modify it
|
|
|
|
# under the terms of the GNU Lesser General Public License as
|
|
|
|
# published by the Free Software Foundation; either version 2.1 of the
|
|
|
|
# License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# GPGME is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
|
|
|
# Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
|
|
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-09-14 09:39:00 +00:00
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
del absolute_import, print_function, unicode_literals
|
|
|
|
|
2016-06-14 15:33:12 +00:00
|
|
|
"""Robust result objects
|
|
|
|
|
|
|
|
Results returned by the underlying library are fragile, i.e. they are
|
|
|
|
only valid until the next operation is performed in the context.
|
|
|
|
|
|
|
|
We cannot arbitrarily constrain the lifetime of Python objects, we
|
|
|
|
therefore create deep copies of the results.
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
class Result(object):
|
|
|
|
"""Result object
|
|
|
|
|
|
|
|
Describes the result of an operation.
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
"""Convert to types"""
|
|
|
|
_type = {}
|
|
|
|
|
|
|
|
"""Map functions over list attributes"""
|
|
|
|
_map = {}
|
|
|
|
|
|
|
|
"""Automatically copy unless blacklisted"""
|
|
|
|
_blacklist = {
|
|
|
|
'acquire', 'append', 'disown', 'next', 'own', 'this', 'thisown',
|
|
|
|
}
|
|
|
|
def __init__(self, fragile):
|
|
|
|
for key, func in self._type.items():
|
2016-07-11 10:29:17 +00:00
|
|
|
if hasattr(fragile, key):
|
|
|
|
setattr(self, key, func(getattr(fragile, key)))
|
2016-06-14 15:33:12 +00:00
|
|
|
|
|
|
|
for key, func in self._map.items():
|
2016-07-11 10:29:17 +00:00
|
|
|
if hasattr(fragile, key):
|
|
|
|
setattr(self, key, list(map(func, getattr(fragile, key))))
|
2016-06-14 15:33:12 +00:00
|
|
|
|
|
|
|
for key in dir(fragile):
|
|
|
|
if key.startswith('_') or key in self._blacklist:
|
|
|
|
continue
|
|
|
|
if hasattr(self, key):
|
|
|
|
continue
|
|
|
|
|
|
|
|
setattr(self, key, getattr(fragile, key))
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return '<{} {}>'.format(
|
|
|
|
self.__class__.__name__,
|
|
|
|
', '.join('{}: {}'.format(k, getattr(self, k))
|
|
|
|
for k in dir(self) if not k.startswith('_')))
|
|
|
|
|
|
|
|
class InvalidKey(Result):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class EncryptResult(Result):
|
|
|
|
_map = dict(invalid_recipients=InvalidKey)
|
|
|
|
|
|
|
|
class Recipient(Result):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class DecryptResult(Result):
|
|
|
|
_type = dict(wrong_key_usage=bool)
|
|
|
|
_map = dict(recipients=Recipient)
|
|
|
|
|
|
|
|
class NewSignature(Result):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class SignResult(Result):
|
|
|
|
_map = dict(invalid_signers=InvalidKey, signatures=NewSignature)
|
|
|
|
|
|
|
|
class Notation(Result):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class Signature(Result):
|
|
|
|
_type = dict(wrong_key_usage=bool, chain_model=bool)
|
2016-09-14 12:32:48 +00:00
|
|
|
_map = dict(notations=Notation)
|
2016-06-14 15:33:12 +00:00
|
|
|
|
|
|
|
class VerifyResult(Result):
|
|
|
|
_map = dict(signatures=Signature)
|
|
|
|
|
|
|
|
class ImportStatus(Result):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class ImportResult(Result):
|
|
|
|
_map = dict(imports=ImportStatus)
|
|
|
|
|
|
|
|
class GenkeyResult(Result):
|
|
|
|
_type = dict(primary=bool, sub=bool)
|
|
|
|
|
|
|
|
class KeylistResult(Result):
|
|
|
|
_type = dict(truncated=bool)
|
|
|
|
|
|
|
|
class VFSMountResult(Result):
|
|
|
|
pass
|
2016-07-28 09:16:35 +00:00
|
|
|
|
|
|
|
class EngineInfo(Result):
|
|
|
|
pass
|