get pending task, add to group, create and transfer transaction together with community server working

This commit is contained in:
Dario 2020-11-02 16:53:20 +01:00 committed by Ulf Gebhardt
parent 31add877cf
commit c4b591d0d8
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
20 changed files with 603 additions and 186 deletions

View File

@ -53,6 +53,8 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
std::string memo = "";
bool hasErrors = false;
bool enableLogout = true;
int skip_count = 0;
int pending_task_id = 0;
PageState state = PAGE_NO_TRANSACTIONS;
@ -64,10 +66,12 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
bool transaction_finalize_run = false;
bool transaction_finalize_result = false;
auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
//Poco::AutoPtr<controller::PendingTask> pending_task;
model::gradido::Transaction* transaction = nullptr;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
if(transactions_to_sign.size() > 0)
if(!form.empty())
{
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[0].get());
transaction_body = transaction->getTransactionBody();
@ -147,18 +151,28 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
}
}
if(abort != "")
/*
auto ok = form.get("ok", "");
auto abort = form.get("abort", "");
auto skip = form.get("skip", "");
auto skip_count_str = form.get("skip-count", "0");
auto pending_task_id_string = form.get("pending-task-id", "");
DataTypeConverter::strToInt(skip_count_str, skip_count);
if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id))
{
// load transaction from pending task manager
pending_task = pt->getPendingTask(pending_task_id);
if(!pending_task.isNull() && pending_task->getModel()->isGradidoTransaction())
*/
{
// make sure we have the correct transaction
transaction = 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 = dynamic_cast<model::gradido::Transaction*>(it->get());
transaction_body = transaction->getTransactionBody();
break;
}
transaction = dynamic_cast<model::gradido::Transaction*>(pending_task.get());
if(transaction->hasSigned(account_user)) {
transaction = nullptr;
} else {
transaction_body = transaction->getTransactionBody();
}
if(abort != "")
{
//mSession->finalizeTransaction(false, true);
@ -166,8 +180,6 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
if(transaction && transaction->getModel()->getUserId() == user_model->getID())
{
transaction->deleteFromDB();
transaction_body.assign(nullptr);
transactions_to_sign.clear();
transaction = nullptr;
}
}
@ -195,29 +207,55 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
}
if(!hasErrors) {
//mSession->finalizeTransaction(true, false);
if(transaction->sign(account_user)) {
transaction_body.assign(nullptr);
transactions_to_sign.clear();
if(transaction && transaction->sign(account_user)) {
transaction = nullptr;
}
}
}
else if(skip != "")
{
skip_count++;
transaction = nullptr;
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
addError(new Error(gettext("Input Error"), gettext("Task no found")));
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
}
}
auto transactions_user_must_sign = pt->getTransactionsUserMustSign(account_user);
std::vector<Poco::AutoPtr<controller::PendingTask>> transactions_someone_must_sign;
// TODO: work with community server roles
if(user_model->getRole() == model::table::ROLE_ADMIN) {
transactions_someone_must_sign = pt->getTransactionSomeoneMustSign(account_user);
}
std::vector<Poco::AutoPtr<controller::PendingTask>> transactions_to_sign;
bool transaction_removeable = false;
int transaction_to_sign_index = 0;
if(!transaction)
{
transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
if(transactions_to_sign.size() > 0)
if(transactions_user_must_sign.size() > skip_count) {
transactions_to_sign = transactions_user_must_sign;
transaction_to_sign_index = skip_count;
} else if(transactions_someone_must_sign.size() > (skip_count - transactions_user_must_sign.size())) {
transactions_to_sign = transactions_someone_must_sign;
transaction_to_sign_index = skip_count - transactions_user_must_sign.size();
}
if(transactions_to_sign.size() > transaction_to_sign_index)
{
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[0].get());
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[transaction_to_sign_index].get());
transaction_body = transaction->getTransactionBody();
// user can only delete there own transactions
// TODO: Auto timeout for community transactions
if(transaction->getModel()->getUserId() == user_model->getID()) {
transaction_removeable = true;
}
}
}
size_t sumTransactions = transactions_to_sign.size();
size_t sumTransactions = transactions_user_must_sign.size() + transactions_someone_must_sign.size();
if(sumTransactions == 0)
{
auto lastExternReferer = mSession->getLastReferer();
@ -234,14 +272,14 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
return;
}
if(sumTransactions > 0)
if(transactions_user_must_sign.size() > 0)
{
enableLogout = false;
}
if(PAGE_NO_TRANSACTIONS == state && sumTransactions > 0)
if(PAGE_NO_TRANSACTIONS == state && transaction && !transaction_body.isNull())
{
auto transactionType = transaction_body->getType();
auto memo = transaction_body->getMemo();
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;
@ -456,120 +494,120 @@ 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 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 205 "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 180 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 207 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(state == PAGE_TRANSACTION_TRANSFER) {
auto transferTransaction = transaction_body->getTransferTransaction();
responseStream << "\n";
responseStream << "\t\t\t<p>";
#line 183 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 210 "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 186 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 213 "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 187 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 214 "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 189 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 216 "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 190 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 217 "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 192 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 219 "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 194 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 221 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 222 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( transferTransaction->getKontoNameCell(i) );
responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 223 "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 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 225 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t ";
#line 200 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 227 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else if(PAGE_TRANSACTION_CREATION == state) {
auto creationTransaction = transaction_body->getCreationTransaction();
auto transactionUser = creationTransaction->getUser();
responseStream << "\n";
responseStream << "\t\t\t\t<p>";
#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 231 "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 207 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 234 "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 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 235 "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 209 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 236 "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 212 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 239 "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 215 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getFirstName() );
responseStream << " ";
#line 215 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getLastName() );
responseStream << " &lt;";
#line 215 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getEmail() );
responseStream << "&gt;</span>\n";
responseStream << "\t\t\t\t\t";
#line 216 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 243 "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 217 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 244 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( creationTransaction->getPublicHex() );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t";
#line 218 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 245 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 219 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 246 "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 220 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 247 "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 223 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 250 "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());
@ -584,160 +622,186 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
}
responseStream << "\n";
responseStream << "\t\t\t <p>";
#line 236 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 263 "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 238 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 265 "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 239 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 266 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user->getEmailWithNames() );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 240 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 267 "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 241 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 268 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( groupMemberUpdateTransaction->getPublicKeyHex() );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 242 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 269 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "</p>\n";
responseStream << "\t\t\t\t";
#line 243 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 270 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(!group_model.isNull()) { responseStream << "\n";
responseStream << "\t\t\t\t\t<p><b>";
#line 244 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 271 "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 246 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 273 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Name") );
responseStream << ": ";
#line 246 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 273 "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 247 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 274 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Alias") );
responseStream << ": ";
#line 247 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 274 "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 248 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 275 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Url") );
responseStream << ": <a href=\"";
#line 248 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 275 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( group_model->getUrl() );
responseStream << "/pages/visitor\" target=\"_blank\">";
#line 248 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 275 "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 249 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 276 "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 251 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 278 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t";
#line 252 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 279 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Unbekannte Gruppe") );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 253 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 280 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t";
#line 254 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 281 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Es haben bereits ") );
#line 254 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 281 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( std::to_string(transaction->getSignCount()) );
#line 254 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 281 "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 257 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 284 "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 258 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 285 "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 258 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 285 "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 258 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 285 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << (gettext("Support") );
responseStream << "</a></p>\n";
responseStream << "\t\t\t ";
#line 259 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 286 "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";
responseStream << "\t\t\t\t<span class=\"content-cell\">Aktives Konto</span>\n";
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 265 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t ";
#line 287 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(PAGE_NO_TRANSACTIONS == state) { responseStream << "\n";
responseStream << "\t\t\t\t<a href=\"";
#line 288 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\">";
#line 288 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Zur&uuml;ck") );
responseStream << "</a>\n";
responseStream << "\t\t\t ";
#line 289 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\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\">Aktives Konto</span>\n";
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t <div class=\"content-row\">\n";
responseStream << "\t\t\t\t\t<span class=\"content-cell\">";
#line 295 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( user_model->getNameWithEmailHtml() );
responseStream << "</span>\n";
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t</div>\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\">Verwendungszweck</span>\n";
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 273 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t</div>\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\">Verwendungszweck</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<span class=\"content-cell\">";
#line 303 "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 277 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t </div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t\t\t<form>\n";
responseStream << "\t\t\t\t\t";
#line 307 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(transaction) { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<input type=\"hidden\" name=\"pending-task-id\" value=\"";
#line 308 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( transaction->getModel()->getID() );
responseStream << "\">\n";
responseStream << "\t\t\t\t";
#line 278 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t";
#line 309 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t<input type=\"hidden\" name=\"skip-count\" value=\"";
#line 310 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( skip_count );
responseStream << "\">\n";
responseStream << "\t\t\t\t\t";
#line 311 "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 280 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t <div class=\"form-group\">\n";
responseStream << "\t\t\t\t\t\t <label for=\"sign-password\">";
#line 313 "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 281 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t\t <input type=\"password\" class=\"form-control\" id=\"sign-password\" name=\"sign-password\" placeholder=\"";
#line 314 "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 283 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t </div>\n";
responseStream << "\t\t\t\t\t";
#line 316 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t";
#line 284 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t";
#line 317 "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 287 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << "\t\t\t\t\t\t<button type=\"submit\" class=\"form-button\" name=\"ok\" value=\"ok\">\n";
responseStream << "\t\t\t\t\t\t\t<i class=\"material-icons-outlined\">verified_user</i>\n";
responseStream << "\t\t\t\t\t\t\t";
#line 320 "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 289 "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\t</button>\n";
responseStream << "\t\t\t\t\t";
#line 292 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
#line 322 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t";
#line 323 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
if(transaction_removeable) { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<button type=\"submit\" class=\"form-button button-cancel\" name=\"abort\" value=\"abort\">\n";
responseStream << "\t\t\t\t\t\t\t<i class=\"material-icons-outlined\">delete</i>\n";
responseStream << "\t\t\t\t\t\t\t";
#line 326 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Transaktion verwerfen") );
responseStream << "\n";
responseStream << "\t\t\t\t</button>\n";
@ -750,8 +814,26 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "\t\t\t\t\t</button>\t\n";
responseStream << "\t\t\t\t";
#line 245 "F:\\Gradido\\gradido_login_server_production\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\n";
responseStream << "\t\t\t</form>\n";
responseStream << "\t\t\t\t\t\t</button>\n";
responseStream << "\t\t\t\t\t";
#line 328 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t\t<button type=\"submit\" class=\"form-button button-cancel\" name=\"skip\" value=\"skip\">\n";
responseStream << "\t\t\t\t\t\t\t<i class=\"material-icons-outlined\">debug-step-over</i>\n";
responseStream << "\t\t\t\t\t\t\t";
#line 331 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
responseStream << ( gettext("Transaktion &uuml;berspringen") );
responseStream << "\n";
responseStream << "\t\t\t\t\t\t</button>\n";
responseStream << "\t\t\t\t\t";
#line 333 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t</form>\n";
responseStream << "\t\t\t";
#line 335 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t</div>\n";
responseStream << "\t</div>\n";
responseStream << "</div>\n";

View File

@ -6,6 +6,8 @@
#include "../model/gradido/Transaction.h"
#include "../SingletonManager/ErrorManager.h"
Poco::JSON::Object* JsonCreateTransaction::handle(Poco::Dynamic::Var params)
{
auto sm = SessionManager::getInstance();
@ -40,12 +42,16 @@ Poco::JSON::Object* JsonCreateTransaction::handle(Poco::Dynamic::Var params)
mSession = sm->getSession(session_id);
if (!mSession) {
return customStateError("not found", "session not found");
return stateError("session not found");
}
auto user = mSession->getNewUser();
if (user.isNull()) {
auto em = ErrorManager::getInstance();
em->addError(new Error(__FUNCDNAME__, "session hasn't a user, check code"));
em->sendErrorsAsEmail();
return customStateError("code error", "user is zero");
}
getTargetGroup(params);
if (transaction_type == "transfer") {
return transfer(params);
@ -64,43 +70,114 @@ Poco::JSON::Object* JsonCreateTransaction::handle(Poco::Dynamic::Var params)
Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params)
{
auto target_pubkey = getTargetPubkey(params);
if (!target_pubkey) {
return customStateError("not found", "receiver not found");
}
auto user = mSession->getNewUser();
Poco::UInt32 amount = 0;
auto mm = MemoryManager::getInstance();
Poco::JSON::Object* result = nullptr;
if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
try {
paramJsonObject->get("amount").convert(amount);
}
catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText());
result = stateError("json exception", ex.displayText());
}
}
else {
return stateError("parameter format unknown");
result = stateError("parameter format unknown");
}
model::gradido::Transaction::createTransfer(mSession->getNewUser(), target_pubkey, mTargetGroup, amount, mMemo);
return stateSuccess();
if (result) {
mm->releaseMemory(target_pubkey);
return result;
}
if (!mReceiverUser.isNull() && mReceiverUser->getModel()) {
auto receiver_user_model = mReceiverUser->getModel();
if (receiver_user_model->isDisabled()) {
result = customStateError("disabled", "receiver is disabled");
}
if (!mTargetGroup.isNull() && receiver_user_model->getGroupId() != mTargetGroup->getModel()->getID()) {
result = stateError("user not in group", "receiver user isn't in target group");
}
}
if (!result) {
model::gradido::Transaction::createTransfer(mSession->getNewUser(), target_pubkey, mTargetGroup, amount, mMemo);
result = stateSuccess();
}
mm->releaseMemory(target_pubkey);
return result;
}
Poco::JSON::Object* JsonCreateTransaction::creation(Poco::Dynamic::Var params)
{
auto target_pubkey = getTargetPubkey(params);
if (!target_pubkey) {
return customStateError("not found", "receiver not found");
}
Poco::UInt32 amount = 0;
Poco::DateTime target_date;
if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
auto mm = MemoryManager::getInstance();
Poco::JSON::Object* result = nullptr;
if (params.type() == typeid(Poco::JSON::Object::Ptr))
{
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
try {
paramJsonObject->get("amount").convert(amount);
paramJsonObject->get("target_date").convert(target_date);
}
catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText());
result = stateError("json exception", ex.displayText());
}
}
else {
return stateError("parameter format unknown");
else
{
result = stateError("parameter format unknown");
}
model::gradido::Transaction::createCreation(mSession->getNewUser(), amount, target_date, mMemo);
return stateSuccess();
if (amount <= 0 || amount > 10000000) {
result = customStateError("invalid parameter", "invalid amount", "GDD amount in GDD cent ]0,10000000]");
}
if (mReceiverUser.isNull()) {
mReceiverUser = controller::User::create();
if (1 != mReceiverUser->load(*target_pubkey)) {
mReceiverUser.assign(nullptr);
result = customStateError("not found", "receiver not found");
}
}
if (result) {
mm->releaseMemory(target_pubkey);
return result;
}
if (!mReceiverUser.isNull() && mReceiverUser->getModel()) {
auto receiver_user_model = mReceiverUser->getModel();
if (receiver_user_model->isDisabled()) {
result = customStateError("disabled", "receiver is disabled");
}
if (!receiver_user_model->getGroupId()) {
result = stateError("receiver user hasn't group");
}
if (receiver_user_model->getGroupId() != mSession->getNewUser()->getModel()->getGroupId()) {
result = stateError("user not in group", "target user is in another group");
}
}
if(!result) {
model::gradido::Transaction::createCreation(mReceiverUser, amount, target_date, mMemo);
result = stateSuccess();
}
mm->releaseMemory(target_pubkey);
return result;
}
Poco::JSON::Object* JsonCreateTransaction::groupMemberUpdate(Poco::Dynamic::Var params)
@ -139,12 +216,12 @@ MemoryBin* JsonCreateTransaction::getTargetPubkey(Poco::Dynamic::Var params)
catch (Poco::Exception& ex) {
return nullptr;
}
auto user = controller::User::create();
mReceiverUser = controller::User::create();
int result_count = 0;
MemoryBin* result = nullptr;
if (email != "") {
result_count = user->load(email);
result_count = mReceiverUser->load(email);
}
else if (target_username != "") {
int group_id = 0;
@ -153,13 +230,16 @@ MemoryBin* JsonCreateTransaction::getTargetPubkey(Poco::Dynamic::Var params)
} else {
mSession->getNewUser()->getModel()->getGroupId();
}
result_count = user->getModel()->loadFromDB({ "username", "group_id" }, target_username, group_id, model::table::MYSQL_CONDITION_AND);
result_count = mReceiverUser->getModel()->loadFromDB({ "username", "group_id" }, target_username, group_id, model::table::MYSQL_CONDITION_AND);
}
else if (target_pubkey_hex != "") {
result = DataTypeConverter::hexToBin(target_pubkey_hex);
}
if (1 == result_count) {
result = user->getModel()->getPublicKeyCopy();
result = mReceiverUser->getModel()->getPublicKeyCopy();
}
else {
mReceiverUser.assign(nullptr);
}
return result;
}

View File

@ -21,6 +21,7 @@ protected:
Session* mSession;
std::string mMemo;
Poco::AutoPtr<controller::Group> mTargetGroup;
Poco::AutoPtr<controller::User> mReceiverUser;
};
#endif // __JSON_INTERFACE_JSON_CREATE_TRANSACTION_

View File

@ -4,6 +4,7 @@
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/ErrorManager.h"
#include "../SingletonManager/PendingTasksManager.h"
#include "../lib/DataTypeConverter.h"
@ -12,6 +13,7 @@ Poco::JSON::Object* JsonGetLogin::handle(Poco::Dynamic::Var params)
int session_id = 0;
auto sm = SessionManager::getInstance();
auto pt = PendingTasksManager::getInstance();
auto observer = SingletonTaskObserver::getInstance();
if (params.isStruct()) {
@ -71,7 +73,15 @@ Poco::JSON::Object* JsonGetLogin::handle(Poco::Dynamic::Var params)
em->addError(new Error("JsonGetLogin::handle", "generic exception calling userModel->getJson: "));
em->sendErrorsAsEmail();
}
result->set("Transaction.pending", session->getProcessingTransactionCount());
int pending = 0;
auto user_must_sign = pt->getTransactionsUserMustSign(userNew);
pending = user_must_sign.size();
result->set("Transaction.pending", pending);
auto some_must_sign = pt->getTransactionSomeoneMustSign(userNew);
//pending = some_must_sign.size();
result->set("Transaction.can_signed", some_must_sign.size());
auto executing = observer->getTaskCount(userModel->getEmail(), TASK_OBSERVER_SIGN_TRANSACTION);
if (executing < 0) {
executing = 0;

View File

@ -0,0 +1,68 @@
#include "JsonNetworkInfos.h"
#include "../controller/Group.h"
Poco::JSON::Object* JsonNetworkInfos::handle(Poco::Dynamic::Var params)
{
/*
'ask' => ['groups']
*/
// incoming
Poco::JSON::Array::Ptr askArray;
// if is json object
if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
/// Throws a RangeException if the value does not fit
/// into the result variable.
/// Throws a NotImplementedException if conversion is
/// not available for the given type.
/// Throws InvalidAccessException if Var is empty.
try {
askArray = paramJsonObject->getArray("ask");
}
catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText());
}
}
else {
return stateError("parameter format unknown");
}
if (askArray.isNull()) {
return stateError("ask is zero or not an array");
}
Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", "success");
Poco::JSON::Array jsonErrorsArray;
Poco::JSON::Object json_network_infos;
for (auto it = askArray->begin(); it != askArray->end(); it++) {
auto parameter = *it;
std::string parameterString;
try {
parameter.convert(parameterString);
if (parameterString == "groups") {
auto groups = controller::Group::listAll();
Poco::JSON::Array json_groups;
for (auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel();
json_groups.add(group_model->getAlias());
}
json_network_infos.set("groups", json_groups);
}
}
catch (Poco::Exception& ex) {
jsonErrorsArray.add("ask parameter invalid");
}
}
result->set("errors", jsonErrorsArray);
result->set("data", json_network_infos);
return result;
}

View File

@ -0,0 +1,16 @@
#ifndef __JSON_INTERFACE_JSON_NETWORK_INFOS_
#define __JSON_INTERFACE_JSON_NETWORK_INFOS_
#include "JsonRequestHandler.h"
class JsonNetworkInfos : public JsonRequestHandler
{
public:
Poco::JSON::Object* handle(Poco::Dynamic::Var params);
protected:
};
#endif // __JSON_INTERFACE_JSON_GET_USERS_

View File

@ -12,6 +12,7 @@
#include "JsonTransaction.h"
#include "JsonGetRunningUserTasks.h"
#include "JsonGetUsers.h"
#include "JsonNetworkInfos.h"
#include "JsonGetUserInfos.h"
#include "JsonUpdateUserInfos.h"
#include "JsonUnsecureLogin.h"
@ -57,6 +58,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c
else if (url_first_part == "/getUsers") {
return new JsonGetUsers;
}
else if (url_first_part == "/networkInfos") {
return new JsonNetworkInfos;
}
else if (url_first_part == "/createUser") {
return new JsonCreateUser(client_host);
}

View File

@ -147,6 +147,42 @@ std::vector<Poco::AutoPtr<controller::PendingTask>> PendingTasksManager::getTra
return transactions_to_sign;
}
std::vector<Poco::AutoPtr<controller::PendingTask>> PendingTasksManager::getTransactionSomeoneMustSign(Poco::AutoPtr<controller::User> user)
{
// TODO: don't use cast here, because can lead to errors
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
std::vector<Poco::AutoPtr<controller::PendingTask>> 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 = dynamic_cast<model::gradido::Transaction*>(list_it->get());
if (transaction->needSomeoneToSign(user)) {
transactions_to_sign.push_back(*list_it);
}
}
}
return transactions_to_sign;
}
Poco::AutoPtr<controller::PendingTask> PendingTasksManager::getPendingTask(int pendingTaskId)
{
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
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++)
{
if ((*list_it)->getModel()->getID() == pendingTaskId) {
return *list_it;
}
}
}
return nullptr;
}
void PendingTasksManager::reportErrorToCommunityServer(Poco::AutoPtr<controller::PendingTask> task, std::string error, std::string errorDetails)
{
// TODO: choose user specific server
@ -159,6 +195,7 @@ void PendingTasksManager::reportErrorToCommunityServer(Poco::AutoPtr<controller:
payload.set("created", task_model->getCreated());
payload.set("id", task_model->getID());
payload.set("type", task_model->getTaskTypeString());
payload.set("public_key", user_model->getPublicKeyHex());
payload.set("error", error);
payload.set("errorMessage", errorDetails);

View File

@ -40,7 +40,9 @@ 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);
Poco::AutoPtr<controller::PendingTask> getPendingTask(int pendingTaskId);
std::vector<Poco::AutoPtr<controller::PendingTask>> getTransactionsUserMustSign(Poco::AutoPtr<controller::User> user);
std::vector<Poco::AutoPtr<controller::PendingTask>> getTransactionSomeoneMustSign(Poco::AutoPtr<controller::User> user);
void reportErrorToCommunityServer(Poco::AutoPtr<controller::PendingTask> task, std::string error, std::string errorDetails);

View File

@ -363,7 +363,7 @@ Session* SessionManager::getSession(int handle)
//mWorkingMutex.lock();
auto it = mRequestSessionMap.find(handle);
if (it != mRequestSessionMap.end()) {
printf("[SessionManager::getSession] found existing session, try if active...\n");
//printf("[SessionManager::getSession] found existing session, try if active...\n");
result = it->second;
int iResult = result->isActive();
if (iResult == -1) {

View File

@ -98,7 +98,7 @@ namespace model {
return result;
}
std::vector<Poco::AutoPtr<Transaction>> Transaction::createTransfer(Poco::AutoPtr<controller::User> sender, MemoryBin* receiverPubkey, Poco::AutoPtr<controller::Group> receiverGroup, Poco::UInt32 amount, const std::string& memo)
std::vector<Poco::AutoPtr<Transaction>> Transaction::createTransfer(Poco::AutoPtr<controller::User> sender, const MemoryBin* receiverPubkey, Poco::AutoPtr<controller::Group> receiverGroup, Poco::UInt32 amount, const std::string& memo)
{
std::vector<Poco::AutoPtr<Transaction>> results;
auto em = ErrorManager::getInstance();
@ -385,6 +385,21 @@ namespace model {
return !transaction_base->isPublicKeyForbidden(user->getModel()->getPublicKey());
}
bool Transaction::needSomeoneToSign(Poco::AutoPtr<controller::User> user)
{
if (!canSign(user)) return false;
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto transaction_base = mTransactionBody->getTransactionBase();
if (transaction_base->isPublicKeyRequired(user->getModel()->getPublicKey())) {
return false;
}
if (transaction_base->getMinSignatureCount() > getSignCount()) {
return true;
}
return false;
}
int Transaction::runSendTransaction()
{
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);

View File

@ -30,7 +30,7 @@ namespace model {
static Poco::AutoPtr<Transaction> createGroupMemberUpdate(Poco::AutoPtr<controller::User> user, Poco::AutoPtr<controller::Group> group);
//! \brief transfer
//! \return for cross group transaction return two transactions
static std::vector<Poco::AutoPtr<Transaction>> createTransfer(Poco::AutoPtr<controller::User> sender, MemoryBin* receiverPubkey, Poco::AutoPtr<controller::Group> receiverGroup, Poco::UInt32 amount, const std::string& memo);
static std::vector<Poco::AutoPtr<Transaction>> createTransfer(Poco::AutoPtr<controller::User> sender, const MemoryBin* receiverPubkey, Poco::AutoPtr<controller::Group> receiverGroup, Poco::UInt32 amount, const std::string& memo);
//! \brief creation transaction
static Poco::AutoPtr<Transaction> createCreation(Poco::AutoPtr<controller::User> receiver, Poco::UInt32 amount, Poco::DateTime targetDate, const std::string& memo);
static Poco::AutoPtr<Transaction> load(model::table::PendingTask* dbModel);
@ -48,13 +48,15 @@ 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
//! \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
//! \return true if user has already signed transaction
bool hasSigned(Poco::AutoPtr<controller::User> user);
//! \return true if at least one sign is missing and user isn't forbidden and isn't required
bool needSomeoneToSign(Poco::AutoPtr<controller::User> user);
protected:
Poco::AutoPtr<TransactionBody> mTransactionBody;

View File

@ -36,7 +36,7 @@ namespace model {
return obj;
}
Poco::AutoPtr<TransactionBody> TransactionBody::create(const std::string& memo, Poco::AutoPtr<controller::User> sender, MemoryBin* receiverPublicKey, Poco::UInt32 amount, Poco::Timestamp pairedTransactionId, Poco::AutoPtr<controller::Group> group/* = nullptr*/)
Poco::AutoPtr<TransactionBody> TransactionBody::create(const std::string& memo, Poco::AutoPtr<controller::User> sender, const MemoryBin* receiverPublicKey, Poco::UInt32 amount, Poco::Timestamp pairedTransactionId, Poco::AutoPtr<controller::Group> group/* = nullptr*/)
{
if (sender.isNull() || !sender->getModel()) {
return nullptr;
@ -75,7 +75,7 @@ namespace model {
}
transfer_amount->set_amount(amount);
transfer_amount->set_pubkey(sender_model->getPublicKey(), sender_model->getPublicKeySize());
*receiver = std::string((const char*)*receiverPublicKey, receiverPublicKey->size());
*receiver = std::string((const char*)receiverPublicKey->data(), receiverPublicKey->size());
obj->mType = TRANSACTION_TRANSFER;
obj->mTransactionSpecific = new TransactionTransfer(memo, obj->mTransactionBody.transfer());

View File

@ -33,7 +33,7 @@ namespace model {
//! \brief GradidoTransfer Transaction
//! \param group if group.isNull() it is a local transfer, else cross group transfer,
//! \param group if group is same as sender group outbound, else inbound
static Poco::AutoPtr<TransactionBody> create(const std::string& memo, Poco::AutoPtr<controller::User> sender, MemoryBin* receiverPublicKey, Poco::UInt32 amount, Poco::Timestamp pairedTransactionId = Poco::Timestamp(), Poco::AutoPtr<controller::Group> group = nullptr);
static Poco::AutoPtr<TransactionBody> create(const std::string& memo, Poco::AutoPtr<controller::User> sender, const MemoryBin* receiverPublicKey, Poco::UInt32 amount, Poco::Timestamp pairedTransactionId = Poco::Timestamp(), Poco::AutoPtr<controller::Group> group = nullptr);
//! \brief GradidoCreation Transaction
static Poco::AutoPtr<TransactionBody> create(const std::string& memo, Poco::AutoPtr<controller::User> receiver, Poco::UInt32 amount, Poco::DateTime targetDate);

View File

@ -84,19 +84,19 @@ namespace model {
if (!sender_user->load((const unsigned char*)sender_pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, -amount, true));
}
else {
mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), -amount, true));
}
if (!receiver_user->load((const unsigned char*)receiver_pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, true));
}
else {
mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), amount, true));
}
if (!receiver_user->load((const unsigned char*)receiver_pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, false));
}
else {
mKontoTable.push_back(KontoTableEntry(receiver_user->getModel(), amount, false));
}
mMinSignatureCount = 1;
auto mm = MemoryManager::getInstance();
auto pubkey_copy = mm->getFreeMemory(KeyPairEd25519::getPublicKeySize());

View File

@ -126,7 +126,8 @@ namespace model
{
Poco::Data::Statement select(session);
select << "SELECT id, user_id, hedera_id, request, created, finished, result_json, task_type_id, child_pending_task_id, parent_pending_task_id FROM " << getTableName();
select << "SELECT id, user_id, hedera_id, request, created, finished, result_json, task_type_id, child_pending_task_id, parent_pending_task_id FROM "
<< getTableName() << " order by id";
return select;
}
@ -150,7 +151,7 @@ namespace model
Poco::Data::Statement insert(session);
lock();
insert << "INSERT INTO " << getTableName()
<< " (user_id, hedera_id, request, created, task_type_id, child_pending_task_id, parent_pending_task_id) VALUES(?,?,?,?,?,?)"
<< " (user_id, hedera_id, request, created, task_type_id, child_pending_task_id, parent_pending_task_id) VALUES(?,?,?,?,?,?,?)"
, use(mUserId), use(mHederaId), use(mRequest), use(mCreated), use(mTaskTypeId), use(mChildPendingTaskId), use(mParentPendingTaskId);
unlock();
return insert;

View File

@ -46,6 +46,7 @@ namespace model {
inline std::string getRequestCopy() const { SHARED_LOCK; return std::string((const char*)mRequest.content().data(), mRequest.content().size()); }
inline Poco::DateTime getCreated() const { SHARED_LOCK; return mCreated; }
inline TaskType getTaskType() const { SHARED_LOCK; return (TaskType)mTaskTypeId; }
inline const char* getTaskTypeString() const { SHARED_LOCK; return typeToString((TaskType)mTaskTypeId); }
inline int getChildPendingTaskId() const { SHARED_LOCK; return mChildPendingTaskId; }
inline int getParentPendingTaskId() const { SHARED_LOCK; return mParentPendingTaskId; }

View File

@ -7,6 +7,8 @@
#include "../../SingletonManager/MemoryManager.h"
#include "../../controller/Group.h"
using namespace Poco::Data::Keywords;
namespace model {
@ -427,6 +429,10 @@ namespace model {
addError(new ParamError("User::getJson", "exception by getting role", ex.displayText().data()));
sendErrorsAsEmail();
}
auto group = controller::Group::load(mGroupId);
if (!group.isNull()) {
userObj.set("group_alias", group->getModel()->getAlias());
}
unlock();
return userObj;

View File

@ -35,6 +35,8 @@ enum PageState {
std::string memo = "";
bool hasErrors = false;
bool enableLogout = true;
int skip_count = 0;
int pending_task_id = 0;
PageState state = PAGE_NO_TRANSACTIONS;
@ -46,10 +48,12 @@ enum PageState {
bool transaction_finalize_run = false;
bool transaction_finalize_result = false;
auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
Poco::AutoPtr<controller::PendingTask> pending_task;
model::gradido::Transaction* transaction = nullptr;
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
if(transactions_to_sign.size() > 0)
if(!form.empty())
{
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[0].get());
transaction_body = transaction->getTransactionBody();
@ -129,18 +133,28 @@ enum PageState {
}
}
if(abort != "")
/*
auto ok = form.get("ok", "");
auto abort = form.get("abort", "");
auto skip = form.get("skip", "");
auto skip_count_str = form.get("skip-count", "0");
auto pending_task_id_string = form.get("pending-task-id", "");
DataTypeConverter::strToInt(skip_count_str, skip_count);
if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id))
{
// load transaction from pending task manager
pending_task = pt->getPendingTask(pending_task_id);
if(!pending_task.isNull() && pending_task->getModel()->isGradidoTransaction())
*/
{
// make sure we have the correct transaction
transaction = 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 = dynamic_cast<model::gradido::Transaction*>(it->get());
transaction_body = transaction->getTransactionBody();
break;
}
transaction = dynamic_cast<model::gradido::Transaction*>(pending_task.get());
if(transaction->hasSigned(account_user)) {
transaction = nullptr;
} else {
transaction_body = transaction->getTransactionBody();
}
if(abort != "")
{
//mSession->finalizeTransaction(false, true);
@ -148,8 +162,6 @@ enum PageState {
if(transaction && transaction->getModel()->getUserId() == user_model->getID())
{
transaction->deleteFromDB();
transaction_body.assign(nullptr);
transactions_to_sign.clear();
transaction = nullptr;
}
}
@ -177,29 +189,55 @@ enum PageState {
}
if(!hasErrors) {
//mSession->finalizeTransaction(true, false);
if(transaction->sign(account_user)) {
transaction_body.assign(nullptr);
transactions_to_sign.clear();
if(transaction && transaction->sign(account_user)) {
transaction = nullptr;
}
}
}
else if(skip != "")
{
skip_count++;
transaction = nullptr;
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
addError(new Error(gettext("Input Error"), gettext("Task no found")));
}
} else {
addError(new Error(gettext("Form Error"), gettext("error with field")));
}
}
auto transactions_user_must_sign = pt->getTransactionsUserMustSign(account_user);
std::vector<Poco::AutoPtr<controller::PendingTask>> transactions_someone_must_sign;
// TODO: work with community server roles
if(user_model->getRole() == model::table::ROLE_ADMIN) {
transactions_someone_must_sign = pt->getTransactionSomeoneMustSign(account_user);
}
std::vector<Poco::AutoPtr<controller::PendingTask>> transactions_to_sign;
bool transaction_removeable = false;
int transaction_to_sign_index = 0;
if(!transaction)
{
transactions_to_sign = pt->getTransactionsUserMustSign(account_user);
if(transactions_to_sign.size() > 0)
if(transactions_user_must_sign.size() > skip_count) {
transactions_to_sign = transactions_user_must_sign;
transaction_to_sign_index = skip_count;
} else if(transactions_someone_must_sign.size() > (skip_count - transactions_user_must_sign.size())) {
transactions_to_sign = transactions_someone_must_sign;
transaction_to_sign_index = skip_count - transactions_user_must_sign.size();
}
if(transactions_to_sign.size() > transaction_to_sign_index)
{
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[0].get());
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[transaction_to_sign_index].get());
transaction_body = transaction->getTransactionBody();
// user can only delete there own transactions
// TODO: Auto timeout for community transactions
if(transaction->getModel()->getUserId() == user_model->getID()) {
transaction_removeable = true;
}
}
}
size_t sumTransactions = transactions_to_sign.size();
size_t sumTransactions = transactions_user_must_sign.size() + transactions_someone_must_sign.size();
if(sumTransactions == 0)
{
auto lastExternReferer = mSession->getLastReferer();
@ -216,14 +254,14 @@ enum PageState {
return;
}
if(sumTransactions > 0)
if(transactions_user_must_sign.size() > 0)
{
enableLogout = false;
}
if(PAGE_NO_TRANSACTIONS == state && sumTransactions > 0)
if(PAGE_NO_TRANSACTIONS == state && transaction && !transaction_body.isNull())
{
auto transactionType = transaction_body->getType();
auto memo = transaction_body->getMemo();
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;
@ -249,11 +287,14 @@ enum PageState {
<% } %>
<div class="col-md-10 equel-grid mb-3">
<small class="text-gray d-block mt-3">
<% if(sumTransactions > 0) { %>
<%= sumTransactions %> <%= gettext("Transaktionen warten darauf best&auml;tigt zu werden.") %>
<% } else if(state == PAGE_NO_TRANSACTIONS) { %>
<% if(sumTransactions == 0) { %>
<%= gettext("Es gibt zurzeit keine Transaktionen zum best&auml;tigen") %>
<% } %>
<% } else { %>
<p><%= sumTransactions %> <%= gettext("Transaktionen warten darauf best&auml;tigt zu werden.") %></p>
<% if(skip_count > 0) { %>
<p><%= skip_count %> <%= gettext("Transaktionen &uuml;bersprungen.") %></p>
<% } %>
<% } %>
</small>
</div>
<div class="content-container main-container">
@ -340,6 +381,7 @@ enum PageState {
<% } 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>
<% } %>
<!--
<div class="content-table">
<div class="content-row content-row-header">
<span class="content-cell">Aktives Konto</span>
@ -381,6 +423,56 @@ enum PageState {
</button>
<% } %>
</form>
-->
<% if(PAGE_NO_TRANSACTIONS == state) { %>
<a href="<%= ServerConfig::g_php_serverPath %>"><%= gettext("Zur&uuml;ck") %></a>
<% } else { %>
<div class="content-table">
<div class="content-row content-row-header">
<span class="content-cell">Aktives Konto</span>
</div>
<div class="content-row">
<span class="content-cell"><%= user_model->getNameWithEmailHtml() %></span>
</div>
</div>
<div class="content-table">
<div class="content-row content-row-header">
<span class="content-cell">Verwendungszweck</span>
</div>
<div class="content-row content-row-bg">
<span class="content-cell"><%= memo %></span>
</div>
</div>
<form>
<% if(transaction) { %>
<input type="hidden" name="pending-task-id" value="<%= transaction->getModel()->getID() %>">
<% } %>
<input type="hidden" name="skip-count" value="<%= skip_count %>">
<% if(!account_user->hasPassword()) {%>
<div class="form-group">
<label for="sign-password"><%= gettext("Ich brauche nochmal dein Passwort") %></label>
<input type="password" class="form-control" id="sign-password" name="sign-password" placeholder="<%= gettext("Passwort") %>">
</div>
<% } %>
<% if(PAGE_USER_DATA_CORRUPTED != state && user_model->isEmailChecked()) { %>
<button type="submit" class="form-button" name="ok" value="ok">
<i class="material-icons-outlined">verified_user</i>
<%= gettext("Transaktion unterzeichnen") %>
</button>
<% } %>
<% if(transaction_removeable) { %>
<button type="submit" class="form-button button-cancel" name="abort" value="abort">
<i class="material-icons-outlined">delete</i>
<%= gettext("Transaktion verwerfen") %>
</button>
<% } else { %>
<button type="submit" class="form-button button-cancel" name="skip" value="skip">
<i class="material-icons-outlined">debug-step-over</i>
<%= gettext("Transaktion &uuml;berspringen") %>
</button>
<% } %>
</form>
<% } %>
</div>
</div>
</div>