From 2c3a06f75114aff650304d4f0c9f9160611fcf1a Mon Sep 17 00:00:00 2001 From: zergweak Date: Wed, 9 May 2018 20:49:49 +0800 Subject: [PATCH 1/2] add validUrl, url need 1 to 256 bytes --- .../core/actuator/WitnessCreateActuator.java | 10 ++- .../core/capsule/utils/TransactionUtil.java | 11 +++ .../actuator/WitnessCreateActuatorTest.java | 90 +++++++++++++++++-- 3 files changed, 99 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java b/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java index 36ff8e60969..65951f5ff7b 100755 --- a/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java +++ b/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java @@ -10,6 +10,7 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; +import org.tron.core.capsule.utils.TransactionUtil; import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -55,6 +56,11 @@ public boolean validate() throws ContractValidateException { if (!Wallet.addressValid(contract.getOwnerAddress().toByteArray())) { throw new ContractValidateException("Invalidate address"); } + + if (!TransactionUtil.validUrl(contract.getUrl().toByteArray())) { + throw new ContractValidateException("Invalidate url"); + } + Preconditions.checkArgument( this.dbManager.getAccountStore().has(contract.getOwnerAddress().toByteArray()), "account[" + readableOwnerAddress + "] not exists"); @@ -70,7 +76,6 @@ public boolean validate() throws ContractValidateException { accountCapsule.getBalance() >= dbManager.getDynamicPropertiesStore() .getAccountUpgradeCost(), "balance < AccountUpgradeCost"); - } catch (final Exception ex) { ex.printStackTrace(); throw new ContractValidateException(ex.getMessage()); @@ -106,8 +111,5 @@ private void createWitness(final WitnessCreateContract witnessCreateContract) { } catch (BalanceInsufficientException e) { throw new RuntimeException(e); } - - } - } diff --git a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index 9e954d6bb74..486b54bc4ac 100644 --- a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -17,6 +17,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; +import org.tron.common.utils.ByteUtil; import org.tron.core.Wallet; import org.tron.core.capsule.TransactionCapsule; import org.tron.protos.Contract.TransferContract; @@ -49,6 +50,16 @@ private static boolean checkBalance(long totalBalance, long totalSpent) { return totalBalance == totalSpent; } + public static boolean validUrl(byte[] url) { + if (ByteUtil.isNullOrZeroArray(url)) { + return false; + } + if (url.length > 256) { + return false; + } + // other rules. + return true; + } /** * Get sender. */ diff --git a/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java b/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java index 0904c7ca1c3..c161cea8bf7 100644 --- a/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java +++ b/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java @@ -104,6 +104,14 @@ private Any getContract(String address, String url) { .build()); } + private Any getContract(String address, ByteString url) { + return Any.pack( + Contract.WitnessCreateContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(address))) + .setUrl(url) + .build()); + } + /** * first createWitness,result is success. */ @@ -142,11 +150,10 @@ public void secondCreateAccount() { try { actuator.validate(); actuator.execute(ret); - + Assert.assertFalse(true); } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("Witness[" + OWNER_ADDRESS_SECOND + "] has existed", e.getMessage()); - } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } @@ -164,16 +171,86 @@ public void invalidateAddress() { actuator.validate(); actuator.execute(ret); fail("Invalidate address"); + } catch (ContractValidateException e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate address", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } + } + /** + * use Invalidate url createWitness,result is failed,exception is "Invalidate url". + */ + @Test + public void invalidateUrlTest() { + TransactionResultCapsule ret = new TransactionResultCapsule(); + //Url cannot empty + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, ByteString.EMPTY), dbManager); + actuator.validate(); + actuator.execute(ret); + fail("Invalidate url"); } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate url", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } - Assert.assertEquals("Invalidate address", e.getMessage()); + //256 bytes + String url256Bytes = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; + //Url length can not greater than 256 + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, ByteString.copyFromUtf8(url256Bytes + "0")), dbManager); + actuator.validate(); + actuator.execute(ret); + fail("Invalidate url"); + } catch (ContractValidateException e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate url", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } + // 1 byte url is ok. + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, "0"), dbManager); + actuator.validate(); + actuator.execute(ret); + Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + WitnessCapsule witnessCapsule = + dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + Assert.assertNotNull(witnessCapsule); + Assert.assertEquals(witnessCapsule.getInstance().getUrl(), "0"); + Assert.assertTrue(true); + } catch (ContractValidateException e) { + Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } + dbManager.getWitnessStore().delete(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + // 256 bytes url is ok. + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, url256Bytes), dbManager); + actuator.validate(); + actuator.execute(ret); + Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + WitnessCapsule witnessCapsule = + dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + Assert.assertNotNull(witnessCapsule); + Assert.assertEquals(witnessCapsule.getInstance().getUrl(), url256Bytes); + Assert.assertTrue(true); + } catch (ContractValidateException e) { + Assert.assertFalse(e instanceof ContractValidateException); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } } /** @@ -189,7 +266,6 @@ public void noAccount() { actuator.validate(); actuator.execute(ret); fail("account[+OWNER_ADDRESS_NOACCOUNT+] not exists"); - } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("account[" + OWNER_ADDRESS_NOACCOUNT + "] not exists", e.getMessage()); @@ -202,7 +278,7 @@ public void noAccount() { /** * use Account ,result is failed,exception is "account not exists". */ -// @Test + @Test public void balanceNotSufficient() { AccountCapsule balanceNotSufficientCapsule = new AccountCapsule( @@ -221,11 +297,9 @@ public void balanceNotSufficient() { actuator.execute(ret); fail("witnessAccount has balance[" + balanceNotSufficientCapsule.getBalance() + "] < MIN_BALANCE[100]"); - } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("witnessAccount has balance[" + balanceNotSufficientCapsule.getBalance() - + "] < MIN_BALANCE[100]", e.getMessage()); + Assert.assertEquals("balance < AccountUpgradeCost", e.getMessage()); } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } From 10198bbccebe961edf07a73626f1beb7b1233e4e Mon Sep 17 00:00:00 2001 From: zergweak Date: Wed, 9 May 2018 21:59:35 +0800 Subject: [PATCH 2/2] modify addressValid validAccountName validUrl --- src/main/java/org/tron/common/utils/ByteUtil.java | 4 ---- src/main/java/org/tron/core/Wallet.java | 4 ++-- .../java/org/tron/core/capsule/utils/TransactionUtil.java | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ByteUtil.java b/src/main/java/org/tron/common/utils/ByteUtil.java index 54409846778..255ecf85c1f 100644 --- a/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/src/main/java/org/tron/common/utils/ByteUtil.java @@ -155,10 +155,6 @@ public static int byteArrayToInt(byte[] b) { return new BigInteger(1, b).intValue(); } - public static boolean isNullOrZeroArray(byte[] array) { - return (array == null) || (array.length == 0); - } - public static boolean isSingleZero(byte[] array) { return (array.length == 1 && array[0] == 0); } diff --git a/src/main/java/org/tron/core/Wallet.java b/src/main/java/org/tron/core/Wallet.java index be38e5cfcdc..f45b43c0e2b 100755 --- a/src/main/java/org/tron/core/Wallet.java +++ b/src/main/java/org/tron/core/Wallet.java @@ -23,6 +23,7 @@ import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,7 +39,6 @@ import org.tron.common.overlay.message.Message; import org.tron.common.utils.Base58; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Utils; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; @@ -112,7 +112,7 @@ public static void setAddressPreFixByte(byte addressPreFixByte) { } public static boolean addressValid(byte[] address) { - if (ByteUtil.isNullOrZeroArray(address)) { + if (ArrayUtils.isEmpty(address)) { logger.warn("Warning: Address is empty !!"); return false; } diff --git a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index 88f2a08fb43..5f6a903ed82 100644 --- a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -17,7 +17,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.ByteUtil; +import org.apache.commons.lang3.ArrayUtils; import org.tron.core.Wallet; import org.tron.core.capsule.TransactionCapsule; import org.tron.protos.Contract.TransferContract; @@ -51,7 +51,7 @@ private static boolean checkBalance(long totalBalance, long totalSpent) { } public static boolean validAccountName(byte[] accountName) { - if (ByteUtil.isNullOrZeroArray(accountName)) { + if (ArrayUtils.isEmpty(accountName)) { return false; } if (accountName.length > 32) { @@ -70,7 +70,7 @@ public static boolean validAccountName(byte[] accountName) { } public static boolean validUrl(byte[] url) { - if (ByteUtil.isNullOrZeroArray(url)) { + if (ArrayUtils.isEmpty(url)) { return false; } if (url.length > 256) {