mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
update CheckTransactionPage to use new PendingTasksManager and add GroupMemberUpdate transaction view
This commit is contained in:
parent
d8035cac3d
commit
b34d547881
@ -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(¬ReadyTransactions);
|
||||
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("Ü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ö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 << " <";
|
||||
#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 << "></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> ";
|
||||
#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> ";
|
||||
#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&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";
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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(); };
|
||||
|
||||
@ -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 != "") {
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -55,6 +55,7 @@ namespace model {
|
||||
memcpy(*pubkey_copy, receiverPublic.data(), KeyPairEd25519::getPublicKeySize());
|
||||
mForbiddenSignPublicKeys.push_back(pubkey_copy);
|
||||
|
||||
mIsPrepared = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -121,6 +121,7 @@ namespace model {
|
||||
}
|
||||
//*/
|
||||
|
||||
mIsPrepared = true;
|
||||
unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -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()));
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -11,6 +11,9 @@ public:
|
||||
GradidoTask(model::table::PendingTask* dbModel);
|
||||
bool isTimeoutTask() { return false; }
|
||||
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
|
||||
@ -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(¬ReadyTransactions);
|
||||
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ätigen") %>
|
||||
<% } else { %>
|
||||
<%= sumTransactions %> <%= gettext("Transaktionen warten darauf bestätigt zu werden.") %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% if(state == PAGE_NO_TRANSACTIONS) { %>
|
||||
<% if(sumTransactions == 0) { %>
|
||||
<%= gettext("Es gibt zurzeit keine Transaktionen zum bestä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ätigt zu werden.") %>
|
||||
<% } else if(state == PAGE_NO_TRANSACTIONS) { %>
|
||||
<%= gettext("Es gibt zurzeit keine Transaktionen zum bestä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("Ü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ö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> <%= user->getEmailWithNames() %>
|
||||
<% } else { %>
|
||||
<b>Account public key:</b> <%= 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&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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user