From 581753538bdc10284b931072c702d69b9944b6ac Mon Sep 17 00:00:00 2001 From: Alexander Lednev <57529355+iceseer@users.noreply.github.com> Date: Thu, 8 Sep 2022 19:34:05 +0300 Subject: [PATCH] Fix/transfer asset permitions (#2720) * TransferAsset fixup! Signed-off-by: iceseer Signed-off-by: Alexander Lednev <57529355+iceseer@users.noreply.github.com> --- .../impl/rocksdb_command_executor.cpp | 7 ++- .../acceptance/transfer_asset_test.cpp | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/irohad/ametsuchi/impl/rocksdb_command_executor.cpp b/irohad/ametsuchi/impl/rocksdb_command_executor.cpp index 215aaa9c4c5..a65cf8a22b6 100644 --- a/irohad/ametsuchi/impl/rocksdb_command_executor.cpp +++ b/irohad/ametsuchi/impl/rocksdb_command_executor.cpp @@ -1133,10 +1133,9 @@ RocksDbCommandExecutor::ExecutionResult RocksDbCommandExecutor::operator()( if (opt_permissions) granted_account_permissions = *opt_permissions; - RDB_ERROR_CHECK(checkPermissions(creator_permissions, - granted_account_permissions, - Role::kTransfer, - Grantable::kTransferMyAssets)); + RDB_ERROR_CHECK(checkGrantablePermissions(creator_permissions, + granted_account_permissions, + Grantable::kTransferMyAssets)); } else RDB_ERROR_CHECK(checkPermissions(creator_permissions, {Role::kTransfer})); diff --git a/test/integration/acceptance/transfer_asset_test.cpp b/test/integration/acceptance/transfer_asset_test.cpp index c9767f02b83..19f9778fdcf 100644 --- a/test/integration/acceptance/transfer_asset_test.cpp +++ b/test/integration/acceptance/transfer_asset_test.cpp @@ -60,6 +60,23 @@ struct TransferAsset : AcceptanceFixture, .finish(); } + /** + * Creates the transaction with the third user creation commands + * @param perms are the permissions of the user + * @return built tx + */ + auto makeThirdUser(const interface::RolePermissionSet &perms = { + interface::permissions::Role::kTransfer}) { + return createUserWithPerms( + kUser3, + PublicKeyHexStringView{kUser3Keypair.publicKey()}, + kRole3, + perms) + .build() + .signAndAddSignature(kAdminKeypair) + .finish(); + } + proto::Transaction addAssets() { return addAssets(kAmount); } @@ -73,20 +90,34 @@ struct TransferAsset : AcceptanceFixture, baseTx().transferAsset(kUserId, kUser2Id, kAssetId, kDesc, amount)); } + proto::Transaction makeTransfer2(const std::string &amount) { + return complete( + baseTx(kUser3Id).transferAsset(kUserId, kUser2Id, kAssetId, kDesc, amount), kUser3Keypair); + } + proto::Transaction makeTransfer() { return makeTransfer(kAmount); } + proto::Transaction makeTransfer2() { + return makeTransfer2(kAmount); + } + static constexpr iroha::StorageType storage_types[] = { iroha::StorageType::kPostgres, iroha::StorageType::kRocksDb}; const std::string kAmount = "1.0"; const std::string kDesc = "description"; const std::string kRole2 = "roletwo"; + const std::string kRole3 = "rolethree"; const std::string kUser2 = "usertwo"; + const std::string kUser3 = "userthree"; const std::string kUser2Id = kUser2 + "@" + kDomain; + const std::string kUser3Id = kUser3 + "@" + kDomain; const crypto::Keypair kUser2Keypair = crypto::DefaultCryptoAlgorithmType::generateKeypair(); + const crypto::Keypair kUser3Keypair = + crypto::DefaultCryptoAlgorithmType::generateKeypair(); }; INSTANTIATE_TEST_SUITE_P_DifferentStorageTypes(TransferAsset); @@ -131,6 +162,20 @@ TEST_P(TransferAsset, WithoutCanTransfer) { .checkBlock(CHECK_TXS_QUANTITY(0)); } +TEST_P(TransferAsset, AnotherUserTx) { + IntegrationTestFramework(1, GetParam()) + .setInitialState(kAdminKeypair) + .sendTxAwait(makeFirstUser(), CHECK_TXS_QUANTITY(1)) + .sendTxAwait(makeSecondUser(), CHECK_TXS_QUANTITY(1)) + .sendTxAwait(makeThirdUser(), CHECK_TXS_QUANTITY(1)) + .sendTxAwait(addAssets(), CHECK_TXS_QUANTITY(1)) + .sendTx(makeTransfer2()) + .skipProposal() + .checkVerifiedProposal( + [](auto &proposal) { ASSERT_EQ(proposal->transactions().size(), 0); }) + .checkBlock(CHECK_TXS_QUANTITY(0)); +} + /** * TODO mboldyrev 18.01.2019 IR-226 convert to a SFV integration test * (not covered by postgres_executor_test)