Fixup Import Signers (#138)

* add guard and tests

* disable xpop array feature
This commit is contained in:
Denis Angell
2023-10-24 10:57:58 +02:00
committed by GitHub
parent 263c6342cf
commit 1f052020cb
3 changed files with 482 additions and 47 deletions

View File

@@ -290,7 +290,7 @@ Import::preflight(PreflightContext const& ctx)
auto const& outerSigners = tx.getFieldArray(sfSigners);
auto const& innerSigners = stpTrans->getFieldArray(sfSigners);
bool ok = outerSigners.size() == innerSigners.size();
bool ok = outerSigners.size() == innerSigners.size() && innerSigners.size() > 1;
for (uint64_t i = 0; ok && i < outerSigners.size(); ++i)
{
if (outerSigners[i].getAccountID(sfAccount) != innerSigners[i].getAccountID(sfAccount) ||

View File

@@ -73,6 +73,9 @@ syntaxCheckProof(Json::Value const& proof, beast::Journal const& j, int depth =
if (proof.isArray())
{
JLOG(j.warn()) << "XPOP.transaction.proof list xpop is disabled";
return false;
// List form
if (proof.size() != 16)
{

View File

@@ -310,6 +310,60 @@ class Import_test : public beast::unit_test::suite
void
testSyntaxCheckProofArray(FeatureBitset features)
{
testcase("import utils - syntaxCheckProof: is array");
using namespace test::jtx;
using namespace std::literals;
test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)};
auto const alice = Account("alice");
env.fund(XRP(1000), alice);
env.close();
// XPOP.transaction.proof list xpop is disabled
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::transaction][jss::proof] = Json::arrayValue;
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// // XPOP.transaction.proof list should be exactly 16 entries
// {
// Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
// tmpXpop[jss::transaction][jss::proof] = Json::arrayValue;
// for(int i = 0; i < 16; i++) {
// tmpXpop[jss::transaction][jss::proof].append("E000CC0736630D66DAB573A2642E1BD0646DFB13A871B2CCFA6E4226F477D88C");
// }
// Json::Value const tx = import(alice, tmpXpop);
// env(tx, ter(temMALFORMED));
// }
// // XPOP.transaction.proof list entry missing or wrong format (should
// be hex string with 64 characters)
// {
// Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
// tmpXpop[jss::transaction][jss::proof] = Json::arrayValue;
// for(int i = 0; i < 16; i++) {
// tmpXpop[jss::transaction][jss::proof].append("wrong format");
// }
// Json::Value const tx = import(alice, tmpXpop);
// env(tx, ter(temMALFORMED));
// }
// // XPOP.transaction.proof list entry has wrong format
// {
// Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
// tmpXpop[jss::transaction][jss::proof] = Json::arrayValue;
// Json::Value child1;
// child1["children"] = Json::arrayValue;
// child1["hash"] =
// "31C2D27644F0E6D81AF332F466F71D43C25946A45FE43F121A500E22003F39A4";
// child1["key"] =
// "60748F98318DB6A39737D0C1BE5614AEBD7F1ACEE5FB16E82D49F16BB13BA87F";
// tmpXpop[jss::transaction][jss::proof].append(child1);
// Json::Value const tx = import(alice, tmpXpop);
// env(tx, ter(temMALFORMED));
// }
}
void
@@ -1662,13 +1716,17 @@ class Import_test : public beast::unit_test::suite
// temDISABLED - disabled
// !ctx.rules.enabled(featureImport)
{
test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys), features - featureImport};
test::jtx::Env env{
*this,
makeNetworkVLConfig(21337, keys),
features - featureImport};
auto const alice = Account("alice");
env.fund(XRP(1000), alice);
env.close();
env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), ter(temDISABLED));
env(import(alice, loadXpop(ImportTCAccountSet::w_seed)),
ter(temDISABLED));
}
// temDISABLED - disabled
@@ -1691,6 +1749,7 @@ class Import_test : public beast::unit_test::suite
}
test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)};
auto const feeDrops = env.current()->fees().base;
// burn 1000 xrp
@@ -1723,15 +1782,14 @@ class Import_test : public beast::unit_test::suite
env(tx, ter(telINSUF_FEE_P));
}
// temMALFORMED - blob was more than 512kib
// DA: blob.resize(513 * 1024); fails with Boost
// temMALFORMED
// blob was more than 512kib
// {
// ripple::Blob blob;
// blob.resize(513 * 1024);
// Json::Value tx = import(alice, loadXpop(ImportTCAccountSet::w_seed));
// tx[sfBlob.jsonName] = strHex(blob);
// env(tx, ter(temMALFORMED));
// Json::Value tx = import(alice,
// loadXpop(ImportTCAccountSet::w_seed)); tx[sfBlob.jsonName] =
// strHex(blob); env(tx, ter(temMALFORMED));
// }
// temMALFORMED - sfAmount field must be in drops
@@ -1788,8 +1846,8 @@ class Import_test : public beast::unit_test::suite
env(tx, ter(temMALFORMED));
}
// // temMALFORMED - !stpTrans
// // DA: Duplicate - getInnerTxn (Any Failure)
// temMALFORMED - !stpTrans
// DA: Duplicate - getInnerTxn (Any Failure)
// temMALFORMED - Import: attempted to import xpop containing an emitted
// or pseudo txn.
@@ -1915,15 +1973,36 @@ class Import_test : public beast::unit_test::suite
env.close();
}
// temMALFORMED - Import: outer and inner txns were (multi) signed with
// different keys. - empty innerSigners
{
Json::Value xpopJson = loadXpop(ImportTCSignersListSet::w_signers);
xpopJson[jss::transaction][jss::blob] =
"12000C22000000002400000014201B0000002B201D00005359202300000002"
"6840000000001E84B073008114AE123A8556F3CF91154711376AFB0F894F83"
"2B3DF3F1F4EB1300018114AA266540F7DACC27E264B75ED0A5ED7330BFB614"
"E1EB1300018114D91B8EE5C7ABF632469D4C0907C5E40C8B8F79B3E1F1";
env(import(alice, xpopJson),
msig(bob, carol),
fee((3 * feeDrops) * 10),
ter(temMALFORMED));
env.close();
}
// temMALFORMED - Import: outer or inner txn was missing signers.
// different keys.
// {
// auto const xpopJson = loadXpop(ImportTCSignersListSet::w_signers);
// env(import(alice, xpopJson),
// fee((3 * feeDrops) * 10),
// ter(temMALFORMED));
// env.close();
// }
{
Json::Value xpopJson = loadXpop(ImportTCSignersListSet::w_signers);
xpopJson[jss::transaction][jss::blob] =
"12000C22000000002400000014201B0000002B201D00005359202300000002"
"6840000000001E84B073008114AE123A8556F3CF91154711376AFB0F894F83"
"2B3DF4EB1300018114AA266540F7DACC27E264B75ED0A5ED7330BFB614E1EB"
"1300018114D91B8EE5C7ABF632469D4C0907C5E40C8B8F79B3E1F1";
env(import(alice, xpopJson),
fee((3 * feeDrops) * 10),
ter(temMALFORMED));
env.close();
}
// temMALFORMED - Import: outer and inner txns were signed with
// different keys.
@@ -1937,7 +2016,26 @@ class Import_test : public beast::unit_test::suite
}
// temMALFORMED - Import: inner txn signature verify failed
// DA: TODO: ASK FOR HELP
{
Json::Value xpopJson = loadXpop(ImportTCSignersListSet::w_signers);
xpopJson[jss::transaction][jss::blob] =
"12000C2200000008240000001A201B000003B9201D00005359202300000000"
"6840000000001E84B073008114AE123A8556F3CF91154711376AFB0F894F83"
"2B3DF3E0107321028949021029D5CC87E78BCF053AFEC0CAFD15108EC119EA"
"AFEC466F5C095407BF74473045022100BE132424E6E6304574F4BB5F6E287A"
"63429482CE7E0437B443FC1457F4A3830002204B909A44FF9DFFD99AF751B0"
"40830E53830FE3CA591449600372BED85FDBC33C8114B389FBCED0AF9DCDFF"
"62900BFAEFA3EB872D8A96E1E010732102691AC5AE1C4C333AE5DF8A93BDC4"
"95F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE74473045022100D235706A0AB2"
"407EC5D62F9130E9A98A70D90CE0D69D749C37272DFC975BD79002207D8AED"
"0BF31A5E3290920B72EAFE22AB6B09814466372E09B067779C4E103FBE8114"
"F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90FE1F1";
env(import(alice, xpopJson),
msig(bob, carol),
fee((3 * feeDrops) * 10),
ter(temMALFORMED));
env.close();
}
// temMALFORMED - Import: failed to deserialize manifest on txid
{
@@ -1995,7 +2093,6 @@ class Import_test : public beast::unit_test::suite
env(tx, ter(temMALFORMED));
}
// DA: GOOD SIGNATURE NOT JSON
// temMALFORMED - Import: unl blob was not valid json (after base64
// decoding)
{
@@ -2005,9 +2102,158 @@ class Import_test : public beast::unit_test::suite
env(tx, ter(temMALFORMED));
}
// DA: GOOD SIGNATURE GOOD JSON MISSING FIELDS
// temMALFORMED - Import: unl blob json (after base64 decoding) lacked
// required fields and/or types
// required field (sequence) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJleHBpcmF0aW9uIjo3NDEzOTg0MDAsInZhbGlkYXRvcnMiOlt7InZhbGlkYX"
"Rpb25fcHVibGljX2tleSI6IkVEMzhCRDQ0NUFGRDYyMTU5NjIwQ0MxOTZDMjY2"
"OEEyNkI2RkJCMzZCMDk5RUI1NUIzOEE1OEMxMUMxMjA0REU1QyIsIm1hbmlmZX"
"N0IjoiSkFBQUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3bWFLSnJiN3Myc0puclZi"
"T0tXTUVjRWdUZVhITWhBb0dNTmNzZ1VVTndLbytoN3poYVhLRitIR3c2WGhFam"
"9ES3JhbGtZbk1qS2RrY3dSUUloQUo3Y040SjZOZFZmcG52RUkvWmV1V0NUdm5w"
"YUppcktORmNDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUkxsb05oeGRIaFZxOW96RV"
"dWRTljSXdYRE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2Ylh2VVR0ZG10NE5ydGxi"
"eDRWenVtVHBmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1hibktXalZocU5hR201Nz"
"dLNko2OTdYWjdUUUU9In0seyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFREJF"
"RTMwRkFFOTJFRUU4OEUxQzQ5ODBEMDlFQ0ZERTk5QTExNkQwNzhFQzIxODU3RE"
"IxQjQ3QjQyNjQxOEU0MjgiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUwNHZVUmEv"
"V0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2"
"dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFK"
"N2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYk"
"tJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0"
"MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oND"
"NwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9XX0=";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding) wrong
// required field (sequence) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6IjIiLCJleHBpcmF0aW9uIjo3NDEzOTg0MDAsInZhbGlkYX"
"RvcnMiOlt7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMzhCRDQ0NUFGRDYy"
"MTU5NjIwQ0MxOTZDMjY2OEEyNkI2RkJCMzZCMDk5RUI1NUIzOEE1OEMxMUMxMj"
"A0REU1QyIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3"
"bWFLSnJiN3Myc0puclZiT0tXTUVjRWdUZVhITWhBb0dNTmNzZ1VVTndLbytoN3"
"poYVhLRitIR3c2WGhFam9ES3JhbGtZbk1qS2RrY3dSUUloQUo3Y040SjZOZFZm"
"cG52RUkvWmV1V0NUdm5wYUppcktORmNDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUk"
"xsb05oeGRIaFZxOW96RVdWRTljSXdYRE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2"
"Ylh2VVR0ZG10NE5ydGxieDRWenVtVHBmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1"
"hibktXalZocU5hR201NzdLNko2OTdYWjdUUUU9In0seyJ2YWxpZGF0aW9uX3B1"
"YmxpY19rZXkiOiJFREJFRTMwRkFFOTJFRUU4OEUxQzQ5ODBEMDlFQ0ZERTk5QT"
"ExNkQwNzhFQzIxODU3REIxQjQ3QjQyNjQxOEU0MjgiLCJtYW5pZmVzdCI6IkpB"
"QUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0"
"VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxr"
"WW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTk"
"ZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3"
"WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bV"
"RwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3"
"WFo3VFFFPSJ9XX0=";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding)
// lacked required field (expiration) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwidmFsaWRhdG9ycyI6W3sidmFsaWRhdGlvbl9wdWJsaW"
"Nfa2V5IjoiRUQzOEJENDQ1QUZENjIxNTk2MjBDQzE5NkMyNjY4QTI2QjZGQkIz"
"NkIwOTlFQjU1QjM4QTU4QzExQzEyMDRERTVDIiwibWFuaWZlc3QiOiJKQUFBQU"
"FKeEllMDR2VVJhL1dJVmxpRE1HV3dtYUtKcmI3czJzSm5yVmJPS1dNRWNFZ1Rl"
"WEhNaEFvR01OY3NnVVVOd0tvK2g3emhhWEtGK0hHdzZYaEVqb0RLcmFsa1luTW"
"pLZGtjd1JRSWhBSjdjTjRKNk5kVmZwbnZFSS9aZXVXQ1R2bnBhSmlyS05GY0Mz"
"ek1Pamd3akFpQWJLSTBmYlhnUzFSTGxvTmh4ZEhoVnE5b3pFV1ZFOWNJd1hETj"
"NBeHF5WTNBU1FDdDArdS9pTlNERDZiWHZVVHRkbXQ0TnJ0bGJ4NFZ6dW1UcGZq"
"UllwNGxNb0kvaDQzcFVUanA3VkZvWGJuS1dqVmhxTmFHbTU3N0s2SjY5N1haN1"
"RRRT0ifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEQkVFMzBGQUU5MkVF"
"RTg4RTFDNDk4MEQwOUVDRkRFOTlBMTE2RDA3OEVDMjE4NTdEQjFCNDdCNDI2ND"
"E4RTQyOCIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3"
"bWFLSnJiN3Myc0puclZiT0tXTUVjRWdUZVhITWhBb0dNTmNzZ1VVTndLbytoN3"
"poYVhLRitIR3c2WGhFam9ES3JhbGtZbk1qS2RrY3dSUUloQUo3Y040SjZOZFZm"
"cG52RUkvWmV1V0NUdm5wYUppcktORmNDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUk"
"xsb05oeGRIaFZxOW96RVdWRTljSXdYRE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2"
"Ylh2VVR0ZG10NE5ydGxieDRWenVtVHBmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1"
"hibktXalZocU5hR201NzdLNko2OTdYWjdUUUU9In1dfQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding) wrong
// required field (expiration) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6Ijc0MTM5ODQwMCIsInZhbGlkYX"
"RvcnMiOlt7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEMzhCRDQ0NUFGRDYy"
"MTU5NjIwQ0MxOTZDMjY2OEEyNkI2RkJCMzZCMDk5RUI1NUIzOEE1OEMxMUMxMj"
"A0REU1QyIsIm1hbmlmZXN0IjoiSkFBQUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3"
"bWFLSnJiN3Myc0puclZiT0tXTUVjRWdUZVhITWhBb0dNTmNzZ1VVTndLbytoN3"
"poYVhLRitIR3c2WGhFam9ES3JhbGtZbk1qS2RrY3dSUUloQUo3Y040SjZOZFZm"
"cG52RUkvWmV1V0NUdm5wYUppcktORmNDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUk"
"xsb05oeGRIaFZxOW96RVdWRTljSXdYRE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2"
"Ylh2VVR0ZG10NE5ydGxieDRWenVtVHBmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1"
"hibktXalZocU5hR201NzdLNko2OTdYWjdUUUU9In0seyJ2YWxpZGF0aW9uX3B1"
"YmxpY19rZXkiOiJFREJFRTMwRkFFOTJFRUU4OEUxQzQ5ODBEMDlFQ0ZERTk5QT"
"ExNkQwNzhFQzIxODU3REIxQjQ3QjQyNjQxOEU0MjgiLCJtYW5pZmVzdCI6IkpB"
"QUFBQUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0"
"VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxr"
"WW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTk"
"ZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3"
"WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bV"
"RwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3"
"WFo3VFFFPSJ9XX0=";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding)
// lacked required field (effective) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJlZmZlY3Rpdm"
"UiOiI3NDEzOTg0MDAiLCJ2YWxpZGF0b3JzIjpbeyJ2YWxpZGF0aW9uX3B1Ymxp"
"Y19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQj"
"M2QjA5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6IkpBQUFB"
"QUp4SWUwNHZVUmEvV0lWbGlETUdXd21hS0pyYjdzMnNKbnJWYk9LV01FY0VnVG"
"VYSE1oQW9HTU5jc2dVVU53S28raDd6aGFYS0YrSEd3NlhoRWpvREtyYWxrWW5N"
"aktka2N3UlFJaEFKN2NONEo2TmRWZnBudkVJL1pldVdDVHZucGFKaXJLTkZjQz"
"N6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG9OaHhkSGhWcTlvekVXVkU5Y0l3WERO"
"M0F4cXlZM0FTUUN0MCt1L2lOU0RENmJYdlVUdGRtdDROcnRsYng0Vnp1bVRwZm"
"pSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3"
"VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJsaWNfa2V5IjoiRURCRUUzMEZBRTkyRU"
"VFODhFMUM0OTgwRDA5RUNGREU5OUExMTZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0"
"MThFNDI4IiwibWFuaWZlc3QiOiJKQUFBQUFKeEllMDR2VVJhL1dJVmxpRE1HV3"
"dtYUtKcmI3czJzSm5yVmJPS1dNRWNFZ1RlWEhNaEFvR01OY3NnVVVOd0tvK2g3"
"emhhWEtGK0hHdzZYaEVqb0RLcmFsa1luTWpLZGtjd1JRSWhBSjdjTjRKNk5kVm"
"ZwbnZFSS9aZXVXQ1R2bnBhSmlyS05GY0Mzek1Pamd3akFpQWJLSTBmYlhnUzFS"
"TGxvTmh4ZEhoVnE5b3pFV1ZFOWNJd1hETjNBeHF5WTNBU1FDdDArdS9pTlNERD"
"ZiWHZVVHRkbXQ0TnJ0bGJ4NFZ6dW1UcGZqUllwNGxNb0kvaDQzcFVUanA3VkZv"
"WGJuS1dqVmhxTmFHbTU3N0s2SjY5N1haN1RRRT0ifV19";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding)
// lacked required field (validators) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwfQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob json (after base64 decoding) wrong
// required field (validators) and/or types
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjoid3JvbmcifQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob validUntil <= validFrom
{
@@ -2103,11 +2349,19 @@ class Import_test : public beast::unit_test::suite
}
// temMALFORMED - Import: depth > 32
// DA: Impossible test
// temMALFORMED - Import: !proof->isObject() && !proof->isArray()
// DA: Catchall Error
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::transaction][jss::proof] = "not object";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: return false
// temMALFORMED - Import: xpop proof did not contain the specified txn
// temMALFORMED - Import : xpop proof did not contain the specified txn
// hash
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
@@ -2119,9 +2373,16 @@ class Import_test : public beast::unit_test::suite
env(tx, ter(temMALFORMED));
}
// // temMALFORMED - Import: depth > 32
// // temMALFORMED - Import: !proof.isObject() && !proof.isArray()
// // DA: CatchAll Error
// temMALFORMED - Import: depth > 32
// DA: Impossible test
// temMALFORMED - Import: !proof.isObject() && !proof.isArray()
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::transaction][jss::proof] = "not object";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: computed txroot does not match xpop txroot,
// invalid xpop.
@@ -2137,9 +2398,101 @@ class Import_test : public beast::unit_test::suite
// temMALFORMED - Import: error parsing coins | phash | acroot in the
// ledger section of XPOP.
// DA: Duplicate - syntaxCheckXPOP
// temMALFORMED - Import: unl blob contained invalid validator entry,
// skipping
// skipping - not object
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbIndyb25nIiwid3JvbmciXX0=";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained invalid validator entry,
// skipping - no manifest
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1"
"OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNE"
"RFNUMifSx7InZhbGlkYXRpb25fcHVibGljX2tleSI6IkVEQkVFMzBGQUU5MkVF"
"RTg4RTFDNDk4MEQwOUVDRkRFOTlBMTE2RDA3OEVDMjE4NTdEQjFCNDdCNDI2ND"
"E4RTQyOCJ9XX0=";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained invalid validator entry,
// skipping - wrong type validation_public_key
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOjEsIm1hbmlmZXN0IjoiSkFB"
"QUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3bWFLSnJiN3Myc0puclZiT0tXTUVjRW"
"dUZVhITWhBb0dNTmNzZ1VVTndLbytoN3poYVhLRitIR3c2WGhFam9ES3JhbGtZ"
"bk1qS2RrY3dSUUloQUo3Y040SjZOZFZmcG52RUkvWmV1V0NUdm5wYUppcktORm"
"NDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUkxsb05oeGRIaFZxOW96RVdWRTljSXdY"
"RE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2Ylh2VVR0ZG10NE5ydGxieDRWenVtVH"
"BmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1hibktXalZocU5hR201NzdLNko2OTdY"
"WjdUUUU9In0seyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOjEsIm1hbmlmZXN0Ij"
"oiSkFBQUFBSnhJZTIrNHcrdWt1N29qaHhKZ05DZXo5NlpvUmJRZU93aGhYMnh0"
"SHRDWkJqa0tITWhBOVNtSER4T2lDTVRabDVuUnhycDJ5aldaNWdqeDJEcm9VRn"
"JVNG5yRXFVN2RrY3dSUUloQUxkRUZlalkrcFVuZ2xpN3NUdmliMEJtREhQN042"
"aWtWRUJJNkg3SXdVMXpBaUJkc3lvU3FQY0MyTk1xZ0FuSFhIR2RrQUl3QlFEMU"
"FVZzlYOFpKTHlmY3dIQVNRQ3QxYktWek9NeFJRbVIzd05LNGRLZG9mSUdyeEU5"
"U2p1TFI2UGE4QjVuMDhTWUo4SzYyZ2UrOWE2QnRaYWxFbS9IT2RjejBOQUZPY3"
"ljckYvQ3RTQTQ9In1dfQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained invalid validator entry,
// skipping - wrong type
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1"
"OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNE"
"RFNUMiLCJtYW5pZmVzdCI6MX0seyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJF"
"REJFRTMwRkFFOTJFRUU4OEUxQzQ5ODBEMDlFQ0ZERTk5QTExNkQwNzhFQzIxOD"
"U3REIxQjQ3QjQyNjQxOEU0MjgiLCJtYW5pZmVzdCI6MX1dfQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained an invalid validator key,
// skipping - invalid format
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRCIsIm1hbmlmZXN0Ijoi"
"SkFBQUFBSnhJZTA0dlVSYS9XSVZsaURNR1d3bWFLSnJiN3Myc0puclZiT0tXTU"
"VjRWdUZVhITWhBb0dNTmNzZ1VVTndLbytoN3poYVhLRitIR3c2WGhFam9ES3Jh"
"bGtZbk1qS2RrY3dSUUloQUo3Y040SjZOZFZmcG52RUkvWmV1V0NUdm5wYUppck"
"tORmNDM3pNT2pnd2pBaUFiS0kwZmJYZ1MxUkxsb05oeGRIaFZxOW96RVdWRTlj"
"SXdYRE4zQXhxeVkzQVNRQ3QwK3UvaU5TREQ2Ylh2VVR0ZG10NE5ydGxieDRWen"
"VtVHBmalJZcDRsTW9JL2g0M3BVVGpwN1ZGb1hibktXalZocU5hR201NzdLNko2"
"OTdYWjdUUUU9In0seyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRCIsIm1hbm"
"lmZXN0IjoiSkFBQUFBSnhJZTIrNHcrdWt1N29qaHhKZ05DZXo5NlpvUmJRZU93"
"aGhYMnh0SHRDWkJqa0tITWhBOVNtSER4T2lDTVRabDVuUnhycDJ5aldaNWdqeD"
"JEcm9VRnJVNG5yRXFVN2RrY3dSUUloQUxkRUZlalkrcFVuZ2xpN3NUdmliMEJt"
"REhQN042aWtWRUJJNkg3SXdVMXpBaUJkc3lvU3FQY0MyTk1xZ0FuSFhIR2RrQU"
"l3QlFEMUFVZzlYOFpKTHlmY3dIQVNRQ3QxYktWek9NeFJRbVIzd05LNGRLZG9m"
"SUdyeEU5U2p1TFI2UGE4QjVuMDhTWUo4SzYyZ2UrOWE2QnRaYWxFbS9IT2Rjej"
"BOQUZPY3ljckYvQ3RTQTQ9In1dfQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained an invalid validator key,
// skipping - missing
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
@@ -2157,31 +2510,105 @@ class Import_test : public beast::unit_test::suite
"k2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4"
"WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUj"
"ZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9D"
"dFNBND0ifV19=";
"dFNBND0ifV19";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob contained an invalid validator key,
// skipping
// {
// }
// temMALFORMED - Import: unl blob contained an invalid manifest,
// skipping
// {
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1"
"OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNE"
"RFNUMiLCJtYW5pZmVzdCI6Indyb25nIn0seyJ2YWxpZGF0aW9uX3B1YmxpY19r"
"ZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2Qj"
"A5OUVCNTVCMzhBNThDMTFDMTIwNERFNUMiLCJtYW5pZmVzdCI6Indyb25nIn1d"
"fQ==";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// }
// // temMALFORMED - Import: unl blob list entry manifest master key did
// // not match master key, skipping
// // temMALFORMED - Import: unl blob list entry manifest signature
// // invalid, skipping
// // temMALFORMED - Import: validator nodepub did not appear in
// validator
// // list but did appear
// // temMALFORMED - Import: validator nodepub key appears more than
// once
// // in data section
// temMALFORMED - Import: unl blob list entry manifest master key did
// not match master key, skipping
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1"
"OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNE"
"RFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQUp4SWUyKzR3K3VrdTdvamh4SmdOQ2V6"
"OTZab1JiUWVPd2hoWDJ4dEh0Q1pCamtLSE1oQTlTbUhEeE9pQ01UWmw1blJ4cn"
"AyeWpXWjVnangyRHJvVUZyVTRuckVxVTdka2N3UlFJaEFMZEVGZWpZK3BVbmds"
"aTdzVHZpYjBCbURIUDdONmlrVkVCSTZIN0l3VTF6QWlCZHN5b1NxUGNDMk5NcW"
"dBbkhYSEdka0FJd0JRRDFBVWc5WDhaSkx5ZmN3SEFTUUN0MWJLVnpPTXhSUW1S"
"M3dOSzRkS2RvZklHcnhFOVNqdUxSNlBhOEI1bjA4U1lKOEs2MmdlKzlhNkJ0Wm"
"FsRW0vSE9kY3owTkFGT2N5Y3JGL0N0U0E0PSJ9LHsidmFsaWRhdGlvbl9wdWJs"
"aWNfa2V5IjoiRURBRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMT"
"ZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFB"
"QUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQm"
"prS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJF"
"cVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQk"
"k2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4"
"WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUj"
"ZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9D"
"dFNBND0ifV19";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: unl blob list entry manifest signature
// invalid, skipping
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
tmpXpop[jss::validation][jss::unl][jss::blob] =
"eyJzZXF1ZW5jZSI6MiwiZXhwaXJhdGlvbiI6NzQxMzk4NDAwLCJ2YWxpZGF0b3"
"JzIjpbeyJ2YWxpZGF0aW9uX3B1YmxpY19rZXkiOiJFRDM4QkQ0NDVBRkQ2MjE1"
"OTYyMENDMTk2QzI2NjhBMjZCNkZCQjM2QjA5OUVCNTVCMzhBNThDMTFDMTIwNE"
"RFNUMiLCJtYW5pZmVzdCI6IkpBQUFBQVZ4SWUwNHZVUmEvV0lWbGlETUdXd21h"
"S0pyYjdzMnNKbnJWYk9LV01FY0VnVGVYSE1oQW9HTU5jc2dVVU53S28raDd6aG"
"FYS0YrSEd3NlhoRWpvREtyYWxrWW5Naktka2N3UlFJaEFKN2NONEo2TmRWZnBu"
"dkVJL1pldVdDVHZucGFKaXJLTkZjQzN6TU9qZ3dqQWlBYktJMGZiWGdTMVJMbG"
"9OaHhkSGhWcTlvekVXVkU5Y0l3WEROM0F4cXlZM0FTUUN0MCt1L2lOU0RENmJY"
"dlVUdGRtdDROcnRsYng0Vnp1bVRwZmpSWXA0bE1vSS9oNDNwVVRqcDdWRm9YYm"
"5LV2pWaHFOYUdtNTc3SzZKNjk3WFo3VFFFPSJ9LHsidmFsaWRhdGlvbl9wdWJs"
"aWNfa2V5IjoiRURCRUUzMEZBRTkyRUVFODhFMUM0OTgwRDA5RUNGREU5OUExMT"
"ZEMDc4RUMyMTg1N0RCMUI0N0I0MjY0MThFNDI4IiwibWFuaWZlc3QiOiJKQUFB"
"QUFKeEllMis0dyt1a3U3b2poeEpnTkNlejk2Wm9SYlFlT3doaFgyeHRIdENaQm"
"prS0hNaEE5U21IRHhPaUNNVFpsNW5SeHJwMnlqV1o1Z2p4MkRyb1VGclU0bnJF"
"cVU3ZGtjd1JRSWhBTGRFRmVqWStwVW5nbGk3c1R2aWIwQm1ESFA3TjZpa1ZFQk"
"k2SDdJd1UxekFpQmRzeW9TcVBjQzJOTXFnQW5IWEhHZGtBSXdCUUQxQVVnOVg4"
"WkpMeWZjd0hBU1FDdDFiS1Z6T014UlFtUjN3Tks0ZEtkb2ZJR3J4RTlTanVMUj"
"ZQYThCNW4wOFNZSjhLNjJnZSs5YTZCdFphbEVtL0hPZGN6ME5BRk9jeWNyRi9D"
"dFNBND0ifV19";
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: validator nodepub did not appear in
// validator list but did appear in data section
{
Json::Value tmpXpop = loadXpop(ImportTCAccountSet::w_seed);
Json::Value valData;
valData["n84QWAYxKUHacmyFTnzK4bvqVcUfr6RwtaNxCM2cJRY59UHmz1Fr"] =
"22800000012600000015292C4C84F53A29EC0A36EDAB6C61510AD4F33846A1"
"23D86FDAD30CBF175E217BA7B5394A5A761DA5C6B7A45D678DA85017208060"
"24F4F741C65B2E44B005CA293120889A6BC5F1E179335E20384AB3C6D15019"
"B94C4657B7529C72DDCE970A87E2EB9EE8EE12580ADFE6CF93B8672E4B289B"
"BC732103FCA947A7F08B146457BEF95AF0CF7C3ABF0D09CD1DC02099F7185C"
"37BB32807576473045022100BBBE6EDE0B2B61CD369E2188C8FBFACCB35CA2"
"D166FD29D5E3D7B2195083E74302201FAA160136301A43E518B9424A0DA5DC"
"1E7EF8B90DAE2FA87310047498514EB4";
tmpXpop[jss::validation][jss::data] = valData;
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: validator nodepub key appears more than
// once in data section
// DA: Impossible - Cannot serialize duplicate json fields
// temMALFORMED - Import: validation inside xpop was not valid hex
{
@@ -2211,6 +2638,7 @@ class Import_test : public beast::unit_test::suite
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: validation inside xpop was not signed with a
// signing key we recognise
{
@@ -2228,6 +2656,7 @@ class Import_test : public beast::unit_test::suite
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// temMALFORMED - Import: validation inside xpop was not correctly
// signed
{
@@ -2247,7 +2676,8 @@ class Import_test : public beast::unit_test::suite
}
// temMALFORMED - Import: validation inside xpop was not able to be
// parsed DA: Unknown Catch All
// parsed
// DA: Catch All
// temMALFORMED - Import: xpop did not contain an 80% quorum for the txn
// it purports to prove.
@@ -2288,7 +2718,8 @@ class Import_test : public beast::unit_test::suite
Json::Value const tx = import(alice, tmpXpop);
env(tx, ter(temMALFORMED));
}
// Bad Fee - TODO
// Bad Fee
// DA: Impossible - Cannot serialize negative number
}
void
@@ -5615,6 +6046,7 @@ public:
testIsBase58(features);
testIsBase64(features);
testParseUint64(features);
testSyntaxCheckProofArray(features);
testSyntaxCheckProofObject(features);
testSyntaxCheckXPOP(features);
testGetVLInfo(features);