fix: Prevent credentials from being created for pseudo-accounts

This commit is contained in:
Mayukha Vadari
2026-07-16 11:42:27 -04:00
committed by Ayaz Salikhov
parent a12ab0496c
commit d569f7db9e
2 changed files with 30 additions and 4 deletions

View File

@@ -84,7 +84,9 @@ CredentialCreate::preclaim(PreclaimContext const& ctx)
auto const credType(ctx.tx[sfCredentialType]);
auto const subject = ctx.tx[sfSubject];
if (!ctx.view.exists(keylet::account(subject)))
auto const subjectSle = ctx.view.read(keylet::account(subject));
if (!subjectSle)
{
JLOG(ctx.j.trace()) << "Subject doesn't exist.";
return tecNO_TARGET;
@@ -96,6 +98,12 @@ CredentialCreate::preclaim(PreclaimContext const& ctx)
return tecDUPLICATE;
}
if (ctx.view.rules().enabled(fixCleanup3_3_0) && isPseudoAccount(subjectSle))
{
JLOG(ctx.j.trace()) << "Subject is a pseudo-account.";
return tecNO_PERMISSION;
}
return tesSUCCESS;
}

View File

@@ -14,6 +14,7 @@
#include <test/jtx/ter.h>
#include <test/jtx/ticket.h>
#include <test/jtx/txflags.h>
#include <test/jtx/vault.h>
#include <xrpl/basics/strHex.h>
#include <xrpl/beast/unit_test/suite.h>
@@ -24,6 +25,7 @@
#include <xrpl/protocol/AccountID.h>
#include <xrpl/protocol/Feature.h>
#include <xrpl/protocol/Indexes.h>
#include <xrpl/protocol/Issue.h>
#include <xrpl/protocol/LedgerFormats.h>
#include <xrpl/protocol/Protocol.h>
#include <xrpl/protocol/SField.h>
@@ -425,7 +427,6 @@ struct Credentials_test : public beast::unit_test::Suite
Account const subject{"subject"};
{
using namespace jtx;
Env env{*this, features};
env.fund(XRP(5000), subject, issuer);
@@ -566,10 +567,27 @@ struct Credentials_test : public beast::unit_test::Suite
// End test
env.close();
}
{
testcase("Credentials fail, subject is a pseudo-account.");
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = subject, .asset = xrpIssue()});
env(tx);
env.close();
auto const sleVault = env.le(keylet);
if (!BEAST_EXPECT(sleVault))
return;
Account const vaultPseudo{"vault", sleVault->at(sfAccount)};
auto const expectedResult =
features[fixCleanup3_3_0] ? Ter(tecNO_PERMISSION) : Ter(tesSUCCESS);
env(credentials::create(vaultPseudo, issuer, credType), expectedResult);
env.close();
}
}
{
using namespace jtx;
Env env{*this, features};
env.fund(XRP(5000), issuer);
@@ -583,7 +601,6 @@ struct Credentials_test : public beast::unit_test::Suite
}
{
using namespace jtx;
Env env{*this, features};
auto const reserve = drops(env.current()->fees().reserve);
@@ -1157,6 +1174,7 @@ struct Credentials_test : public beast::unit_test::Suite
testCredentialsDelete(all);
testCreateFailed(all);
testCreateFailed(all - fixDirectoryLimit);
testCreateFailed(all - fixCleanup3_3_0);
testAcceptFailed(all);
testDeleteFailed(all);
testFeatureFailed(all - featureCredentials);