diff --git a/src/cpp/HTTPInterface/CheckTransactionPage.cpp b/src/cpp/HTTPInterface/CheckTransactionPage.cpp index f7cfd33b6..89aa80aec 100644 --- a/src/cpp/HTTPInterface/CheckTransactionPage.cpp +++ b/src/cpp/HTTPInterface/CheckTransactionPage.cpp @@ -656,76 +656,86 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\n"; responseStream << "\t\t\t\t\t\t"; #line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + if(((i+1) % 2) == 0 && transferTransaction->getTargetGroupAlias() != "") { responseStream << "\n"; + responseStream << "\t\t\t\t\t\t ("; +#line 243 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + responseStream << ( transferTransaction->getTargetGroupAlias() ); + responseStream << ")\n"; + responseStream << "\t\t\t\t\t\t"; +#line 244 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\t\t\t"; +#line 245 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( transferTransaction->getAmountCell(i) ); responseStream << "\n"; responseStream << "\t\t\t\t\t\n"; responseStream << "\t\t\t "; -#line 244 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 247 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t\t "; -#line 246 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 249 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else if(PAGE_TRANSACTION_CREATION == state) { auto creationTransaction = transaction_body->getCreationTransaction(); auto transactionUser = creationTransaction->getUser(); responseStream << "\n"; responseStream << "\t\t\t\t

"; -#line 250 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 253 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Schöpfung") ); responseStream << "

\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 253 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 256 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Konto") ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 254 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 257 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Zieldatum") ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 255 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 258 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Gradido") ); responseStream << "\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 258 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 261 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(!transactionUser.isNull()) { auto user_model = transactionUser->getModel(); responseStream << "\n"; responseStream << "\t\t\t\t\t\t"; -#line 261 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 264 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user_model->getFirstName() ); responseStream << " "; -#line 261 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 264 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user_model->getLastName() ); responseStream << " <"; -#line 261 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 264 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user_model->getEmail() ); responseStream << ">\n"; responseStream << "\t\t\t\t\t"; -#line 262 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 265 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t\t\t0x"; -#line 263 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 266 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getPublicHex() ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 264 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 267 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 265 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 268 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getTargetDateString() ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 266 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 269 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getAmountString() ); responseStream << " GDD\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t "; -#line 269 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 272 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else if(PAGE_TRANSACTION_GROUP_ADD_MEMBER == state) { auto groupMemberUpdateTransaction = transaction_body->getGroupMemberUpdate(); auto groups = controller::Group::load(groupMemberUpdateTransaction->getTargetGroupAlias()); @@ -740,112 +750,112 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, } responseStream << "\n"; responseStream << "\t\t\t

"; -#line 282 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 285 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Benutzer zu einer Gruppe hinzufügen") ); responseStream << "

\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t

"; -#line 284 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 287 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(!user.isNull()) { responseStream << "\n"; responseStream << "\t\t\t\t\tBenutzer: "; -#line 285 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 288 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user->getEmailWithNames() ); responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 286 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 289 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t\tAccount public key: "; -#line 287 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 290 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( groupMemberUpdateTransaction->getPublicKeyHex() ); responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 288 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 291 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "

\n"; responseStream << "\t\t\t\t"; -#line 289 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 292 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(!group_model.isNull()) { responseStream << "\n"; responseStream << "\t\t\t\t\t

"; -#line 290 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 293 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Gruppe") ); responseStream << ":

\n"; responseStream << "\t\t\t\t\t\n"; responseStream << "\t\t\t\t"; -#line 297 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 300 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 298 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 301 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Unbekannte Gruppe") ); responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 299 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 302 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 300 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 303 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Es haben bereits ") ); -#line 300 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 303 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( std::to_string(transaction->getSignCount()) ); -#line 300 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 303 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext(" unterzeichnet") ); responseStream << "\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t \n"; responseStream << "\t\t\t "; -#line 303 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 306 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else if(PAGE_USER_DATA_CORRUPTED == state) { responseStream << "\n"; responseStream << "\t\t\t\t

"; -#line 304 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 307 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Es gibt ein Problem mit deinen gespeicherten Daten, bitte wende dich an den")); responseStream << "getAdminReceiver()); responseStream << "?subject=Corrupt User Data&body=Hallo Dario,%0D%0A%0D%0Ameine Benutzer Daten sind korrupt.%0D%0Akannst du das prüfen?%0D%0A%0D%0AMit freundlichen Grüßen%0D%0A\">"; -#line 304 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 307 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << (gettext("Support") ); responseStream << "

\n"; responseStream << "\t\t\t "; -#line 305 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 308 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t "; -#line 306 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 309 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(PAGE_NO_TRANSACTIONS == state) { responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 307 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 310 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Zurück") ); responseStream << "\n"; responseStream << "\t\t\t "; -#line 308 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 311 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; @@ -853,7 +863,7 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 314 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 317 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user_model->getNameWithEmailHtml() ); responseStream << "\n"; responseStream << "\t\t\t\t
\n"; @@ -864,62 +874,62 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 322 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 325 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( memo ); responseStream << "\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 326 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 329 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(transaction) { responseStream << "\n"; responseStream << "\t\t\t\t\t\tgetModel()->getID() ); responseStream << "\">\n"; responseStream << "\t\t\t\t\t"; -#line 328 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 331 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t\n"; responseStream << "\t\t\t\t\t"; -#line 330 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 333 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(!account_user->hasPassword()) { responseStream << "\n"; responseStream << "\t\t\t\t\t
\n"; responseStream << "\t\t\t\t\t\t \n"; responseStream << "\t\t\t\t\t\t \n"; responseStream << "\t\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; -#line 335 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 338 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 336 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 339 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(enableSign && !hasErrors) { responseStream << "\n"; responseStream << "\t\t\t\t\t\t\n"; responseStream << "\t\t\t\t\t"; -#line 341 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 344 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 342 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 345 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(transaction_removeable) { responseStream << "\n"; responseStream << "\t\t\t\t\t\t\n"; @@ -936,21 +946,21 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t\t\t\n"; responseStream << "\t\t\t\t\t"; -#line 347 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 350 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t\t\t\n"; responseStream << "\t\t\t\t\t"; -#line 352 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 355 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t"; -#line 354 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 357 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\n"; responseStream << "\t\n"; diff --git a/src/cpp/HTTPInterface/LoginPage.cpp b/src/cpp/HTTPInterface/LoginPage.cpp index 0f14df37e..887768b58 100644 --- a/src/cpp/HTTPInterface/LoginPage.cpp +++ b/src/cpp/HTTPInterface/LoginPage.cpp @@ -67,7 +67,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: if(!form.empty()) { caller_uri = form.get("caller_uri", ""); - printf("form.get: caller_uri: %s\n", caller_uri.data()); + //printf("form.get: caller_uri: %s\n", caller_uri.data()); bool langUpdatedByBtn = false; auto langBtn = form.get("lang", ""); @@ -116,11 +116,12 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: } else { langCatalog = mSession->getLanguageCatalog(); */ - if(mSession) { + + /*if(mSession) { printf("start with session: %d\n", mSession->getHandle()); } else { printf("start without session\n"); - } + }*/ if(!mSession) { mSession = sm->getNewSession(); @@ -147,7 +148,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: } } - printf("after session: caller_uri: %s\n", caller_uri.data()); + //printf("after session: caller_uri: %s\n", caller_uri.data()); if(email != "" && password != "") { diff --git a/src/cpp/model/gradido/GroupMemberUpdate.cpp b/src/cpp/model/gradido/GroupMemberUpdate.cpp index 1a665445c..145e1e97a 100644 --- a/src/cpp/model/gradido/GroupMemberUpdate.cpp +++ b/src/cpp/model/gradido/GroupMemberUpdate.cpp @@ -2,6 +2,7 @@ #include "../../Crypto/KeyPairEd25519.h" #include "../../controller/Group.h" #include "../../SingletonManager/SessionManager.h" +#include "../../lib/JsonRequest.h" namespace model { namespace gradido { @@ -125,6 +126,9 @@ namespace model { // write new group_id in user table user_model->setGroupId(group_model->getID()); user_model->updateIntoDB("group_id", group_model->getID()); + + JsonRequest request(group_model->getUrl(), 443); + request.request("addUser", user->getJson()); printf("[GroupMemberUpdate::transactionAccepted] finished\n"); } diff --git a/src/cpp/model/gradido/Transaction.cpp b/src/cpp/model/gradido/Transaction.cpp index 6fa4b1446..3e5dad767 100644 --- a/src/cpp/model/gradido/Transaction.cpp +++ b/src/cpp/model/gradido/Transaction.cpp @@ -105,7 +105,7 @@ namespace model { return result; } - std::vector> Transaction::createTransfer(Poco::AutoPtr sender, const MemoryBin* receiverPubkey, Poco::AutoPtr receiverGroup, Poco::UInt32 amount, const std::string& memo) + std::vector> Transaction::createTransfer(Poco::AutoPtr sender, const MemoryBin* receiverPubkey, Poco::AutoPtr receiverGroup, Poco::UInt32 amount, const std::string& memo, bool inbound/* = true*/) { std::vector> results; auto em = ErrorManager::getInstance(); @@ -140,12 +140,13 @@ namespace model { Poco::AutoPtr topic_group; // default constructor set it to now Poco::Timestamp pairedTransactionId; - for (int i = 0; i < 2; i++) { - if (0 == i) { + // create only inbound transaction, and outbound before sending to hedera + //for (int i = 0; i < 1; i++) { + if (inbound) { transaction_group = receiverGroup; topic_group = sender_group; } - else { + else if(!inbound) { transaction_group = sender_group; topic_group = receiverGroup; } @@ -157,7 +158,7 @@ namespace model { return results; } if (transaction_group.isNull()) { - em->addError(new ParamError(function_name, "transaction group is zero, i:", i)); + em->addError(new ParamError(function_name, "transaction group is zero, inbound", inbound)); em->sendErrorsAsEmail(); return results; } @@ -166,12 +167,14 @@ namespace model { Poco::AutoPtr transaction = new Transaction(body); transaction->getModel()->setHederaId(topic_id->getModel()->getID()); results.push_back(transaction); - } + // } } + for (auto it = results.begin(); it != results.end(); it++) { (*it)->insertPendingTaskIntoDB(sender, model::table::TASK_TYPE_TRANSFER); PendingTasksManager::getInstance()->addTask(*it); } + return results; } @@ -308,6 +311,13 @@ namespace model { // check if enough signatures exist for next step if (getSignCount() >= mTransactionBody->getTransactionBase()->getMinSignatureCount()) { + if (getTransactionBody()->isTransfer()) { + auto transfer = getTransactionBody()->getTransferTransaction(); + if (transfer->isInbound()) { + auto transaction = transfer->createOutbound(getTransactionBody()->getMemo()); + transaction->sign(user); + } + } UniLib::controller::TaskPtr transaction_send_task(new SendTransactionTask(Poco::AutoPtr(this, true))); transaction_send_task->scheduleTask(transaction_send_task); } @@ -657,7 +667,22 @@ namespace model { int SendTransactionTask::run() { - auto result = mTransaction->runSendTransaction(); + int result = 1; + // if transfer inbound, create also transfer outbound + /*if (mTransaction->getTransactionBody()->isTransfer()) { + auto transfer = mTransaction->getTransactionBody()->getTransferTransaction(); + if (transfer->isInbound()) { + auto outbound = transfer->createOutbound(mTransaction->getTransactionBody()->getMemo()); + if (outbound.isNull()) { result = -1;} + + result = outbound->runSendTransaction(); + } + } + if (result != 1) { + mTransaction->deleteFromDB(); + return 0; + }*/ + result = mTransaction->runSendTransaction(); printf("[SendTransactionTask::run] result: %d\n", result); // delete because of error if (-1 == result) { diff --git a/src/cpp/model/gradido/Transaction.h b/src/cpp/model/gradido/Transaction.h index ee27a9719..c135fd89f 100644 --- a/src/cpp/model/gradido/Transaction.h +++ b/src/cpp/model/gradido/Transaction.h @@ -30,7 +30,7 @@ namespace model { static Poco::AutoPtr createGroupMemberUpdate(Poco::AutoPtr user, Poco::AutoPtr group); //! \brief transfer //! \return for cross group transaction return two transactions - static std::vector> createTransfer(Poco::AutoPtr sender, const MemoryBin* receiverPubkey, Poco::AutoPtr receiverGroup, Poco::UInt32 amount, const std::string& memo); + static std::vector> createTransfer(Poco::AutoPtr sender, const MemoryBin* receiverPubkey, Poco::AutoPtr receiverGroup, Poco::UInt32 amount, const std::string& memo, bool inbound = true); //! \brief creation transaction static Poco::AutoPtr createCreation(Poco::AutoPtr receiver, Poco::UInt32 amount, Poco::DateTime targetDate, const std::string& memo); static Poco::AutoPtr load(model::table::PendingTask* dbModel); @@ -60,6 +60,7 @@ namespace model { std::string getTransactionAsJson(bool replaceBase64WithHex = false); + protected: diff --git a/src/cpp/model/gradido/TransactionTransfer.cpp b/src/cpp/model/gradido/TransactionTransfer.cpp index 2837e1715..26442a4a1 100644 --- a/src/cpp/model/gradido/TransactionTransfer.cpp +++ b/src/cpp/model/gradido/TransactionTransfer.cpp @@ -1,4 +1,5 @@ #include "TransactionTransfer.h" +#include "Transaction.h" namespace model { namespace gradido { @@ -65,61 +66,61 @@ namespace model { Poco::ScopedLock _lock(mWorkMutex); const static char functionName[] = { "TransactionTransfer::prepare" }; - mKontoTable.reserve(2); + mKontoTable.reserve(2); - //auto receiverAmount = mProtoTransfer.receiveramount(); - //auto senderAmount + proto::gradido::TransferAmount* sender = nullptr; + std::string* receiver_pubkey = nullptr; + if (mProtoTransfer.has_local()) { + auto local_transfer = mProtoTransfer.local(); + sender = local_transfer.mutable_sender(); + receiver_pubkey = local_transfer.mutable_receiver(); + return prepare(sender, receiver_pubkey); + } + else if (mProtoTransfer.has_inbound()) { + auto inbound_transfer = mProtoTransfer.inbound(); + sender = inbound_transfer.mutable_sender(); + receiver_pubkey = inbound_transfer.mutable_receiver(); + return prepare(sender, receiver_pubkey); + } + else if (mProtoTransfer.has_outbound()) { + auto outbound_transfer = mProtoTransfer.outbound(); + sender = outbound_transfer.mutable_sender(); + receiver_pubkey = outbound_transfer.mutable_receiver(); + return prepare(sender, receiver_pubkey); + } + return -1; + } + + int TransactionTransfer::prepare(proto::gradido::TransferAmount* sender, std::string* receiver_pubkey) + { + assert(sender && receiver_pubkey); char pubkeyHexTemp[65]; + auto sender_pubkey = sender->pubkey(); + auto amount = sender->amount(); + auto sender_user = controller::User::create(); + auto receiver_user = controller::User::create(); - if (mProtoTransfer.has_local()) - { - auto local_transfer = mProtoTransfer.local(); - auto sender = local_transfer.sender(); - auto sender_pubkey = sender.pubkey(); - auto receiver_pubkey = local_transfer.receiver(); - auto amount = sender.amount(); - auto sender_user = controller::User::create(); - auto receiver_user = controller::User::create(); - - if (!sender_user->load((const unsigned char*)sender_pubkey.data())) { - sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size()); - mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, true)); - } - else { - mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), amount, true)); - } - - if (!receiver_user->load((const unsigned char*)receiver_pubkey.data())) { - sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); - mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, false)); - } - else { - mKontoTable.push_back(KontoTableEntry(receiver_user->getModel(), amount, false)); - } - mMinSignatureCount = 1; - auto mm = MemoryManager::getInstance(); - auto pubkey_copy = mm->getFreeMemory(KeyPairEd25519::getPublicKeySize()); - memcpy(*pubkey_copy, sender_pubkey.data(), KeyPairEd25519::getPublicKeySize()); - mRequiredSignPublicKeys.push_back(pubkey_copy); - } - - - // TODO: add version for group transfer - - - /* - mReceiverUser = new User(receiverPublic.data()); - getErrors(mReceiverUser); - if (mReceiverUser->getUserState() == USER_EMPTY) { - sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size()); - delete mReceiverUser; - mReceiverUser = nullptr; + if (!sender_user->load((const unsigned char*)sender_pubkey.data())) { + sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size()); + mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, true)); } else { - memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64); + mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), amount, true)); } - //*/ + + if (!receiver_user->load((const unsigned char*)receiver_pubkey->data())) { + sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey->data(), receiver_pubkey->size()); + mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, false)); + } + else { + mKontoTable.push_back(KontoTableEntry(receiver_user->getModel(), amount, false)); + } + mMinSignatureCount = 1; + auto mm = MemoryManager::getInstance(); + auto pubkey_copy = mm->getFreeMemory(KeyPairEd25519::getPublicKeySize()); + memcpy(*pubkey_copy, sender_pubkey.data(), KeyPairEd25519::getPublicKeySize()); + mRequiredSignPublicKeys.push_back(pubkey_copy); mIsPrepared = true; return 0; @@ -127,12 +128,42 @@ namespace model { TransactionValidation TransactionTransfer::validate() { + Poco::ScopedLock _lock(mWorkMutex); static const char function_name[] = "TransactionTransfer::validate"; - if (!mProtoTransfer.has_local()) { + /*if (!mProtoTransfer.has_local()) { addError(new Error(function_name, "only local currently implemented")); return TRANSACTION_VALID_CODE_ERROR; + }*/ + proto::gradido::TransferAmount* sender = nullptr; + std::string* receiver_pubkey = nullptr; + if (mProtoTransfer.has_local()) { + auto local_transfer = mProtoTransfer.local(); + sender = local_transfer.mutable_sender(); + receiver_pubkey = local_transfer.mutable_receiver(); + return validate(sender, receiver_pubkey); } - auto amount = mProtoTransfer.local().sender().amount(); + else if (mProtoTransfer.has_inbound()) { + auto inbound_transfer = mProtoTransfer.inbound(); + sender = inbound_transfer.mutable_sender(); + receiver_pubkey = inbound_transfer.mutable_receiver(); + return validate(sender, receiver_pubkey); + } + else if (mProtoTransfer.has_outbound()) { + auto outbound_transfer = mProtoTransfer.outbound(); + sender = outbound_transfer.mutable_sender(); + receiver_pubkey = outbound_transfer.mutable_receiver(); + return validate(sender, receiver_pubkey); + } + + return TRANSACTION_VALID_CODE_ERROR; + } + + TransactionValidation TransactionTransfer::validate(proto::gradido::TransferAmount* sender, std::string* receiver_pubkey) + { + assert(sender && receiver_pubkey); + + static const char function_name[] = "TransactionTransfer::validate"; + auto amount = sender->amount(); if (0 == amount) { addError(new Error(function_name, "amount is empty")); return TRANSACTION_VALID_INVALID_AMOUNT; @@ -141,15 +172,56 @@ namespace model { addError(new Error(function_name, "negative amount")); return TRANSACTION_VALID_INVALID_AMOUNT; } - if (mProtoTransfer.local().receiver().size() != KeyPairEd25519::getPublicKeySize()) { + if (receiver_pubkey->size() != KeyPairEd25519::getPublicKeySize()) { addError(new Error(function_name, "invalid size of receiver pubkey")); return TRANSCATION_VALID_INVALID_PUBKEY; } - if (mProtoTransfer.local().sender().pubkey().size() != KeyPairEd25519::getPublicKeySize()) { + if (sender->pubkey().size() != KeyPairEd25519::getPublicKeySize()) { addError(new Error(function_name, "invalid size of sender pubkey")); return TRANSCATION_VALID_INVALID_PUBKEY; } return TRANSACTION_VALID_OK; + } + + std::string TransactionTransfer::getTargetGroupAlias() + { + Poco::ScopedLock _lock(mWorkMutex); + if (mProtoTransfer.has_local()) { + return ""; + } + else if (mProtoTransfer.has_inbound()) { + auto inbound_transfer = mProtoTransfer.inbound(); + return inbound_transfer.other_group(); + } + else if (mProtoTransfer.has_outbound()) { + auto outbound_transfer = mProtoTransfer.outbound(); + return outbound_transfer.other_group(); + } + } + + Poco::AutoPtr TransactionTransfer::createOutbound(const std::string& memo) + { + const char* function_name = "TransactionTransfer::createOutbound"; + auto mm = MemoryManager::getInstance(); + if (!mProtoTransfer.has_inbound()) { + return nullptr; + } + // Poco::AutoPtr sender, const MemoryBin* receiverPubkey, Poco::AutoPtr receiverGroup, Poco::UInt32 amount, const std::string& memo + //Transaction::createTransfer() + auto inbound = mProtoTransfer.inbound(); + auto sender = controller::User::create(); + if (1 != sender->load((const unsigned char*)inbound.sender().pubkey().data())) { + return nullptr; + } + auto receiver_pubkey = mm->getFreeMemory(inbound.receiver().size()); + memcpy(*receiver_pubkey, inbound.receiver().data(), inbound.receiver().size()); + auto groups = controller::Group::load(inbound.other_group()); + if (1 != groups.size()) { + return nullptr; + } + auto transaction = Transaction::createTransfer(sender, receiver_pubkey, groups[0], inbound.sender().amount(), memo, false); + mm->releaseMemory(receiver_pubkey); + return transaction[0]; } diff --git a/src/cpp/model/gradido/TransactionTransfer.h b/src/cpp/model/gradido/TransactionTransfer.h index 14d1e01b9..558c8a7db 100644 --- a/src/cpp/model/gradido/TransactionTransfer.h +++ b/src/cpp/model/gradido/TransactionTransfer.h @@ -12,6 +12,7 @@ #pragma warning(disable:4800) #include "TransactionBase.h" +//#include "Transaction.h" #include "../proto/gradido/GradidoTransfer.pb.h" #include "../controller/User.h" @@ -19,6 +20,8 @@ namespace model { namespace gradido { + class Transaction; + class TransactionTransfer : public TransactionBase { public: @@ -32,11 +35,18 @@ namespace model { const std::string& getKontoNameCell(int index); const std::string& getAmountCell(int index); + std::string getTargetGroupAlias(); + bool isInbound() { return mProtoTransfer.has_inbound(); } + Poco::AutoPtr createOutbound(const std::string& memo); + void transactionAccepted(Poco::AutoPtr user); protected: const static std::string mInvalidIndexMessage; + int prepare(proto::gradido::TransferAmount* sender, std::string* receiver_pubkey); + TransactionValidation validate(proto::gradido::TransferAmount* sender, std::string* receiver_pubkey); + struct KontoTableEntry { public: diff --git a/src/cpp/model/table/PendingTask.cpp b/src/cpp/model/table/PendingTask.cpp index 5bee7339a..b33f2683a 100644 --- a/src/cpp/model/table/PendingTask.cpp +++ b/src/cpp/model/table/PendingTask.cpp @@ -142,9 +142,11 @@ namespace model select << "SELECT id FROM " << getTableName() << " WHERE user_id = ? " + << " AND hedera_id = ? " + << " AND request = ?" << " AND TIMESTAMPDIFF(SECOND, created, ?) = 0 " << " AND task_type_id = ? " - , into(mID), use(mUserId), use(mCreated), use(mTaskTypeId); + , into(mID), use(mUserId), use(mHederaId), use(mRequest), use(mCreated), use(mTaskTypeId); return select; } diff --git a/src/cpsp/checkTransaction.cpsp b/src/cpsp/checkTransaction.cpsp index fd0d5fecc..ed22883bd 100644 --- a/src/cpsp/checkTransaction.cpsp +++ b/src/cpsp/checkTransaction.cpsp @@ -339,6 +339,9 @@ enum PageState {
<% } %> <%= transferTransaction->getKontoNameCell(i) %> + <% if(((i+1) % 2) == 0 && transferTransaction->getTargetGroupAlias() != "") { %> + (<%= transferTransaction->getTargetGroupAlias() %>) + <% } %> <%= transferTransaction->getAmountCell(i) %>
<% } %> diff --git a/src/cpsp/login.cpsp b/src/cpsp/login.cpsp index 3c73650bd..9fce06102 100644 --- a/src/cpsp/login.cpsp +++ b/src/cpsp/login.cpsp @@ -41,7 +41,7 @@ if(!form.empty()) { caller_uri = form.get("caller_uri", ""); - printf("form.get: caller_uri: %s\n", caller_uri.data()); + //printf("form.get: caller_uri: %s\n", caller_uri.data()); bool langUpdatedByBtn = false; auto langBtn = form.get("lang", ""); @@ -93,11 +93,11 @@ langCatalog = mSession->getLanguageCatalog(); */ - if(mSession) { + /*if(mSession) { printf("start with session: %d\n", mSession->getHandle()); } else { printf("start without session\n"); - } + }*/ if(!mSession) { mSession = sm->getNewSession(); @@ -124,7 +124,7 @@ } } - printf("after session: caller_uri: %s\n", caller_uri.data()); + //printf("after session: caller_uri: %s\n", caller_uri.data()); if(email != "" && password != "") {