TER SetSignerList::removeSignersFromLedger (Keylet const& accountKeylet, Keylet const& ownerDirKeylet, Keylet const& signerListKeylet) { // We have to examine the current SignerList so we know how much to // reduce the OwnerCount. SLE::pointer signers = view().peek (signerListKeylet); // If the signer list doesn't exist we've already succeeded in deleting it. if (!signers) return tesSUCCESS; STArray const& actualList = signers->getFieldArray (sfSignerEntries); int const removeFromOwnerCount = ownerCountDelta (actualList.size()) * -1; // Remove the node from the account directory. auto const hint = (*signers)[sfOwnerNode]; auto viewJ = ctx_.app.journal ("View"); TER const result = dirDelete(ctx_.view(), false, hint, ownerDirKeylet.key, signerListKeylet.key, false, (hint == 0), viewJ); if (result == tesSUCCESS) adjustOwnerCount(view(), view().peek(accountKeylet), removeFromOwnerCount, viewJ); ctx_.view().erase (signers); return result; }
TER CancelTicket::doApply () { uint256 const ticketId = ctx_.tx.getFieldH256 (sfTicketID); // VFALCO This is highly suspicious, we're requiring that the // transaction provide the return value of getTicketIndex? SLE::pointer sleTicket = view().peek (keylet::ticket(ticketId)); if (!sleTicket) return tecNO_ENTRY; auto const ticket_owner = sleTicket->getAccountID (sfAccount); bool authorized = account_ == ticket_owner; // The target can also always remove a ticket if (!authorized && sleTicket->isFieldPresent (sfTarget)) authorized = (account_ == sleTicket->getAccountID (sfTarget)); // And finally, anyone can remove an expired ticket if (!authorized && sleTicket->isFieldPresent (sfExpiration)) { std::uint32_t const expiration = sleTicket->getFieldU32 (sfExpiration); if (view().parentCloseTime() >= expiration) authorized = true; } if (!authorized) return tecNO_PERMISSION; std::uint64_t const hint (sleTicket->getFieldU64 (sfOwnerNode)); auto viewJ = ctx_.app.journal ("View"); TER const result = dirDelete (ctx_.view (), false, hint, getOwnerDirIndex (ticket_owner), ticketId, false, (hint == 0), viewJ); adjustOwnerCount(view(), view().peek( keylet::account(ticket_owner)), -1, viewJ); ctx_.view ().erase (sleTicket); return result; }