Skip to content

Commit

Permalink
Fix requireAuth (#40)
Browse files Browse the repository at this point in the history
* improve requireAuth

* var naming

* rename vars

* update canTransfer
  • Loading branch information
shawnxie999 authored Oct 11, 2024
1 parent 9d51389 commit 8774b90
Showing 1 changed file with 29 additions and 12 deletions.
41 changes: 29 additions & 12 deletions src/xrpld/ledger/detail/View.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1720,15 +1720,29 @@ requireAuth(
AccountID const& account)
{
auto const mptID = keylet::mptIssuance(mptIssue.getMptID());
if (auto const sle = view.read(mptID);
sle && sle->getFieldU32(sfFlags) & lsfMPTRequireAuth)
{
auto const mptokenID = keylet::mptoken(mptID.key, account);
if (auto const tokSle = view.read(mptokenID); tokSle &&
//(sle->getFlags() & lsfMPTRequireAuth) &&
!(tokSle->getFlags() & lsfMPTAuthorized))
return TER{tecNO_AUTH};
}
auto const sleIssuance = view.read(mptID);

if (!sleIssuance)
return tecOBJECT_NOT_FOUND;

auto const mptIssuer = sleIssuance->getAccountID(sfIssuer);

// issuer is always "authorized"
if (mptIssuer == account)
return tesSUCCESS;

auto const mptokenID = keylet::mptoken(mptID.key, account);
auto const sleToken = view.read(mptokenID);

// if account has no MPToken, fail
if (!sleToken)
return tecNO_AUTH;

// mptoken must be authorized if issuance enabled requireAuth
if (sleIssuance->getFieldU32(sfFlags) & lsfMPTRequireAuth &&
!(sleToken->getFlags() & lsfMPTAuthorized))
return tecNO_AUTH;

return tesSUCCESS;
}

Expand All @@ -1740,10 +1754,13 @@ canTransfer(
AccountID const& to)
{
auto const mptID = keylet::mptIssuance(mptIssue.getMptID());
if (auto const sle = view.read(mptID);
sle && !(sle->getFieldU32(sfFlags) & lsfMPTCanTransfer))
auto const sleIssuance = view.read(mptID);
if (!sleIssuance)
return tecOBJECT_NOT_FOUND;

Check warning on line 1759 in src/xrpld/ledger/detail/View.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/ledger/detail/View.cpp#L1759

Added line #L1759 was not covered by tests

if (!(sleIssuance->getFieldU32(sfFlags) & lsfMPTCanTransfer))
{
if (from != (*sle)[sfIssuer] && to != (*sle)[sfIssuer])
if (from != (*sleIssuance)[sfIssuer] && to != (*sleIssuance)[sfIssuer])
return TER{tecNO_AUTH};
}
return tesSUCCESS;
Expand Down

0 comments on commit 8774b90

Please sign in to comment.