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\t\t- ";
-#line 292 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 295 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Name") );
responseStream << ": ";
-#line 292 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 295 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getName() );
responseStream << "
\n";
responseStream << "\t\t\t\t\t\t- ";
-#line 293 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 296 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Alias") );
responseStream << ": ";
-#line 293 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 296 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getAlias() );
responseStream << "
\n";
responseStream << "\t\t\t\t\t\t- ";
-#line 294 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 297 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Url") );
responseStream << ": getUrl() );
responseStream << "/pages/visitor\" target=\"_blank\">";
-#line 294 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 297 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getUrl() );
responseStream << "
\n";
responseStream << "\t\t\t\t\t\t- ";
-#line 295 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
+#line 298 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getDescription() );
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\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 != "") {