Skip to content

Commit 6ff73ea

Browse files
authored
Merge branch 'develop' into simulate
2 parents 8357e89 + 0ec17b6 commit 6ff73ea

File tree

7 files changed

+184
-5
lines changed

7 files changed

+184
-5
lines changed

src/libxrpl/protocol/BuildInfo.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace BuildInfo {
3333
// and follow the format described at http://semver.org/
3434
//------------------------------------------------------------------------------
3535
// clang-format off
36-
char const* const versionString = "2.3.0-rc1"
36+
char const* const versionString = "2.3.0-rc2"
3737
// clang-format on
3838

3939
#if defined(DEBUG) || defined(SANITIZER)

src/libxrpl/protocol/SField.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ TypedField<T>::TypedField(private_access_tag_t pat, Args&&... args)
7272
// SFields which, for historical reasons, do not follow naming conventions.
7373
SField const sfInvalid(access, -1);
7474
SField const sfGeneric(access, 0);
75+
// The following two fields aren't used anywhere, but they break tests/have
76+
// downstream effects.
7577
SField const sfHash(access, STI_UINT256, 257, "hash");
78+
SField const sfIndex(access, STI_UINT256, 258, "index");
7679

7780
#include <xrpl/protocol/detail/sfields.macro>
7881

src/test/rpc/AMMInfo_test.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -316,13 +316,32 @@ class AMMInfo_test : public jtx::AMMTestBase
316316
});
317317
}
318318

319+
void
320+
testInvalidAmmField()
321+
{
322+
using namespace jtx;
323+
testcase("Invalid amm field");
324+
325+
testAMM([&](AMM& amm, Env&) {
326+
auto const resp = amm.ammRpcInfo(
327+
std::nullopt,
328+
jss::validated.c_str(),
329+
std::nullopt,
330+
std::nullopt,
331+
gw);
332+
BEAST_EXPECT(
333+
resp.isMember("error") && resp["error"] == "actNotFound");
334+
});
335+
}
336+
319337
void
320338
run() override
321339
{
322340
testErrors();
323341
testSimpleRpc();
324342
testVoteAndBid();
325343
testFreeze();
344+
testInvalidAmmField();
326345
}
327346
};
328347

src/test/rpc/LedgerRPC_test.cpp

+131-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <xrpld/app/misc/TxQ.h>
2727
#include <xrpl/basics/StringUtilities.h>
2828
#include <xrpl/beast/unit_test.h>
29+
#include <xrpl/json/json_value.h>
2930
#include <xrpl/protocol/AccountID.h>
3031
#include <xrpl/protocol/ErrorCodes.h>
3132
#include <xrpl/protocol/STXChainBridge.h>
@@ -1207,6 +1208,42 @@ class LedgerRPC_test : public beast::unit_test::suite
12071208
checkErrorValue(jrr[jss::result], "malformedRequest", "");
12081209
}
12091210

1211+
{
1212+
// Failed, authorized_credentials contains string data
1213+
Json::Value jvParams;
1214+
jvParams[jss::ledger_index] = jss::validated;
1215+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1216+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1217+
Json::arrayValue;
1218+
auto& arr(
1219+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1220+
arr.append("foobar");
1221+
1222+
auto const jrr =
1223+
env.rpc("json", "ledger_entry", to_string(jvParams));
1224+
checkErrorValue(
1225+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1226+
}
1227+
1228+
{
1229+
// Failed, authorized_credentials contains arrays
1230+
Json::Value jvParams;
1231+
jvParams[jss::ledger_index] = jss::validated;
1232+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1233+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1234+
Json::arrayValue;
1235+
auto& arr(
1236+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1237+
Json::Value payload = Json::arrayValue;
1238+
payload.append(42);
1239+
arr.append(std::move(payload));
1240+
1241+
auto const jrr =
1242+
env.rpc("json", "ledger_entry", to_string(jvParams));
1243+
checkErrorValue(
1244+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1245+
}
1246+
12101247
{
12111248
// Failed, authorized_credentials is empty array
12121249
Json::Value jvParams;
@@ -1263,6 +1300,27 @@ class LedgerRPC_test : public beast::unit_test::suite
12631300
jrr[jss::result], "malformedAuthorizedCredentials", "");
12641301
}
12651302

1303+
{
1304+
// Failed, issuer is not set
1305+
Json::Value jvParams;
1306+
jvParams[jss::ledger_index] = jss::validated;
1307+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1308+
1309+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1310+
Json::arrayValue;
1311+
auto& arr(
1312+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1313+
1314+
Json::Value jo;
1315+
jo[jss::credential_type] = strHex(std::string_view(credType));
1316+
arr.append(std::move(jo));
1317+
1318+
auto const jrr =
1319+
env.rpc("json", "ledger_entry", to_string(jvParams));
1320+
checkErrorValue(
1321+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1322+
}
1323+
12661324
{
12671325
// Failed, issuer isn't string
12681326
Json::Value jvParams;
@@ -1285,6 +1343,30 @@ class LedgerRPC_test : public beast::unit_test::suite
12851343
jrr[jss::result], "malformedAuthorizedCredentials", "");
12861344
}
12871345

1346+
{
1347+
// Failed, issuer is an array
1348+
Json::Value jvParams;
1349+
jvParams[jss::ledger_index] = jss::validated;
1350+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1351+
1352+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1353+
Json::arrayValue;
1354+
auto& arr(
1355+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1356+
1357+
Json::Value jo;
1358+
Json::Value payload = Json::arrayValue;
1359+
payload.append(42);
1360+
jo[jss::issuer] = std::move(payload);
1361+
jo[jss::credential_type] = strHex(std::string_view(credType));
1362+
arr.append(std::move(jo));
1363+
1364+
auto const jrr =
1365+
env.rpc("json", "ledger_entry", to_string(jvParams));
1366+
checkErrorValue(
1367+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1368+
}
1369+
12881370
{
12891371
// Failed, issuer isn't valid encoded account
12901372
Json::Value jvParams;
@@ -1307,12 +1389,32 @@ class LedgerRPC_test : public beast::unit_test::suite
13071389
jrr[jss::result], "malformedAuthorizedCredentials", "");
13081390
}
13091391

1392+
{
1393+
// Failed, credential_type is not set
1394+
Json::Value jvParams;
1395+
jvParams[jss::ledger_index] = jss::validated;
1396+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1397+
1398+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1399+
Json::arrayValue;
1400+
auto& arr(
1401+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1402+
1403+
Json::Value jo;
1404+
jo[jss::issuer] = issuer.human();
1405+
arr.append(std::move(jo));
1406+
1407+
auto const jrr =
1408+
env.rpc("json", "ledger_entry", to_string(jvParams));
1409+
checkErrorValue(
1410+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1411+
}
1412+
13101413
{
13111414
// Failed, credential_type isn't string
13121415
Json::Value jvParams;
13131416
jvParams[jss::ledger_index] = jss::validated;
13141417
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1315-
jvParams[jss::deposit_preauth][jss::authorized] = alice.human();
13161418

13171419
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
13181420
Json::arrayValue;
@@ -1326,15 +1428,39 @@ class LedgerRPC_test : public beast::unit_test::suite
13261428

13271429
auto const jrr =
13281430
env.rpc("json", "ledger_entry", to_string(jvParams));
1329-
checkErrorValue(jrr[jss::result], "malformedRequest", "");
1431+
checkErrorValue(
1432+
jrr[jss::result], "malformedAuthorizedCredentials", "");
1433+
}
1434+
1435+
{
1436+
// Failed, credential_type is an array
1437+
Json::Value jvParams;
1438+
jvParams[jss::ledger_index] = jss::validated;
1439+
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1440+
1441+
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1442+
Json::arrayValue;
1443+
auto& arr(
1444+
jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1445+
1446+
Json::Value jo;
1447+
jo[jss::issuer] = issuer.human();
1448+
Json::Value payload = Json::arrayValue;
1449+
payload.append(42);
1450+
jo[jss::credential_type] = std::move(payload);
1451+
arr.append(std::move(jo));
1452+
1453+
auto const jrr =
1454+
env.rpc("json", "ledger_entry", to_string(jvParams));
1455+
checkErrorValue(
1456+
jrr[jss::result], "malformedAuthorizedCredentials", "");
13301457
}
13311458

13321459
{
13331460
// Failed, credential_type isn't hex encoded
13341461
Json::Value jvParams;
13351462
jvParams[jss::ledger_index] = jss::validated;
13361463
jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1337-
jvParams[jss::deposit_preauth][jss::authorized] = alice.human();
13381464

13391465
jvParams[jss::deposit_preauth][jss::authorized_credentials] =
13401466
Json::arrayValue;
@@ -1348,7 +1474,8 @@ class LedgerRPC_test : public beast::unit_test::suite
13481474

13491475
auto const jrr =
13501476
env.rpc("json", "ledger_entry", to_string(jvParams));
1351-
checkErrorValue(jrr[jss::result], "malformedRequest", "");
1477+
checkErrorValue(
1478+
jrr[jss::result], "malformedAuthorizedCredentials", "");
13521479
}
13531480
}
13541481

src/test/rpc/ServerInfo_test.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,28 @@ admin = 127.0.0.1
198198
BEAST_EXPECT(
199199
result[jss::result][jss::TYPES]["AccountID"].asUInt() == 8);
200200

201+
// check exception SFields
202+
{
203+
auto const fieldExists = [&](std::string name) {
204+
for (auto& field : result[jss::result][jss::FIELDS])
205+
{
206+
if (field[0u].asString() == name)
207+
{
208+
return true;
209+
}
210+
}
211+
return false;
212+
};
213+
BEAST_EXPECT(fieldExists("Generic"));
214+
BEAST_EXPECT(fieldExists("Invalid"));
215+
BEAST_EXPECT(fieldExists("ObjectEndMarker"));
216+
BEAST_EXPECT(fieldExists("ArrayEndMarker"));
217+
BEAST_EXPECT(fieldExists("taker_gets_funded"));
218+
BEAST_EXPECT(fieldExists("taker_pays_funded"));
219+
BEAST_EXPECT(fieldExists("hash"));
220+
BEAST_EXPECT(fieldExists("index"));
221+
}
222+
201223
// test that base_uint types are replaced with "Hash" prefix
202224
{
203225
auto const types = result[jss::result][jss::TYPES];

src/xrpld/rpc/handlers/AMMInfo.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ doAMMInfo(RPC::JsonContext& context)
132132
if (!sle)
133133
return Unexpected(rpcACT_MALFORMED);
134134
ammID = sle->getFieldH256(sfAMMID);
135+
if (ammID->isZero())
136+
return Unexpected(rpcACT_NOT_FOUND);
135137
}
136138

137139
if (params.isMember(jss::account))

src/xrpld/rpc/handlers/LedgerEntry.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ parseAuthorizeCredentials(Json::Value const& jv)
4141
STArray arr(sfAuthorizeCredentials, jv.size());
4242
for (auto const& jo : jv)
4343
{
44+
if (!jo.isObject() || //
45+
!jo.isMember(jss::issuer) || !jo[jss::issuer].isString() ||
46+
!jo.isMember(jss::credential_type) ||
47+
!jo[jss::credential_type].isString())
48+
return {};
49+
4450
auto const issuer = parseBase58<AccountID>(jo[jss::issuer].asString());
4551
if (!issuer || !*issuer)
4652
return {};

0 commit comments

Comments
 (0)