From 840729fb94f013a6f48563fb6faa4050f8827aa4 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 11 Jun 2021 15:34:19 +0200 Subject: [PATCH 1/2] compare with last transaction sended --- .../JSONInterface/JsonCreateTransaction.cpp | 7 ++++++ login_server/src/cpp/model/Session.cpp | 11 ++++++++ login_server/src/cpp/model/Session.h | 6 +++++ .../src/cpp/model/gradido/Transaction.cpp | 25 +++++++++++++++++++ .../src/cpp/model/gradido/Transaction.h | 2 ++ 5 files changed, 51 insertions(+) diff --git a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp index 5478f78cf..96f5a13a6 100644 --- a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp +++ b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp @@ -140,6 +140,13 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) try { auto transaction = model::gradido::Transaction::createTransfer(sender_user, target_pubkey, mTargetGroup, amount, mMemo, mBlockchainType); + if (mSession->lastTransactionTheSame(transaction)) { + return stateError("transaction are the same as the last (within 100 seconds)"); + } + else { + mSession->setLastTransaction(transaction); + } + if (mAutoSign) { Poco::JSON::Array errors; transaction->sign(sender_user); diff --git a/login_server/src/cpp/model/Session.cpp b/login_server/src/cpp/model/Session.cpp index f50fa87df..767f1acb3 100644 --- a/login_server/src/cpp/model/Session.cpp +++ b/login_server/src/cpp/model/Session.cpp @@ -919,6 +919,17 @@ bool Session::useOrGeneratePassphrase(const std::string& passphase) } */ +bool Session::lastTransactionTheSame(Poco::AutoPtr newTransaction) +{ + assert(!newTransaction.isNull()); + lock(); + if (mLastTransaction.isNull()) { + return false; + } + bool result = mLastTransaction->isTheSameTransaction(newTransaction); + unlock(); + return result; +} bool Session::generateKeys(bool savePrivkey, bool savePassphrase) { diff --git a/login_server/src/cpp/model/Session.h b/login_server/src/cpp/model/Session.h index 1607d23c9..26b1a1170 100644 --- a/login_server/src/cpp/model/Session.h +++ b/login_server/src/cpp/model/Session.h @@ -19,6 +19,8 @@ #include "../controller/EmailVerificationCode.h" +#include "model/gradido/Transaction.h" + #include "Poco/Thread.h" #include "Poco/Types.h" #include "Poco/DateTime.h" @@ -163,6 +165,8 @@ public: // ------------------------ transactions functions ---------------------------- + inline void setLastTransaction(Poco::AutoPtr lastTransaction) { lock(); mLastTransaction = lastTransaction; unlock(); } + bool lastTransactionTheSame(Poco::AutoPtr newTransaction); inline LanguageCatalog* getLanguageCatalog() { return mLanguageCatalog.isNull() ? nullptr : mLanguageCatalog; } void setLanguage(Languages lang); @@ -188,6 +192,7 @@ protected: private: + int mHandleId; Poco::AutoPtr mNewUser; std::string mPassphrase; @@ -200,6 +205,7 @@ private: Poco::AutoPtr mEmailVerificationCodeObject; std::shared_mutex mSharedMutex; + Poco::AutoPtr mLastTransaction; SessionStates mState; diff --git a/login_server/src/cpp/model/gradido/Transaction.cpp b/login_server/src/cpp/model/gradido/Transaction.cpp index 22ac8937f..16555c485 100644 --- a/login_server/src/cpp/model/gradido/Transaction.cpp +++ b/login_server/src/cpp/model/gradido/Transaction.cpp @@ -630,6 +630,31 @@ namespace model { } + bool Transaction::isTheSameTransaction(Poco::AutoPtr other) + { + bool result = false; + + auto other_proto = other->getTransactionBody()->getBody(); + auto other_created = other_proto->created(); + auto own_body_bytes = getTransactionBody()->getBodyBytes(); + auto own_body_updated = new proto::gradido::TransactionBody; + own_body_updated->ParseFromString(own_body_bytes); + auto own_created = own_body_updated->mutable_created(); + Poco::Int64 timeDiff = other_created.seconds() - own_created->seconds(); + *own_created = other_created; + + result = own_body_updated->SerializeAsString() == other_proto->SerializeAsString(); + + delete own_body_updated; + + // if they are more than 100 seconds between transaction they consider as not the same + if (abs(timeDiff) > 100) { + return false; + } + + return result; + } + /// TASK //////////////////////// SendTransactionTask::SendTransactionTask(Poco::AutoPtr transaction) diff --git a/login_server/src/cpp/model/gradido/Transaction.h b/login_server/src/cpp/model/gradido/Transaction.h index 80f5e7453..a35376040 100644 --- a/login_server/src/cpp/model/gradido/Transaction.h +++ b/login_server/src/cpp/model/gradido/Transaction.h @@ -86,6 +86,8 @@ namespace model { std::string getTransactionAsJson(bool replaceBase64WithHex = false); inline Poco::AutoPtr getPairedTransaction() { return mPairedTransaction; } + bool isTheSameTransaction(Poco::AutoPtr other); + protected: From a3fd334674abb2c1cf172c2dfcf196f5e15a9b05 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 14 Jun 2021 14:12:29 +0200 Subject: [PATCH 2/2] change 100 to 10 seconds timeout for double transaction --- login_server/src/cpp/model/gradido/Transaction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/login_server/src/cpp/model/gradido/Transaction.cpp b/login_server/src/cpp/model/gradido/Transaction.cpp index 16555c485..404d4f747 100644 --- a/login_server/src/cpp/model/gradido/Transaction.cpp +++ b/login_server/src/cpp/model/gradido/Transaction.cpp @@ -647,8 +647,8 @@ namespace model { delete own_body_updated; - // if they are more than 100 seconds between transaction they consider as not the same - if (abs(timeDiff) > 100) { + // if they are more than 10 seconds between transaction they consider as not the same + if (abs(timeDiff) > 10) { return false; }