mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-21 22:30:57 +00:00
fix: Reject delegate permission to pseudo accounts (#7597)
This commit is contained in:
@@ -52,9 +52,13 @@ DelegateSet::preclaim(PreclaimContext const& ctx)
|
||||
if (!ctx.view.exists(keylet::account(ctx.tx[sfAccount])))
|
||||
return terNO_ACCOUNT; // LCOV_EXCL_LINE
|
||||
|
||||
if (!ctx.view.exists(keylet::account(ctx.tx[sfAuthorize])))
|
||||
auto const sleAuthorize = ctx.view.read(keylet::account(ctx.tx[sfAuthorize]));
|
||||
if (!sleAuthorize)
|
||||
return tecNO_TARGET;
|
||||
|
||||
if (isPseudoAccount(sleAuthorize))
|
||||
return tecNO_PERMISSION;
|
||||
|
||||
// Deleting the delegate object is invalid if it doesn’t exist.
|
||||
if (ctx.tx.getFieldArray(sfPermissions).empty() &&
|
||||
!ctx.view.exists(keylet::delegate(ctx.tx[sfAccount], ctx.tx[sfAuthorize])))
|
||||
|
||||
@@ -235,6 +235,19 @@ class Delegate_test : public beast::unit_test::Suite
|
||||
env(delegate::set(gw, Account("unknown"), {"Payment"}), Ter(tecNO_TARGET));
|
||||
}
|
||||
|
||||
// Delegating to a pseudo-account is not allowed, should return tecNO_PERMISSION
|
||||
{
|
||||
Vault const vault{env};
|
||||
auto [tx, keylet] = vault.create({.owner = gw, .asset = xrpIssue()});
|
||||
env(tx);
|
||||
env.close();
|
||||
|
||||
auto const sleVault = env.le(keylet);
|
||||
BEAST_EXPECT(sleVault);
|
||||
Account const vaultPseudo{"vault", sleVault->at(sfAccount)};
|
||||
env(delegate::set(gw, vaultPseudo, {"Payment"}), Ter(tecNO_PERMISSION));
|
||||
}
|
||||
|
||||
// non-delegable transaction
|
||||
{
|
||||
env(delegate::set(gw, alice, {"SetRegularKey"}), Ter(temMALFORMED));
|
||||
|
||||
Reference in New Issue
Block a user