From d400d0bd76ba01db0df3a14cb1291b26b3747e11 Mon Sep 17 00:00:00 2001 From: vtexier <vit@free.fr> Date: Sat, 28 Mar 2020 23:29:44 +0100 Subject: [PATCH] [enh] #798 use only pubkey in evaluate_condition to allow it before entering credentials --- src/sakia/gui/sub/transfer/controller.py | 6 ++- src/sakia/services/documents.py | 4 +- src/sakia/services/sources.py | 27 +++++++--- tests/unit/services/test_sources.py | 66 ++++++++++++++++++------ 4 files changed, 76 insertions(+), 27 deletions(-) diff --git a/src/sakia/gui/sub/transfer/controller.py b/src/sakia/gui/sub/transfer/controller.py index c1e19e6b..e15713fa 100644 --- a/src/sakia/gui/sub/transfer/controller.py +++ b/src/sakia/gui/sub/transfer/controller.py @@ -334,7 +334,11 @@ class TransferController(QObject): source = self.model.current_source condition = pypeg2.parse(source.conditions, Condition) result, _errors = self.model.app.sources_service.evaluate_condition( - self.model.app.currency, condition, [], [], source.identifier + self.model.app.currency, + condition, + [self.model.connection.pubkey], + [], + source.identifier, ) if result: message = QCoreApplication.translate( diff --git a/src/sakia/services/documents.py b/src/sakia/services/documents.py index fc9e98bf..2ca92823 100644 --- a/src/sakia/services/documents.py +++ b/src/sakia/services/documents.py @@ -302,7 +302,7 @@ class DocumentsService: :param int amount: The amount target value :param int amount_base: The amount base target value :param str currency: The community target of the transaction - :param str key: The key owning the sources + :param SigningKey key: The key owning the sources :return: The list of inputs to use in the transaction document """ @@ -332,7 +332,7 @@ class DocumentsService: condition = pypeg2.parse(s.conditions, Condition) # evaluate the condition result, _ = self._sources_services.evaluate_condition( - currency, condition, [key], [], s.identifier + currency, condition, [key.pubkey], [], s.identifier ) if not result: continue diff --git a/src/sakia/services/sources.py b/src/sakia/services/sources.py index 152066ee..7e5a8a32 100644 --- a/src/sakia/services/sources.py +++ b/src/sakia/services/sources.py @@ -279,7 +279,7 @@ class SourcesServices(QObject): self, currency: str, condition: Condition, - keys: list, + pubkeys: list, passwords: list, identifier: str, result: bool = False, @@ -291,11 +291,12 @@ class SourcesServices(QObject): :param str currency: Name of currency :param Condition condition: Condition instance - :param [SigningKey] keys: Keys to unlock condition + :param [str] pubkeys: Keys to unlock condition :param [str] passwords: List of passwords :param str identifier: Source transaction identifier :param bool result: Evaluation result accumulator - :param [tuple] _errors: List of tuple with parameters returning false (parameter: str, message: str, param: int) + :param [tuple] _errors: List of tuple with infos on condition returning false (condition: str, message: str, + param: str|int) :return: """ left = False @@ -304,17 +305,29 @@ class SourcesServices(QObject): if isinstance(condition.left, Condition): # evaluate condition left, _errors = self.evaluate_condition( - currency, condition.left, keys, passwords, identifier, result, _errors + currency, + condition.left, + pubkeys, + passwords, + identifier, + result, + _errors, ) # if right param is a condition... if isinstance(condition.right, Condition): # evaluate condition right, _errors = self.evaluate_condition( - currency, condition.right, keys, passwords, identifier, result, _errors + currency, + condition.right, + pubkeys, + passwords, + identifier, + result, + _errors, ) # if left param is a SIG... if isinstance(condition.left, SIG): - if condition.left.pubkey in (key.pubkey for key in keys): + if condition.left.pubkey in pubkeys: left = True else: if _errors is None: @@ -388,7 +401,7 @@ class SourcesServices(QObject): # if right param is a SIG... if isinstance(condition.right, SIG): - if condition.right.pubkey in (key.pubkey for key in keys): + if condition.right.pubkey in pubkeys: right = True else: if _errors is None: diff --git a/tests/unit/services/test_sources.py b/tests/unit/services/test_sources.py index e42fc7c2..2a098a52 100644 --- a/tests/unit/services/test_sources.py +++ b/tests/unit/services/test_sources.py @@ -127,7 +127,11 @@ def test_evaluate_condition_source_lock_mode_0( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [bob.key], [], tx_hash + application_with_one_connection.currency, + condition, + [bob.key.pubkey], + [], + tx_hash, ) assert result is True assert _errors is None @@ -137,7 +141,11 @@ def test_evaluate_condition_source_lock_mode_0( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [alice.key], [], tx_hash, + application_with_one_connection.currency, + condition, + [alice.key.pubkey], + [], + tx_hash, ) assert result is False assert _errors == [ @@ -215,7 +223,11 @@ def test_evaluate_condition_source_lock_mode_1( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [bob.key], [], tx_hash + application_with_one_connection.currency, + condition, + [bob.key.pubkey], + [], + tx_hash, ) assert result is True assert _errors == [ @@ -232,7 +244,11 @@ def test_evaluate_condition_source_lock_mode_1( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [alice.key], [], tx_hash, + application_with_one_connection.currency, + condition, + [alice.key.pubkey], + [], + tx_hash, ) assert result is False assert _errors == [ @@ -289,7 +305,11 @@ def test_evaluate_condition_source_lock_mode_1( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [bob.key], [], tx_hash + application_with_one_connection.currency, + condition, + [bob.key.pubkey], + [], + tx_hash, ) assert result is True assert _errors == [ @@ -305,7 +325,11 @@ def test_evaluate_condition_source_lock_mode_1( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [alice.key], [], tx_hash, + application_with_one_connection.currency, + condition, + [alice.key.pubkey], + [], + tx_hash, ) assert result is True assert _errors == [ @@ -378,7 +402,11 @@ def test_evaluate_condition_source_multisig( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [bob.key], [], tx_hash + application_with_one_connection.currency, + condition, + [bob.key.pubkey], + [], + tx_hash, ) assert result is False assert _errors == [ @@ -394,7 +422,11 @@ def test_evaluate_condition_source_multisig( result, _errors, ) = application_with_one_connection.sources_service.evaluate_condition( - application_with_one_connection.currency, condition, [alice.key], [], tx_hash, + application_with_one_connection.currency, + condition, + [alice.key.pubkey], + [], + tx_hash, ) assert result is False assert _errors == [ @@ -412,7 +444,7 @@ def test_evaluate_condition_source_multisig( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, condition, - [alice.key, bob.key], + [alice.key.pubkey, bob.key.pubkey], [], tx_hash, ) @@ -570,7 +602,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx2_condition, - [alice.key], + [alice.key.pubkey], [password], tx2_hash, ) @@ -597,7 +629,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx1_condition, - [bob.key], + [bob.key.pubkey], [password], tx1_hash, ) @@ -623,7 +655,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx1_condition, - [bob.key, alice.key], + [bob.key.pubkey, alice.key.pubkey], [password], tx1_hash, ) @@ -639,7 +671,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx2_condition, - [bob.key, alice.key], + [bob.key.pubkey, alice.key.pubkey], [password], tx2_hash, ) @@ -655,7 +687,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx2_condition, - [alice.key], + [alice.key.pubkey], [], tx2_hash, ) @@ -686,7 +718,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx1_condition, - [bob.key], + [bob.key.pubkey], [], tx1_hash, ) @@ -797,7 +829,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx1_condition, - [alice.key], + [alice.key.pubkey], [], tx1_hash, ) @@ -827,7 +859,7 @@ def test_evaluate_condition_source_atomic_swap( ) = application_with_one_connection.sources_service.evaluate_condition( application_with_one_connection.currency, tx2_condition, - [bob.key], + [bob.key.pubkey], [], tx2_hash, ) -- GitLab