diff --git a/src/main/java/org/qortal/transaction/RegisterNameTransaction.java b/src/main/java/org/qortal/transaction/RegisterNameTransaction.java index 555fcc60..66c1fc8b 100644 --- a/src/main/java/org/qortal/transaction/RegisterNameTransaction.java +++ b/src/main/java/org/qortal/transaction/RegisterNameTransaction.java @@ -6,6 +6,7 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.asset.Asset; import org.qortal.block.BlockChain; +import org.qortal.crypto.Crypto; import org.qortal.data.transaction.RegisterNameTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.naming.Name; @@ -62,6 +63,10 @@ public class RegisterNameTransaction extends Transaction { if (!name.equals(Unicode.normalize(name))) return ValidationResult.NAME_NOT_NORMALIZED; + // Check name doesn't look like an address + if (Crypto.isValidAddress(name)) + return ValidationResult.INVALID_ADDRESS; + // Check registrant has enough funds if (registrant.getConfirmedBalance(Asset.QORT) < this.registerNameTransactionData.getFee()) return ValidationResult.NO_BALANCE; diff --git a/src/main/java/org/qortal/transaction/UpdateNameTransaction.java b/src/main/java/org/qortal/transaction/UpdateNameTransaction.java index fdcba164..ebfde97c 100644 --- a/src/main/java/org/qortal/transaction/UpdateNameTransaction.java +++ b/src/main/java/org/qortal/transaction/UpdateNameTransaction.java @@ -5,6 +5,7 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.asset.Asset; +import org.qortal.crypto.Crypto; import org.qortal.data.naming.NameData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.UpdateNameTransactionData; @@ -77,6 +78,10 @@ public class UpdateNameTransaction extends Transaction { // Check new name is in normalized form (no leading/trailing whitespace, etc.) if (!newName.equals(Unicode.normalize(newName))) return ValidationResult.NAME_NOT_NORMALIZED; + + // Check name doesn't look like an address + if (Crypto.isValidAddress(newName)) + return ValidationResult.INVALID_ADDRESS; } // Check new data size bounds (0 length means don't update data) diff --git a/src/main/java/org/qortal/utils/Unicode.java b/src/main/java/org/qortal/utils/Unicode.java index 8a9092ea..b73f3a32 100644 --- a/src/main/java/org/qortal/utils/Unicode.java +++ b/src/main/java/org/qortal/utils/Unicode.java @@ -41,7 +41,7 @@ public abstract class Unicode { buildHomoglyphCodePointArrays(); } - /** Returns string in Unicode canonical normalized form (NFC),
+ /** Returns string in Unicode canonical normalized form (NFKC),
* with zero-width spaces/joiners removed,
* leading/trailing whitespace trimmed
* and all other whitespace blocks collapsed into a single space character. diff --git a/src/test/java/org/qortal/test/naming/MiscTests.java b/src/test/java/org/qortal/test/naming/MiscTests.java index 0bb750d0..c46cbfab 100644 --- a/src/test/java/org/qortal/test/naming/MiscTests.java +++ b/src/test/java/org/qortal/test/naming/MiscTests.java @@ -96,4 +96,46 @@ public class MiscTests extends Common { } } + // test trying to register a name that looks like an address + @Test + public void testRegisterAddressAsName() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + // Register-name + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String name = alice.getAddress(); + String data = "{}"; + + RegisterNameTransactionData transactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, data); + Transaction transaction = Transaction.fromData(repository, transactionData); + transaction.sign(alice); + + ValidationResult result = transaction.importAsUnconfirmed(); + assertTrue("Transaction should be invalid", ValidationResult.OK != result); + } + } + + // test register then trying to update to a name that looks like an address + @Test + public void testUpdateToAddressAsName() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + // Register-name + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String name = "test-name"; + String data = "{}"; + + TransactionData transactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, data); + TransactionUtils.signAndMint(repository, transactionData, alice); + + // we shouldn't be able to update name to an address + String newName = alice.getAddress(); + String newData = ""; + transactionData = new UpdateNameTransactionData(TestTransaction.generateBase(alice), name, newName, newData); + Transaction transaction = Transaction.fromData(repository, transactionData); + transaction.sign(alice); + + ValidationResult result = transaction.importAsUnconfirmed(); + assertTrue("Transaction should be invalid", ValidationResult.OK != result); + } + } + }