From a3c44428d35cafbce948416a5bcaf68e7891da27 Mon Sep 17 00:00:00 2001 From: catbref Date: Wed, 4 Mar 2020 15:41:47 +0000 Subject: [PATCH] Restrict TRANSFER_PRIVS recipients to new (non-existent) accounts. --- .../org/qortal/transaction/Transaction.java | 1 + .../transaction/TransferPrivsTransaction.java | 11 +++++++-- .../org/qortal/test/TransferPrivsTests.java | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index adf70310..75e31f8c 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -241,6 +241,7 @@ public abstract class Transaction { ASSET_NOT_SPENDABLE(89), ACCOUNT_CANNOT_REWARD_SHARE(90), SELF_SHARE_EXISTS(91), + ACCOUNT_ALREADY_EXISTS(92), NOT_YET_RELEASED(1000); public final int value; diff --git a/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java b/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java index 8a4cd2bf..9716cfa5 100644 --- a/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java +++ b/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java @@ -83,6 +83,10 @@ public class TransferPrivsTransaction extends Transaction { if (!Crypto.isValidAddress(this.transferPrivsTransactionData.getRecipient())) return ValidationResult.INVALID_ADDRESS; + // Check recipient is new account + if (this.repository.getAccountRepository().accountExists(this.transferPrivsTransactionData.getRecipient())) + return ValidationResult.ACCOUNT_ALREADY_EXISTS; + return ValidationResult.OK; } @@ -183,8 +187,11 @@ public class TransferPrivsTransaction extends Transaction { accountRepository.setFlags(senderData); // Restore recipient's flags - recipientData.setFlags(this.transferPrivsTransactionData.getPreviousRecipientFlags()); - accountRepository.setFlags(recipientData); + Integer previousRecipientFlags = this.transferPrivsTransactionData.getPreviousRecipientFlags(); + if (previousRecipientFlags != null) { + recipientData.setFlags(previousRecipientFlags); + accountRepository.setFlags(recipientData); + } // Clean values in transaction data this.transferPrivsTransactionData.setPreviousSenderFlags(null); diff --git a/src/test/java/org/qortal/test/TransferPrivsTests.java b/src/test/java/org/qortal/test/TransferPrivsTests.java index 71eb1292..f81d7e34 100644 --- a/src/test/java/org/qortal/test/TransferPrivsTests.java +++ b/src/test/java/org/qortal/test/TransferPrivsTests.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; import org.qortal.account.Account; import org.qortal.account.PrivateKeyAccount; +import org.qortal.account.PublicKeyAccount; import org.qortal.block.BlockChain; import org.qortal.block.BlockMinter; import org.qortal.data.account.AccountData; @@ -19,11 +20,13 @@ import org.qortal.test.common.BlockUtils; import org.qortal.test.common.Common; import org.qortal.test.common.TestAccount; import org.qortal.test.common.TransactionUtils; +import org.qortal.transform.Transformer; import static org.junit.Assert.*; import java.math.BigDecimal; import java.util.List; +import java.util.Random; public class TransferPrivsTests extends Common { @@ -42,6 +45,27 @@ public class TransferPrivsTests extends Common { Common.orphanCheck(); } + @Test + public void testAliceIntoNewAccountTransferPrivs() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + TestAccount alice = Common.getTestAccount(repository, "alice"); + assertTrue(alice.canMint()); + + PrivateKeyAccount aliceMintingAccount = Common.getTestAccount(repository, "alice-reward-share"); + + byte[] randomPublicKey = new byte[Transformer.PUBLIC_KEY_LENGTH]; + Random random = new Random(); + random.nextBytes(randomPublicKey); + + Account randomAccount = new PublicKeyAccount(repository, randomPublicKey); + + combineAccounts(repository, alice, randomAccount, aliceMintingAccount); + + assertFalse(alice.canMint()); + assertTrue(randomAccount.canMint()); + } + } + @Test public void testAliceIntoDilbertTransferPrivs() throws DataException { try (final Repository repository = RepositoryManager.getRepository()) {