05fa2a9c77
* NEWS: Update. * lang/cpp/src/decryptionresult.cpp (DecryptionResult::isDeVs): New function. * lang/cpp/src/decryptionresult.h (DecryptionResult::isDeVs): New prototype. * lang/cpp/src/verificationresult.cpp (Signature::isDeVs): New function. * lang/cpp/src/verificationresult.h (Signature::isDeVs): New prototype. * lang/python/src/results.py (DecryptResult): Turn field 'is_de_vs' into a boolean. (Signature): Likewise. * src/decrypt.c (_gpgme_decrypt_status_handler): Handle the new compliance status line. * src/verify.c (_gpgme_verify_status_handler): Likewise. * src/gpgme.h.in (gpgme_status_code_t): Add new status codes for the new status lines. * src/keylist.c (parse_pub_field18): Move function to 'util.h'. (keylist_colon_handler): Adapt callsites. * src/status-table.c (status_table): Add new status lines. * src/util.h (PARSE_COMPLIANCE_FLAGS): New macro. This used to be 'parse_pub_field18', but turned into a macro to make it polymorphic. -- When decrypting data and verifying signatures, report whether the operations are in compliance with the criteria for data classified as VS-NfD. This information can the be presented to the user. GnuPG-bug-id: 3059 Signed-off-by: Justus Winter <justus@g10code.com>
119 lines
3.2 KiB
Python
119 lines
3.2 KiB
Python
# 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/>.
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
del absolute_import, print_function, unicode_literals
|
|
|
|
"""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():
|
|
if hasattr(fragile, key):
|
|
setattr(self, key, func(getattr(fragile, key)))
|
|
|
|
for key, func in self._map.items():
|
|
if hasattr(fragile, key):
|
|
setattr(self, key, list(map(func, getattr(fragile, key))))
|
|
|
|
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 __repr__(self):
|
|
return '{}({})'.format(
|
|
self.__class__.__name__,
|
|
', '.join('{}={!r}'.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, is_de_vs=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, is_de_vs=bool)
|
|
_map = dict(notations=Notation)
|
|
|
|
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
|
|
|
|
class EngineInfo(Result):
|
|
pass
|