diff --git a/src/cpp/ripple/AccountSetTransactor.cpp b/src/cpp/ripple/AccountSetTransactor.cpp index 08f2bedaf..7808dcdb6 100644 --- a/src/cpp/ripple/AccountSetTransactor.cpp +++ b/src/cpp/ripple/AccountSetTransactor.cpp @@ -8,13 +8,50 @@ TER AccountSetTransactor::doApply() const uint32 uTxFlags = mTxn.getFlags(); +#if ENABLE_REQUIRE_DEST_TAG + const uint32 uFlagsIn = mTxnAccount->getFieldU32(sfFlags); + uint32 uFlagsOut = uFlagsIn; + + if (uTxFlags & tfAccountSetMask) +#else if (uTxFlags) +#endif { cLog(lsINFO) << "AccountSet: Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } +#if ENABLE_REQUIRE_DEST_TAG + // + // RequireDestTag + // + + if ((tfRequireDestTag|tfOptionalDestTag) == (uTxFlags & (tfRequireDestTag|tfOptionalDestTag))) + { + cLog(lsINFO) << "AccountSet: Malformed transaction: Contradictory flags set."; + + return temINVALID_FLAG; + } + + if (uTxFlags & tfRequireDestTag) + { + cLog(lsINFO) << "AccountSet: Set RequireDestTag."; + + uFlagsOut |= lsfRequireDestTag; + } + + if (uTxFlags & tfOptionalDestTag) + { + cLog(lsINFO) << "AccountSet: Clear RequireDestTag."; + + uFlagsOut &= ~lsfRequireDestTag; + } + + if (uFlagsIn != uFlagsOut) + mTxnAccount->setFieldU32(sfFlags, uFlagsOut); +#endif + // // EmailHash // diff --git a/src/cpp/ripple/TransactionFormats.h b/src/cpp/ripple/TransactionFormats.h index 6af1a74d9..333ede8a9 100644 --- a/src/cpp/ripple/TransactionFormats.h +++ b/src/cpp/ripple/TransactionFormats.h @@ -2,6 +2,7 @@ #define __TRANSACTIONFORMATS__ #include "SerializedObject.h" +#include "LedgerFormats.h" enum TransactionType { @@ -58,6 +59,13 @@ const int TransactionMaxLen = 1048576; // Transaction flags. // +#if ENABLE_REQUIRE_DEST_TAG +// AccountSet flags: +const uint32 tfRequireDestTag = 0x00010000; +const uint32 tfOptionalDestTag = 0x00020000; +const uint32 tfAccountSetMask = ~(tfRequireDestTag|tfOptionalDestTag); +#endif + // OfferCreate flags: const uint32 tfPassive = 0x00010000; const uint32 tfOfferCreateMask = ~(tfPassive);