mirror of
https://github.com/IT4Change/gradido.git
synced 2026-01-20 20:01:31 +00:00
479 lines
18 KiB
Plaintext
479 lines
18 KiB
Plaintext
<%@ page class="CheckTransactionPage" %>
|
|
<%@ page baseClass="SessionHTTPRequestHandler" %>
|
|
<%@ page ctorArg="Session*" %>
|
|
<%@ header include="SessionHTTPRequestHandler.h" %>
|
|
<%@ page form="true" %>
|
|
<%@ page compressed="true" %>
|
|
<%!
|
|
#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
|
|
};
|
|
|
|
%>
|
|
<%%
|
|
const char* pageName = gettext("Überprüfe Transaktion");
|
|
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;
|
|
bool enableLogout = true;
|
|
int skip_count = 0;
|
|
int pending_task_id = 0;
|
|
|
|
PageState state = PAGE_NO_TRANSACTIONS;
|
|
|
|
if(!user_model->isEmailChecked()) {
|
|
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<controller::PendingTask> pending_task;
|
|
model::gradido::Transaction* transaction = nullptr;
|
|
Poco::AutoPtr<model::gradido::TransactionBody> transaction_body;
|
|
|
|
if(!form.empty())
|
|
{
|
|
transaction = dynamic_cast<model::gradido::Transaction*>(transactions_to_sign[0].get());
|
|
transaction_body = transaction->getTransactionBody();
|
|
|
|
if(!form.empty()) {
|
|
auto ok = form.get("ok", "");
|
|
auto abort = form.get("abort", "");
|
|
auto back = form.get("back", "");
|
|
if(abort != "") {
|
|
transaction_finalize_result = mSession->finalizeTransaction(false, true);
|
|
transaction_finalize_run = true;
|
|
} 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) {
|
|
transaction_finalize_result = mSession->finalizeTransaction(true, false);
|
|
transaction_finalize_run = true;
|
|
}
|
|
} else if(back == "back") {
|
|
auto lastExternReferer = mSession->getLastReferer();
|
|
//lastExternReferer = "";
|
|
if(lastExternReferer != "" && lastExternReferer.find("transaction-send-coins") == std::string::npos) {
|
|
//printf("last extern referer: %s\n", lastExternReferer.data());
|
|
response.redirect(lastExternReferer);
|
|
} else {
|
|
response.redirect(ServerConfig::g_php_serverPath + "state-balances/overview");
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
size_t notReadyTransactions = 0;
|
|
size_t sumTransactions = mSession->getProcessingTransactionCount();
|
|
if(sumTransactions == 0 && !transaction_finalize_run) {
|
|
/*auto observer = SingletonTaskObserver::getInstance();
|
|
auto emailHash = DRMakeStringHash(mSession->getUser()->getEmail());
|
|
int breakCount = 0;
|
|
while(observer->getTaskCount(emailHash, TASK_OBSERVER_SIGN_TRANSACTION) > 0) {
|
|
if(breakCount > 100) break;
|
|
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 = nullptr;
|
|
printf("transaction_body isNull: %d\n", transaction_body.isNull());
|
|
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();
|
|
printf("set new transaction and transaction_body\n");
|
|
break;
|
|
}
|
|
}
|
|
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())
|
|
*/
|
|
{
|
|
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);
|
|
//
|
|
if(transaction && transaction->getModel()->getUserId() == user_model->getID())
|
|
{
|
|
transaction->deleteFromDB();
|
|
transaction = 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);
|
|
if(transaction && transaction->sign(account_user)) {
|
|
transaction = nullptr;
|
|
}
|
|
}
|
|
}
|
|
else if(skip != "")
|
|
{
|
|
skip_count++;
|
|
transaction = nullptr;
|
|
}
|
|
} else {
|
|
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)
|
|
{
|
|
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[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_user_must_sign.size() + transactions_someone_must_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;
|
|
}
|
|
|
|
if(transactions_user_must_sign.size() > 0)
|
|
{
|
|
enableLogout = false;
|
|
}
|
|
if(PAGE_NO_TRANSACTIONS == state && transaction && !transaction_body.isNull())
|
|
{
|
|
auto transactionType = transaction_body->getType();
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
%><%@ include file="header_navi_chr.cpsp" %>
|
|
<% if(transaction_finalize_run) { %>
|
|
<div class="col-md-10 equel-grid mb-3">
|
|
<div class="flash-messages" style="background-color: rgba(240,240,240,0.8);" onclick="this.classList.add('hidden')">
|
|
<ul class='grd-no-style'>
|
|
<% if(transaction_finalize_result) { %>
|
|
<li class='grd-success'>Transaktion erfolgreich</li>
|
|
<% } else { %>
|
|
<li class='grd-error'>Transaktion fehlgeschlagen</li>
|
|
<% } %>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
<div class="col-md-10 equel-grid mb-3">
|
|
<small class="text-gray d-block mt-3">
|
|
<% if(sumTransactions == 0) { %>
|
|
<%= gettext("Es gibt zurzeit keine Transaktionen zum bestätigen") %>
|
|
<% } else { %>
|
|
<p><%= sumTransactions %> <%= gettext("Transaktionen warten darauf bestätigt zu werden.") %></p>
|
|
<% if(skip_count > 0) { %>
|
|
<p><%= skip_count %> <%= gettext("Transaktionen übersprungen.") %></p>
|
|
<% } %>
|
|
<% } %>
|
|
</small>
|
|
</div>
|
|
<div class="content-container main-container">
|
|
<div class="action-form">
|
|
<p class="form-header"><%= gettext("Transaktion Unterzeichnen") %></p>
|
|
<div class="form-content">
|
|
<% if(state == PAGE_TRANSACTION_TRANSFER) {
|
|
auto transferTransaction = transaction_body->getTransferTransaction();
|
|
%>
|
|
<p><%= gettext("Überweisung") %></p>
|
|
<div class="content-table">
|
|
<div class="content-row content-row-header">
|
|
<span class="content-cell"><%= gettext("Konto") %></span>
|
|
<span class="content-cell"><%= gettext("Gradido") %></span>
|
|
</div>
|
|
<% for(int i = 0; i < transferTransaction->getKontoTableSize(); i++) { %>
|
|
<% if((i+1) % 2 == 0) { %>
|
|
<div class="content-row content-row">
|
|
<% } else { %>
|
|
<div class="content-row content-row-bg">
|
|
<% } %>
|
|
<%= transferTransaction->getKontoNameCell(i) %>
|
|
<%= transferTransaction->getAmountCell(i) %>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
<% } else if(PAGE_TRANSACTION_CREATION == state) {
|
|
auto creationTransaction = transaction_body->getCreationTransaction();
|
|
auto transactionUser = creationTransaction->getUser();
|
|
%>
|
|
<p><%= gettext("Schöpfung") %></p>
|
|
<div class="content-table">
|
|
<div class="content-row content-row-header">
|
|
<span class="content-cell"><%= gettext("Konto") %></span>
|
|
<span class="content-cell"><%= gettext("Zieldatum") %></span>
|
|
<span class="content-cell"><%= gettext("Gradido") %></span>
|
|
</div>
|
|
<div class="content-row content-row-bg">
|
|
<% if(!transactionUser.isNull()) {
|
|
auto user_model = transactionUser->getModel();
|
|
%>
|
|
<span class="content-cell"><%= user_model->getFirstName() %> <%= user_model->getLastName() %> <<%= user_model->getEmail() %>></span>
|
|
<% } else { %>
|
|
<span class="content-cell">0x<%= creationTransaction->getPublicHex() %></span>
|
|
<% } %>
|
|
<span class="content-cell"><%= creationTransaction->getTargetDateString() %></span>
|
|
<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>
|
|
<% } %>
|
|
<!--
|
|
<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>
|
|
<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>
|
|
<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>
|
|
<% } %>
|
|
<button type="submit" class="form-button button-cancel" name="abort" value="abort">
|
|
<i class="material-icons-outlined">delete</i>
|
|
<%= gettext("Transaktion verwerfen") %>
|
|
</button>
|
|
<% if(sumTransactions == 0) { %>
|
|
<button type="submit" class="form-button button-cancel" name="back" value="back">
|
|
<i class="material-icons-outlined">back</i>
|
|
Zurück
|
|
</button>
|
|
<% } %>
|
|
</form>
|
|
-->
|
|
<% if(PAGE_NO_TRANSACTIONS == state) { %>
|
|
<a href="<%= ServerConfig::g_php_serverPath %>"><%= gettext("Zurü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 überspringen") %>
|
|
</button>
|
|
<% } %>
|
|
</form>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<%@ include file="footer_chr.cpsp" %> |