fix: Reject delegate permission to pseudo accounts (#7597)

This commit is contained in:
yinyiqian1
2026-06-23 15:55:23 -04:00
committed by GitHub
parent 0b22050b5e
commit 5a2c82f699
2 changed files with 18 additions and 1 deletions

View File

@@ -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 doesnt exist.
if (ctx.tx.getFieldArray(sfPermissions).empty() &&
!ctx.view.exists(keylet::delegate(ctx.tx[sfAccount], ctx.tx[sfAuthorize])))

View File

@@ -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));