update CheckTransactionPage to use new PendingTasksManager and add GroupMemberUpdate transaction view

This commit is contained in:
Dario 2020-10-20 13:54:13 +02:00 committed by Ulf Gebhardt
parent d8035cac3d
commit b34d547881
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
20 changed files with 546 additions and 86 deletions

View File

@ -10,14 +10,18 @@
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/EmailManager.h"
#include "../SingletonManager/PendingTasksManager.h"
#include "../model/gradido/TransactionCreation.h"
#include "../model/gradido/TransactionTransfer.h"
#include "../lib/DataTypeConverter.h"
#include "Poco/Thread.h"
enum PageState {
PAGE_TRANSACTION_CREATION,
PAGE_TRANSACTION_TRANSFER,
PAGE_TRANSACTION_GROUP_ADD_MEMBER,
PAGE_NO_TRANSACTIONS,
PAGE_USER_DATA_CORRUPTED
};
@ -44,6 +48,7 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
auto account_user = mSession->getNewUser();
auto user_model = account_user->getModel();
auto em = EmailManager::getInstance();
auto pt = PendingTasksManager::getInstance();
auto userBalance = account_user->getBalance();
std::string memo = "";
bool hasErrors = false;
@ -55,9 +60,18 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
addError(new Error(gettext("E-Mail Aktivierung"), gettext("E-Mail wurde noch nicht aktiviert, du kannst leider noch keine Transaktionen ausführen!")));
hasErrors = true;
}
bool transaction_finalize_run = false;
bool transaction_finalize_result = false;
auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
Poco::AutoPtr<model::gradido::Transaction> transaction;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
if(transactions_to_sign.size() > 0)
{
transaction = transactions_to_sign[0];
transaction_body = transaction->getTransactionBody();
}
if(!form.empty()) {
auto ok = form.get("ok", "");
@ -116,32 +130,103 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
breakCount++;
Poco::Thread::sleep(10);
}*/
auto pending_task_id_string = form.get("pending-task-id", "");
int pending_task_id = 0;
if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id))
{
// make sure we have the correct transaction
transaction.assign(nullptr);
transaction_body.assign(nullptr);
for(auto it = transactions_to_sign.begin(); it != transactions_to_sign.end(); it++)
{
if((*it)->getModel()->getID() == pending_task_id) {
transaction = *it;
transaction_body = transaction->getTransactionBody();
break;
}
}
if(abort != "")
{
//mSession->finalizeTransaction(false, true);
//
if(!transaction.isNull() && transaction->getModel()->getUserId() == user_model->getID())
{
transaction->deleteFromDB();
transactions_to_sign.clear();
transaction.assign(nullptr);
transaction_body.assign(nullptr);
}
}
else if(ok != "")
{
if(!account_user->hasPassword()) {
auto pwd = form.get("sign-password", "");
auto loginResult = account_user->login(pwd);
switch(loginResult) {
case 0:
addError(new Error(gettext("Passwort"), gettext("Das Passwort stimmt nicht. Bitte verwende dein Passwort von der Registrierung")));
hasErrors = true;
break;
case -1:
case -2:
addError(new Error(gettext("Passwort"), gettext("Gespeicherte Daten sind korrupt!")));
hasErrors = true;
state = PAGE_USER_DATA_CORRUPTED;
break;
case -3:
addError(new Error(gettext("Passwort"), gettext("Passwortprüfung läuft schon, bitte versuche es in 1-2 Minuten erneut.")));
hasErrors = true;
break;
}
}
if(!hasErrors) {
mSession->finalizeTransaction(true, false);
}
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
}
}
if(transaction.isNull())
{
transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
if(transactions_to_sign.size() > 0)
{
transaction = transactions_to_sign[0];
transaction_body = transaction->getTransactionBody();
}
}
size_t sumTransactions = transactions_to_sign.size();
if(sumTransactions == 0)
{
auto lastExternReferer = mSession->getLastReferer();
//lastExternReferer = "";
account_user->reload();
if(lastExternReferer != "" && lastExternReferer.find("transaction-send-coins") == std::string::npos) {
//printf("last extern referer: %s\n", lastExternReferer.data());
response.redirect(lastExternReferer);
} else if(!account_user->getModel()->getGroupId()) {
response.redirect(ServerConfig::g_serverPath + "/userUpdateGroup");
} else {
response.redirect(ServerConfig::g_php_serverPath + "state-balances/overview");
}
return;
}
// skip transactions with errors
Poco::AutoPtr<ProcessingTransaction> processingTransaction;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
do {
processingTransaction = mSession->getNextReadyTransaction(&notReadyTransactions);
transaction_body = processingTransaction->getTransactionBody();
} while(!processingTransaction.isNull() && transaction_body.isNull());
if(sumTransactions > 0) {
if(sumTransactions > 0)
{
enableLogout = false;
}
if(PAGE_NO_TRANSACTIONS == state && !processingTransaction.isNull() && !transaction_body.isNull()) {
if(PAGE_NO_TRANSACTIONS == state && sumTransactions > 0)
{
auto transactionType = transaction_body->getType();
auto memo = transaction_body->getMemo();
switch(transactionType) {
case model::gradido::TRANSACTION_CREATION: state = PAGE_TRANSACTION_CREATION; break;
case model::gradido::TRANSACTION_TRANSFER: state = PAGE_TRANSACTION_TRANSFER; break;
case model::gradido::TRANSACTION_GROUP_MEMBER_UPDATE: state = PAGE_TRANSACTION_GROUP_ADD_MEMBER; break;
}
}
@ -352,135 +437,227 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "<div class=\"content-container main-container\">\n";
responseStream << "\t<div class=\"action-form\">\n";
responseStream << "\t\t<p class=\"form-header\">";
#line 159 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Transaktion Unterzeichnen") );
responseStream << "</p>\n";
responseStream << "\t\t<div class=\"form-content\">\n";
responseStream << "\t\t";
#line 161 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(state == PAGE_TRANSACTION_TRANSFER) {
auto transferTransaction = transaction_body->getTransferTransaction();
memo = transferTransaction->getMemo();
responseStream << "\n";
responseStream << "\t\t\t<p>";
#line 165 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("&Uuml;berweisung") );
responseStream << "</p>\n";
responseStream << "\t\t\t<div class=\"content-table\">\n";
responseStream << "\t\t\t <div class=\"content-row content-row-header\">\n";
responseStream << "\t\t\t\t<span class=\"content-cell\">";
#line 168 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 181 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Konto") );
responseStream << "</span>\n";
responseStream << "\t\t\t\t<span class=\"content-cell\">";
#line 169 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 182 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Gradido") );
responseStream << "</span>\n";
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t ";
#line 171 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 184 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
for(int i = 0; i < transferTransaction->getKontoTableSize(); i++) { responseStream << "\t\t\t\t\t\n";
responseStream << "\t\t\t\t\t";
#line 172 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 185 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if((i+1) % 2 == 0) { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<div class=\"content-row content-row\">\n";
responseStream << "\t\t\t\t\t";
#line 174 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 187 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<div class=\"content-row content-row-bg\">\n";
responseStream << "\t\t\t\t\t";
#line 176 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 189 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 177 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 190 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( transferTransaction->getKontoNameCell(i) );
responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 178 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( transferTransaction->getAmountCell(i) );
responseStream << "\n";
responseStream << "\t\t\t\t\t</div>\n";
responseStream << "\t\t\t ";
#line 180 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 193 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t ";
#line 182 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else if(PAGE_TRANSACTION_CREATION == state) {
auto creationTransaction = transaction_body->getCreationTransaction();
auto transactionUser = creationTransaction->getUser();
memo = creationTransaction->getMemo();
responseStream << "\n";
responseStream << "\t\t\t\t<p>";
#line 187 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 199 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Sch&ouml;pfung") );
responseStream << "</p>\n";
responseStream << "\t\t\t\t<div class=\"content-table\">\n";
responseStream << "\t\t\t\t <div class=\"content-row content-row-header\">\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 190 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 202 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Konto") );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 191 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 203 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Zieldatum") );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 192 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Gradido") );
responseStream << "</span>\n";
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t <div class=\"content-row content-row-bg\">\n";
responseStream << "\t\t\t\t\t";
#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 207 "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<span class=\"content-cell\">";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 210 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getFirstName() );
responseStream << " ";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 210 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getLastName() );
responseStream << " &lt;";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 210 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getEmail() );
responseStream << "&gt;</span>\n";
responseStream << "\t\t\t\t\t";
#line 197 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 211 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<span class=\"content-cell\">0x";
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 212 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( creationTransaction->getPublicHex() );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t";
#line 199 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 213 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 200 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 214 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( creationTransaction->getTargetDateString() );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell success-color\">";
#line 201 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 215 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( creationTransaction->getAmountString() );
responseStream << " GDD</span>\n";
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t ";
#line 218 "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());
Poco::AutoPtr<model::table::Group> group_model;
Poco::AutoPtr<controller::User> user;
if(groups.size() == 1 && !groups[0].isNull()) group_model = groups[0]->getModel();
auto user_id = transaction->getModel()->getUserId();
if(user_id == user_model->getID()) {
user = account_user;
} else {
user = controller::User::sload(user_id);
}
responseStream << "\n";
responseStream << "\t\t\t <p>";
#line 231 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Benutzer zu einer Gruppe hinzufügen") );
responseStream << "</p>\n";
responseStream << "\t\t\t <div class=\"content-table\">\n";
responseStream << "\t\t\t\t<p>";
#line 233 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(!user.isNull()) { responseStream << "\n";
responseStream << "\t\t\t\t\t<b>Benutzer:</b>&nbsp;";
#line 234 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user->getEmailWithNames() );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 235 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t<b>Account public key:</b>&nbsp;";
#line 236 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( groupMemberUpdateTransaction->getPublicKeyHex() );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 237 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "</p>\n";
responseStream << "\t\t\t\t";
#line 238 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(!group_model.isNull()) { responseStream << "\n";
responseStream << "\t\t\t\t\t<p><b>";
#line 239 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Gruppe") );
responseStream << ":</b></p>\n";
responseStream << "\t\t\t\t\t<ul>\n";
responseStream << "\t\t\t\t\t\t<li>";
#line 241 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Name") );
responseStream << ": ";
#line 241 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getName() );
responseStream << "</li>\n";
responseStream << "\t\t\t\t\t\t<li>";
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Alias") );
responseStream << ": ";
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getAlias() );
responseStream << "</li>\n";
responseStream << "\t\t\t\t\t\t<li>";
#line 243 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Url") );
responseStream << ": <a href=\"";
#line 243 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getUrl() );
responseStream << "/pages/visitor\" target=\"_blank\">";
#line 243 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getUrl() );
responseStream << "</a></li>\n";
responseStream << "\t\t\t\t\t\t<li>";
#line 244 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getDescription() );
responseStream << "</li>\n";
responseStream << "\t\t\t\t\t</ul>\n";
responseStream << "\t\t\t\t";
#line 246 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t";
#line 247 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Unbekannte Gruppe") );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 248 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t";
#line 249 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Es haben bereits ") );
#line 249 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( std::to_string(transaction->getSignCount()) );
#line 249 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext(" unterzeichnet") );
responseStream << "\n";
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t \n";
responseStream << "\t\t\t ";
#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 252 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else if(PAGE_USER_DATA_CORRUPTED == state) { responseStream << "\n";
responseStream << "\t\t\t\t<p class=\"alert-color\">";
#line 205 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 253 "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 << "<a href=\"mailto:";
#line 205 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 253 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( em->getAdminReceiver());
responseStream << "?subject=Corrupt User Data&amp;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 205 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 253 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << (gettext("Support") );
responseStream << "</a></p>\n";
responseStream << "\t\t\t ";
#line 206 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 254 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t<div class=\"content-table\">\n";
responseStream << "\t\t\t <div class=\"content-row content-row-header\">\n";
@ -488,7 +665,7 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t <div class=\"content-row\">\n";
responseStream << "\t\t\t\t<span class=\"content-cell\">";
#line 212 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 260 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getNameWithEmailHtml() );
responseStream << "</span>\n";
responseStream << "\t\t\t </div>\n";
@ -499,45 +676,49 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t <div class=\"content-row content-row-bg\">\n";
responseStream << "\t\t\t\t<span class=\"content-cell\">";
#line 220 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 268 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( memo );
responseStream << "</span>\n";
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t<form>\n";
responseStream << "\t\t\t\t<input type=\"hidden\" name=\"pending-task-id\" value=\"";
#line 272 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( transaction->getModel()->getID() );
responseStream << "\">\n";
responseStream << "\t\t\t\t";
#line 224 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 273 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(!account_user->hasPassword()) { responseStream << "\n";
responseStream << "\t\t\t\t <div class=\"form-group\">\n";
responseStream << "\t\t\t\t\t <label for=\"sign-password\">";
#line 226 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 275 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Ich brauche nochmal dein Passwort") );
responseStream << "</label>\n";
responseStream << "\t\t\t\t\t <input type=\"password\" class=\"form-control\" id=\"sign-password\" name=\"sign-password\" placeholder=\"";
#line 227 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 276 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Passwort") );
responseStream << "\">\n";
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t";
#line 229 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 278 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t";
#line 230 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 279 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(PAGE_USER_DATA_CORRUPTED != state && user_model->isEmailChecked()) { responseStream << "\n";
responseStream << "\t\t\t\t\t<button type=\"submit\" class=\"form-button\" name=\"ok\" value=\"ok\">\n";
responseStream << "\t\t\t\t\t\t<i class=\"material-icons-outlined\">verified_user</i>\n";
responseStream << "\t\t\t\t\t\t";
#line 233 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 282 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Transaktion unterzeichnen") );
responseStream << "\n";
responseStream << "\t\t\t\t\t</button>\n";
responseStream << "\t\t\t\t";
#line 235 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 284 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t<button type=\"submit\" class=\"form-button button-cancel\" name=\"abort\" value=\"abort\">\n";
responseStream << "\t\t\t\t\t<i class=\"material-icons-outlined\">delete</i>\n";
responseStream << "\t\t\t\t\t";
#line 238 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 287 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Transaktion verwerfen") );
responseStream << "\n";
responseStream << "\t\t\t\t</button>\n";

View File

@ -22,10 +22,8 @@ PendingTasksManager* PendingTasksManager::getInstance()
int PendingTasksManager::load()
{
// they add them self to Pending Task Manager
auto pending_tasks = controller::PendingTask::loadAll();
for (auto it = pending_tasks.begin(); it != pending_tasks.end(); it++) {
addTask(*it);
}
return 0;
}
@ -42,6 +40,26 @@ int PendingTasksManager::addTask(Poco::AutoPtr<controller::PendingTask> task)
}
bool PendingTasksManager::removeTask(Poco::AutoPtr<controller::PendingTask> task)
{
if (task.isNull() || !task->getModel()) {
return false;
}
auto model = task->getModel();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto pending_task_list = getTaskListForUser(model->getUserId());
bool removed = false;
for (auto it = pending_task_list->begin(); it != pending_task_list->end(); it++) {
if (task.get() == it->get()) {
pending_task_list->erase(it);
removed = true;
break;
}
}
// keep list for user in memory
return removed;
}
PendingTasksManager::PendingTaskList* PendingTasksManager::getTaskListForUser(int userId)
{
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
@ -105,3 +123,23 @@ std::vector<Poco::AutoPtr<controller::PendingTask>> PendingTasksManager::getPend
}
return results;
}
std::vector<Poco::AutoPtr<model::gradido::Transaction>> PendingTasksManager::getTransactionsUserMustSign(Poco::AutoPtr<controller::User> user)
{
// TODO: don'tuse cast here, because can lead to errors
std::vector<Poco::AutoPtr<model::gradido::Transaction>> transactions_to_sign;
for (auto map_it = mPendingTasks.begin(); map_it != mPendingTasks.end(); map_it++)
{
auto list = map_it->second;
for (auto list_it = list->begin(); list_it != list->end(); list_it++)
{
auto transaction = list_it->cast<model::gradido::Transaction>();
if (transaction->mustSign(user)) {
transaction.duplicate();
transactions_to_sign.push_back(transaction);
}
}
}
return transactions_to_sign;
}

View File

@ -15,6 +15,7 @@
#include "../controller/PendingTask.h"
#include "../controller/User.h"
#include "../model/gradido/Transaction.h"
class PendingTasksManager: public UniLib::lib::MultithreadContainer
{
@ -31,6 +32,7 @@ public:
//! \return -1 task is zero
//! \return 0 if added
int addTask(Poco::AutoPtr<controller::PendingTask> task);
bool removeTask(Poco::AutoPtr<controller::PendingTask> task);
//! by calling this, important is to call lock to prevent vanishing the list while working with it,
//! and unlock afterwards
@ -38,6 +40,7 @@ public:
const PendingTaskList* getTaskListForUser(int userId) const;
bool hasPendingTask(Poco::AutoPtr<controller::User> user, model::table::TaskType type);
std::vector<Poco::AutoPtr<controller::PendingTask>> getPendingTasks(Poco::AutoPtr<controller::User> user, model::table::TaskType type);
std::vector<Poco::AutoPtr<model::gradido::Transaction>> getTransactionsUserMustSign(Poco::AutoPtr<controller::User> user);
protected:
PendingTasksManager();

View File

@ -2,6 +2,7 @@
#include "../tasks/GradidoGroupAddMemberTask.h"
#include "../model/gradido/Transaction.h"
#include "../SingletonManager/PendingTasksManager.h"
namespace controller {
@ -73,4 +74,13 @@ namespace controller {
}
return resultVector;
}
bool PendingTask::deleteFromDB()
{
auto result = mDBModel->deleteFromDB();
if (result) {
PendingTasksManager::getInstance()->removeTask(this);
}
return result;
}
}

View File

@ -25,6 +25,8 @@ namespace controller {
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
inline Poco::AutoPtr<model::table::PendingTask> getModel() { return _getModel<model::table::PendingTask>(); }
//! \brief delete from db and remove from Pending Task Manager
bool deleteFromDB();
virtual bool isTimeoutTask() = 0;
virtual Poco::DateTime getNextRunTime() { return Poco::DateTime(); };

View File

@ -89,6 +89,23 @@ namespace controller {
Poco::Data::BLOB email_hash(*emailHash, crypto_generichash_BYTES);
return getModel()->loadFromDB("email_hash", email_hash);
}
Poco::AutoPtr<User> User::sload(int user_id)
{
auto db = new model::table::User();
if (0 == db->loadFromDB("id", user_id)) {
delete db;
return nullptr;
}
auto user = new User(db);
return Poco::AutoPtr<User>(user);
}
void User::reload()
{
getModel()->loadFromDB("id", getModel()->getID());
}
const std::string& User::getPublicHex()
{
if (mPublicHex != "") {

View File

@ -70,6 +70,8 @@ namespace controller {
//! \brief try to load user from db via user_id
//! \return count of found rows, should be 1 or 0
inline size_t load(int user_id) { return getModel()->loadFromDB("id", user_id); }
void reload();
static Poco::AutoPtr<User> sload(int user_id);
int load(const unsigned char* pubkey_array);
int load(MemoryBin* emailHash);
Poco::JSON::Object getJson();

View File

@ -57,7 +57,7 @@ namespace model {
return TRANSACTION_VALID_INVALID_GROUP_ALIAS;
}*/
}
mIsPrepared = true;
return 0;
}
@ -95,5 +95,11 @@ namespace model {
}
*/
std::string GroupMemberUpdate::getPublicKeyHex()
{
auto user_pubkey = mProtoMemberUpdate.user_pubkey();
return DataTypeConverter::binToHex((const unsigned char*)user_pubkey.data(), user_pubkey.size());
}
}
}

View File

@ -15,6 +15,9 @@ namespace model {
int prepare();
TransactionValidation validate();
std::string getTargetGroupAlias() { return mProtoMemberUpdate.target_group(); }
std::string getPublicKeyHex();
protected:
const proto::gradido::GroupMemberUpdate& mProtoMemberUpdate;
};

View File

@ -7,6 +7,7 @@ namespace model {
Transaction::Transaction(Poco::AutoPtr<TransactionBody> body)
: mTransactionBody(body), mBodyBytesHash(0)
{
auto body_bytes = mTransactionBody->getBodyBytes();
mBodyBytesHash = DRMakeStringHash(body_bytes.data(), body_bytes.size());
mProtoTransaction.set_body_bytes(body_bytes);
@ -35,6 +36,7 @@ namespace model {
}
auto group_model = group->getModel();
auto body = TransactionBody::create("", user, proto::gradido::GroupMemberUpdate_MemberUpdateType_ADD_USER, group_model->getAlias());
Poco::AutoPtr<Transaction> result = new Transaction(body);
auto model = result->getModel();
result->insertPendingTaskIntoDB(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER);
@ -67,6 +69,7 @@ namespace model {
model->setTaskType(type);
model->setRequest(mProtoTransaction.SerializeAsString());
if (!model->insertIntoDB(true)) {
return false;
}
return true;
@ -207,7 +210,47 @@ namespace model {
return result;
}
bool Transaction::hasSigned(Poco::AutoPtr<controller::User> user)
{
static const char* function_name = "Transaction::hasSigned";
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto sig_pairs = mProtoTransaction.sig_map().sigpair();
auto pubkey = user->getModel()->getPublicKey();
auto pubkey_size = user->getModel()->getPublicKeySize();
if (KeyPairEd25519::getPublicKeySize() != pubkey_size) {
addError(new ParamError(function_name, "user public key has invalid size: ", pubkey_size));
return false;
}
for (auto it = sig_pairs.begin(); it != sig_pairs.end(); it++)
{
if (it->pubkey().size() != KeyPairEd25519::getPublicKeySize()) {
addError(new ParamError(function_name, "signed public key has invalid length: ", it->pubkey().size()));
return false;
}
if (memcmp(pubkey, it->pubkey().data(), pubkey_size) == 0) {
return true;
}
}
return false;
}
//! return true if user must sign it and hasn't yet
bool Transaction::mustSign(Poco::AutoPtr<controller::User> user)
{
if (hasSigned(user)) return false;
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto transaction_base = mTransactionBody->getTransactionBase();
return transaction_base->isPublicKeyRequired(user->getModel()->getPublicKey());
}
//! return true if user can sign transaction and hasn't yet
bool Transaction::canSign(Poco::AutoPtr<controller::User> user)
{
if (hasSigned(user)) return false;
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto transaction_base = mTransactionBody->getTransactionBase();
return !transaction_base->isPublicKeyForbidden(user->getModel()->getPublicKey());
}
}

View File

@ -38,6 +38,14 @@ namespace model {
bool updateRequestInDB();
bool insertPendingTaskIntoDB(Poco::AutoPtr<controller::User> user, model::table::TaskType type);
//! return true if user must sign it and hasn't yet
bool mustSign(Poco::AutoPtr<controller::User> user);
//! return true if user can sign transaction and hasn't yet
bool canSign(Poco::AutoPtr<controller::User> user);
//! return true if user has already signed transaction
bool hasSigned(Poco::AutoPtr<controller::User> user);
protected:
Poco::AutoPtr<TransactionBody> mTransactionBody;
proto::gradido::GradidoTransaction mProtoTransaction;

View File

@ -6,7 +6,7 @@ namespace model {
namespace gradido {
TransactionBase::TransactionBase(const std::string& memo)
: mMemo(memo), mMinSignatureCount(0)
: mMemo(memo), mMinSignatureCount(0), mIsPrepared(false)
{
}
@ -113,6 +113,28 @@ namespace model {
return TRANSACTION_VALID_MISSING_SIGN;
}
bool TransactionBase::isPublicKeyRequired(const unsigned char* pubkey)
{
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
for (auto it = mRequiredSignPublicKeys.begin(); it != mRequiredSignPublicKeys.end(); it++) {
if (memcmp((*it)->data(), pubkey, KeyPairEd25519::getPublicKeySize()) == 0) {
return true;
}
}
return false;
}
bool TransactionBase::isPublicKeyForbidden(const unsigned char* pubkey)
{
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
for (auto it = mForbiddenSignPublicKeys.begin(); it != mForbiddenSignPublicKeys.end(); it++) {
if (memcmp((*it)->data(), pubkey, KeyPairEd25519::getPublicKeySize()) == 0) {
return true;
}
}
return false;
}
}
}

View File

@ -46,10 +46,15 @@ namespace model {
//! \return true if all required signatures are found in signature pairs
TransactionValidation checkRequiredSignatures(const proto::gradido::SignatureMap* sig_map);
//! \param pubkey pointer must point to valid unsigned char[KeyPairEd25519::getPublicKeySize()] array
bool isPublicKeyRequired(const unsigned char* pubkey);
//! \param pubkey pointer must point to valid unsigned char[KeyPairEd25519::getPublicKeySize()] array
bool isPublicKeyForbidden(const unsigned char* pubkey);
protected:
std::string mMemo;
Poco::UInt32 mMinSignatureCount;
bool mIsPrepared;
std::vector<MemoryBin*> mRequiredSignPublicKeys;
std::vector<MemoryBin*> mForbiddenSignPublicKeys;
};

View File

@ -31,6 +31,7 @@ namespace model {
obj->mType = TRANSACTION_GROUP_MEMBER_UPDATE;
obj->mTransactionSpecific = new GroupMemberUpdate(memo, obj->mTransactionBody.group_member_update());
obj->mTransactionSpecific->prepare();
return obj;
}
@ -56,6 +57,7 @@ namespace model {
obj->mType = TRANSACTION_GROUP_MEMBER_UPDATE;
obj->mTransactionSpecific = new model::gradido::GroupMemberUpdate(obj->mTransactionBody.memo(), obj->mTransactionBody.group_member_update());
}
obj->mTransactionSpecific->prepare();
return obj;
}

View File

@ -55,6 +55,7 @@ namespace model {
memcpy(*pubkey_copy, receiverPublic.data(), KeyPairEd25519::getPublicKeySize());
mForbiddenSignPublicKeys.push_back(pubkey_copy);
mIsPrepared = true;
return 0;
}

View File

@ -121,6 +121,7 @@ namespace model {
}
//*/
mIsPrepared = true;
unlock();
return 0;
}

View File

@ -54,7 +54,11 @@ namespace model {
Poco::Data::Statement select = _loadIdFromDB(session);
try {
select.executeAsync();
return select.wait() == 1;
auto result_count = select.wait();
if (result_count != 1) {
int zahl = 0;
}
return result_count;
}
catch (Poco::Exception& ex) {
addError(new ParamError(getTableName(), "mysql error by select id", ex.displayText().data()));

View File

@ -93,9 +93,9 @@ namespace model
lock();
select << "SELECT id FROM " << getTableName()
<< " WHERE user_id = ? "
<< " AND created = ? "
//<< " AND created LIKE ? "
<< " AND task_type_id = ? "
, into(mID), use(mUserId), use(mCreated), use(mTaskTypeId);
, into(mID), use(mUserId), /*use(mCreated),*/ use(mTaskTypeId);
unlock();
return select;
}

View File

@ -11,6 +11,9 @@ public:
GradidoTask(model::table::PendingTask* dbModel);
bool isTimeoutTask() { return false; }
protected:

View File

@ -8,14 +8,18 @@
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/EmailManager.h"
#include "../SingletonManager/PendingTasksManager.h"
#include "../model/gradido/TransactionCreation.h"
#include "../model/gradido/TransactionTransfer.h"
#include "../lib/DataTypeConverter.h"
#include "Poco/Thread.h"
enum PageState {
PAGE_TRANSACTION_CREATION,
PAGE_TRANSACTION_TRANSFER,
PAGE_TRANSACTION_GROUP_ADD_MEMBER,
PAGE_NO_TRANSACTIONS,
PAGE_USER_DATA_CORRUPTED
};
@ -26,6 +30,7 @@ enum PageState {
auto account_user = mSession->getNewUser();
auto user_model = account_user->getModel();
auto em = EmailManager::getInstance();
auto pt = PendingTasksManager::getInstance();
auto userBalance = account_user->getBalance();
std::string memo = "";
bool hasErrors = false;
@ -37,9 +42,18 @@ enum PageState {
addError(new Error(gettext("E-Mail Aktivierung"), gettext("E-Mail wurde noch nicht aktiviert, du kannst leider noch keine Transaktionen ausführen!")));
hasErrors = true;
}
bool transaction_finalize_run = false;
bool transaction_finalize_result = false;
auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
Poco::AutoPtr<model::gradido::Transaction> transaction;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
if(transactions_to_sign.size() > 0)
{
transaction = transactions_to_sign[0];
transaction_body = transaction->getTransactionBody();
}
if(!form.empty()) {
auto ok = form.get("ok", "");
@ -98,32 +112,103 @@ enum PageState {
breakCount++;
Poco::Thread::sleep(10);
}*/
auto pending_task_id_string = form.get("pending-task-id", "");
int pending_task_id = 0;
if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id))
{
// make sure we have the correct transaction
transaction.assign(nullptr);
transaction_body.assign(nullptr);
for(auto it = transactions_to_sign.begin(); it != transactions_to_sign.end(); it++)
{
if((*it)->getModel()->getID() == pending_task_id) {
transaction = *it;
transaction_body = transaction->getTransactionBody();
break;
}
}
if(abort != "")
{
//mSession->finalizeTransaction(false, true);
//
if(!transaction.isNull() && transaction->getModel()->getUserId() == user_model->getID())
{
transaction->deleteFromDB();
transactions_to_sign.clear();
transaction.assign(nullptr);
transaction_body.assign(nullptr);
}
}
else if(ok != "")
{
if(!account_user->hasPassword()) {
auto pwd = form.get("sign-password", "");
auto loginResult = account_user->login(pwd);
switch(loginResult) {
case 0:
addError(new Error(gettext("Passwort"), gettext("Das Passwort stimmt nicht. Bitte verwende dein Passwort von der Registrierung")));
hasErrors = true;
break;
case -1:
case -2:
addError(new Error(gettext("Passwort"), gettext("Gespeicherte Daten sind korrupt!")));
hasErrors = true;
state = PAGE_USER_DATA_CORRUPTED;
break;
case -3:
addError(new Error(gettext("Passwort"), gettext("Passwortprüfung läuft schon, bitte versuche es in 1-2 Minuten erneut.")));
hasErrors = true;
break;
}
}
if(!hasErrors) {
mSession->finalizeTransaction(true, false);
}
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
}
}
if(transaction.isNull())
{
transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
if(transactions_to_sign.size() > 0)
{
transaction = transactions_to_sign[0];
transaction_body = transaction->getTransactionBody();
}
}
size_t sumTransactions = transactions_to_sign.size();
if(sumTransactions == 0)
{
auto lastExternReferer = mSession->getLastReferer();
//lastExternReferer = "";
account_user->reload();
if(lastExternReferer != "" && lastExternReferer.find("transaction-send-coins") == std::string::npos) {
//printf("last extern referer: %s\n", lastExternReferer.data());
response.redirect(lastExternReferer);
} else if(!account_user->getModel()->getGroupId()) {
response.redirect(ServerConfig::g_serverPath + "/userUpdateGroup");
} else {
response.redirect(ServerConfig::g_php_serverPath + "state-balances/overview");
}
return;
}
// skip transactions with errors
Poco::AutoPtr<ProcessingTransaction> processingTransaction;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
do {
processingTransaction = mSession->getNextReadyTransaction(&notReadyTransactions);
transaction_body = processingTransaction->getTransactionBody();
} while(!processingTransaction.isNull() && transaction_body.isNull());
if(sumTransactions > 0) {
if(sumTransactions > 0)
{
enableLogout = false;
}
if(PAGE_NO_TRANSACTIONS == state && !processingTransaction.isNull() && !transaction_body.isNull()) {
if(PAGE_NO_TRANSACTIONS == state && sumTransactions > 0)
{
auto transactionType = transaction_body->getType();
auto memo = transaction_body->getMemo();
switch(transactionType) {
case model::gradido::TRANSACTION_CREATION: state = PAGE_TRANSACTION_CREATION; break;
case model::gradido::TRANSACTION_TRANSFER: state = PAGE_TRANSACTION_TRANSFER; break;
case model::gradido::TRANSACTION_GROUP_MEMBER_UPDATE: state = PAGE_TRANSACTION_GROUP_ADD_MEMBER; break;
}
}
@ -145,19 +230,10 @@ enum PageState {
<% } %>
<div class="col-md-10 equel-grid mb-3">
<small class="text-gray d-block mt-3">
<% if(sumTransactions > 0 && sumTransactions - notReadyTransactions != 1) { %>
<% if(notReadyTransactions > 0) { %>
<%= sumTransactions - notReadyTransactions %> <%= gettext("von") %> <%= sumTransactions %> <%= gettext("Transaktionen sind bereit zum best&auml;tigen") %>
<% } else { %>
<%= sumTransactions %> <%= gettext("Transaktionen warten darauf best&auml;tigt zu werden.") %>
<% } %>
<% } %>
<% if(state == PAGE_NO_TRANSACTIONS) { %>
<% if(sumTransactions == 0) { %>
<%= gettext("Es gibt zurzeit keine Transaktionen zum best&auml;tigen") %>
<% } else { %>
<%= gettext("Transaktion(en) werden noch vorbereitet, bitte lade die Seite in wenigen Augenblicken erneut.") %>
<% } %>
<% if(sumTransactions > 0) { %>
<%= sumTransactions %> <%= gettext("Transaktionen warten darauf best&auml;tigt zu werden.") %>
<% } else if(state == PAGE_NO_TRANSACTIONS) { %>
<%= gettext("Es gibt zurzeit keine Transaktionen zum best&auml;tigen") %>
<% } %>
</small>
</div>
@ -167,7 +243,6 @@ enum PageState {
<div class="form-content">
<% if(state == PAGE_TRANSACTION_TRANSFER) {
auto transferTransaction = transaction_body->getTransferTransaction();
memo = transferTransaction->getMemo();
%>
<p><%= gettext("&Uuml;berweisung") %></p>
<div class="content-table">
@ -189,7 +264,6 @@ enum PageState {
<% } else if(PAGE_TRANSACTION_CREATION == state) {
auto creationTransaction = transaction_body->getCreationTransaction();
auto transactionUser = creationTransaction->getUser();
memo = creationTransaction->getMemo();
%>
<p><%= gettext("Sch&ouml;pfung") %></p>
<div class="content-table">
@ -210,6 +284,40 @@ enum PageState {
<span class="content-cell success-color"><%= creationTransaction->getAmountString() %> GDD</span>
</div>
</div>
<% } else if(PAGE_TRANSACTION_GROUP_ADD_MEMBER == state) {
auto groupMemberUpdateTransaction = transaction_body->getGroupMemberUpdate();
auto groups = controller::Group::load(groupMemberUpdateTransaction->getTargetGroupAlias());
Poco::AutoPtr<model::table::Group> group_model;
Poco::AutoPtr<controller::User> user;
if(groups.size() == 1 && !groups[0].isNull()) group_model = groups[0]->getModel();
auto user_id = transaction->getModel()->getUserId();
if(user_id == user_model->getID()) {
user = account_user;
} else {
user = controller::User::sload(user_id);
}
%>
<p><%= gettext("Benutzer zu einer Gruppe hinzufügen") %></p>
<div class="content-table">
<p><% if(!user.isNull()) { %>
<b>Benutzer:</b>&nbsp;<%= user->getEmailWithNames() %>
<% } else { %>
<b>Account public key:</b>&nbsp;<%= groupMemberUpdateTransaction->getPublicKeyHex() %>
<% } %></p>
<% if(!group_model.isNull()) { %>
<p><b><%= gettext("Gruppe") %>:</b></p>
<ul>
<li><%= gettext("Name") %>: <%= group_model->getName() %></li>
<li><%= gettext("Alias") %>: <%= group_model->getAlias() %></li>
<li><%= gettext("Url") %>: <a href="<%= group_model->getUrl() %>/pages/visitor" target="_blank"><%= group_model->getUrl() %></a></li>
<li><%= group_model->getDescription() %></li>
</ul>
<% } else { %>
<%= gettext("Unbekannte Gruppe") %>
<% } %>
<%= gettext("Es haben bereits ") %><%= std::to_string(transaction->getSignCount()) %><%= gettext(" unterzeichnet") %>
</div>
<% } else if(PAGE_USER_DATA_CORRUPTED == state) { %>
<p class="alert-color"><%= gettext("Es gibt ein Problem mit deinen gespeicherten Daten, bitte wende dich an den")%><a href="mailto:<%= em->getAdminReceiver()%>?subject=Corrupt User Data&amp;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"><%=gettext("Support") %></a></p>
<% } %>
@ -230,6 +338,7 @@ enum PageState {
</div>
</div>
<form>
<input type="hidden" name="pending-task-id" value="<%= transaction->getModel()->getID() %>">
<% if(!account_user->hasPassword()) {%>
<div class="form-group">
<label for="sign-password"><%= gettext("Ich brauche nochmal dein Passwort") %></label>