From 5910ebf2793e4f504422bdea7734e29730045201 Mon Sep 17 00:00:00 2001 From: Tomas Susanka Date: Wed, 13 Jun 2018 13:47:22 +0200 Subject: [PATCH] nem: wire.ProcessError instead of ValueError --- src/apps/nem/validators.py | 116 +++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/src/apps/nem/validators.py b/src/apps/nem/validators.py index 6db3402359..764e5c5402 100644 --- a/src/apps/nem/validators.py +++ b/src/apps/nem/validators.py @@ -1,5 +1,7 @@ from trezor.crypto import nem +from trezor.wire import ProcessError from trezor.messages import NEMModificationType +from trezor.messages import NEMSupplyChangeType from trezor.messages.NEMSignTx import (NEMAggregateModification, NEMImportanceTransfer, NEMMosaicCreation, @@ -15,7 +17,7 @@ from .helpers import (NEM_MAX_DIVISIBILITY, NEM_MAX_ENCRYPTED_PAYLOAD_SIZE, def validate(msg: NEMSignTx): if msg.transaction is None: - raise ValueError('No common provided') + raise ProcessError('No common provided') _validate_single_tx(msg) _validate_common(msg.transaction) @@ -24,7 +26,7 @@ def validate(msg: NEMSignTx): _validate_common(msg.multisig, True) _validate_multisig(msg.multisig, msg.transaction.network) if not msg.multisig and msg.cosigning: - raise ValueError('No multisig transaction to cosign') + raise ProcessError('No multisig transaction to cosign') if msg.transfer: _validate_transfer(msg.transfer, msg.transaction.network) @@ -44,7 +46,7 @@ def validate_network(network: int) -> int: if network is None: return NEM_NETWORK_MAINNET if network not in (NEM_NETWORK_MAINNET, NEM_NETWORK_TESTNET, NEM_NETWORK_MIJIN): - raise ValueError('Invalid NEM network') + raise ProcessError('Invalid NEM network') return network @@ -58,9 +60,9 @@ def _validate_single_tx(msg: NEMSignTx): bool(msg.aggregate_modification) + \ bool(msg.importance_transfer) if tx_count == 0: - raise ValueError('No transaction provided') + raise ProcessError('No transaction provided') if tx_count > 1: - raise ValueError('More than one transaction provided') + raise ProcessError('More than one transaction provided') def _validate_common(common: NEMTransactionCommon, inner: bool = False): @@ -75,16 +77,16 @@ def _validate_common(common: NEMTransactionCommon, inner: bool = False): err = 'deadline' if not inner and common.signer: - raise ValueError('Signer not allowed in outer transaction') + raise ProcessError('Signer not allowed in outer transaction') if inner and common.signer is None: err = 'signer' if err: if inner: - raise ValueError('No %s provided in inner transaction' % err) + raise ProcessError('No %s provided in inner transaction' % err) else: - raise ValueError('No %s provided' % err) + raise ProcessError('No %s provided' % err) if common.signer is not None: _validate_public_key(common.signer, 'Invalid signer public key in inner transaction') @@ -92,20 +94,20 @@ def _validate_common(common: NEMTransactionCommon, inner: bool = False): def _validate_public_key(public_key: bytes, err_msg: str): if not public_key: - raise ValueError('%s (none provided)' % err_msg) + raise ProcessError('%s (none provided)' % err_msg) if len(public_key) != NEM_PUBLIC_KEY_SIZE: - raise ValueError('%s (invalid length)' % err_msg) + raise ProcessError('%s (invalid length)' % err_msg) def _validate_importance_transfer(importance_transfer: NEMImportanceTransfer): if importance_transfer.mode is None: - raise ValueError('No mode provided') + raise ProcessError('No mode provided') _validate_public_key(importance_transfer.public_key, 'Invalid remote account public key provided') def _validate_multisig(multisig: NEMTransactionCommon, network: int): if multisig.network != network: - raise ValueError('Inner transaction network is different') + raise ProcessError('Inner transaction network is different') _validate_public_key(multisig.signer, 'Invalid multisig signer public key provided') @@ -114,124 +116,128 @@ def _validate_aggregate_modification( creation: bool = False): if creation and not aggregate_modification.modifications: - raise ValueError('No modifications provided') + raise ProcessError('No modifications provided') for m in aggregate_modification.modifications: if not m.type: - raise ValueError('No modification type provided') + raise ProcessError('No modification type provided') if m.type not in ( NEMModificationType.CosignatoryModification_Add, NEMModificationType.CosignatoryModification_Delete ): - raise ValueError('Unknown aggregate modification') + raise ProcessError('Unknown aggregate modification') if creation and m.type == NEMModificationType.CosignatoryModification_Delete: - raise ValueError('Cannot remove cosignatory when converting account') + raise ProcessError('Cannot remove cosignatory when converting account') _validate_public_key(m.public_key, 'Invalid cosignatory public key provided') def _validate_supply_change(supply_change: NEMMosaicSupplyChange): if supply_change.namespace is None: - raise ValueError('No namespace provided') + raise ProcessError('No namespace provided') if supply_change.mosaic is None: - raise ValueError('No mosaic provided') + raise ProcessError('No mosaic provided') if supply_change.type is None: - raise ValueError('No type provided') + raise ProcessError('No type provided') + elif supply_change.type not in [NEMSupplyChangeType.SupplyChange_Decrease, NEMSupplyChangeType.SupplyChange_Increase]: + raise ProcessError('Invalid supply change type') if supply_change.delta is None: - raise ValueError('No delta provided') + raise ProcessError('No delta provided') def _validate_mosaic_creation(mosaic_creation: NEMMosaicCreation, network: int): if mosaic_creation.definition is None: - raise ValueError('No mosaic definition provided') + raise ProcessError('No mosaic definition provided') if mosaic_creation.sink is None: - raise ValueError('No creation sink provided') + raise ProcessError('No creation sink provided') if mosaic_creation.fee is None: - raise ValueError('No creation sink fee provided') + raise ProcessError('No creation sink fee provided') if not nem.validate_address(mosaic_creation.sink, network): - raise ValueError('Invalid creation sink address') + raise ProcessError('Invalid creation sink address') if mosaic_creation.definition.name is not None: - raise ValueError('Name not allowed in mosaic creation transactions') + raise ProcessError('Name not allowed in mosaic creation transactions') if mosaic_creation.definition.ticker is not None: - raise ValueError('Ticker not allowed in mosaic creation transactions') + raise ProcessError('Ticker not allowed in mosaic creation transactions') if mosaic_creation.definition.networks: - raise ValueError('Networks not allowed in mosaic creation transactions') + raise ProcessError('Networks not allowed in mosaic creation transactions') if mosaic_creation.definition.namespace is None: - raise ValueError('No mosaic namespace provided') + raise ProcessError('No mosaic namespace provided') if mosaic_creation.definition.mosaic is None: - raise ValueError('No mosaic name provided') + raise ProcessError('No mosaic name provided') if mosaic_creation.definition.supply is not None and mosaic_creation.definition.divisibility is None: - raise ValueError('Definition divisibility needs to be provided when supply is') + raise ProcessError('Definition divisibility needs to be provided when supply is') if mosaic_creation.definition.supply is None and mosaic_creation.definition.divisibility is not None: - raise ValueError('Definition supply needs to be provided when divisibility is') + raise ProcessError('Definition supply needs to be provided when divisibility is') if mosaic_creation.definition.levy is not None: if mosaic_creation.definition.fee is None: - raise ValueError('No levy fee provided') + raise ProcessError('No levy fee provided') if mosaic_creation.definition.levy_address is None: - raise ValueError('No levy address provided') + raise ProcessError('No levy address provided') if mosaic_creation.definition.levy_namespace is None: - raise ValueError('No levy namespace provided') + raise ProcessError('No levy namespace provided') if mosaic_creation.definition.levy_mosaic is None: - raise ValueError('No levy mosaic name provided') + raise ProcessError('No levy mosaic name provided') if mosaic_creation.definition.divisibility is None: - raise ValueError('No divisibility provided') + raise ProcessError('No divisibility provided') if mosaic_creation.definition.supply is None: - raise ValueError('No supply provided') + raise ProcessError('No supply provided') if mosaic_creation.definition.mutable_supply is None: - raise ValueError('No supply mutability provided') + raise ProcessError('No supply mutability provided') if mosaic_creation.definition.transferable is None: - raise ValueError('No mosaic transferability provided') + raise ProcessError('No mosaic transferability provided') if mosaic_creation.definition.description is None: - raise ValueError('No description provided') + raise ProcessError('No description provided') if mosaic_creation.definition.divisibility > NEM_MAX_DIVISIBILITY: - raise ValueError('Invalid divisibility provided') + raise ProcessError('Invalid divisibility provided') if mosaic_creation.definition.supply > NEM_MAX_SUPPLY: - raise ValueError('Invalid supply provided') + raise ProcessError('Invalid supply provided') if not nem.validate_address(mosaic_creation.definition.levy_address, network): - raise ValueError('Invalid levy address') + raise ProcessError('Invalid levy address') def _validate_provision_namespace(provision_namespace: NEMProvisionNamespace, network: int): if provision_namespace.namespace is None: - raise ValueError('No namespace provided') + raise ProcessError('No namespace provided') if provision_namespace.sink is None: - raise ValueError('No rental sink provided') + raise ProcessError('No rental sink provided') if provision_namespace.fee is None: - raise ValueError('No rental sink fee provided') + raise ProcessError('No rental sink fee provided') if not nem.validate_address(provision_namespace.sink, network): - raise ValueError('Invalid rental sink address') + raise ProcessError('Invalid rental sink address') def _validate_transfer(transfer: NEMTransfer, network: int): if transfer.recipient is None: - raise ValueError('No recipient provided') + raise ProcessError('No recipient provided') if transfer.amount is None: - raise ValueError('No amount provided') + raise ProcessError('No amount provided') if transfer.public_key is not None: _validate_public_key(transfer.public_key, 'Invalid recipient public key') + if transfer.payload is None: + raise ProcessError('Public key provided but no payload to encrypt') if transfer.payload: if len(transfer.payload) > NEM_MAX_PLAIN_PAYLOAD_SIZE: - raise ValueError('Payload too large') + raise ProcessError('Payload too large') if transfer.public_key and len(transfer.payload) > NEM_MAX_ENCRYPTED_PAYLOAD_SIZE: - raise ValueError('Payload too large') + raise ProcessError('Payload too large') if not nem.validate_address(transfer.recipient, network): - raise ValueError('Invalid recipient address') + raise ProcessError('Invalid recipient address') for m in transfer.mosaics: if m.namespace is None: - raise ValueError('No mosaic namespace provided') + raise ProcessError('No mosaic namespace provided') if m.mosaic is None: - raise ValueError('No mosaic name provided') + raise ProcessError('No mosaic name provided') if m.quantity is None: - raise ValueError('No mosaic quantity provided') + raise ProcessError('No mosaic quantity provided')