add page for creating new passphrase and transfer funds

This commit is contained in:
Dario 2020-03-29 19:11:28 +02:00
parent 10149a4a15
commit 9c067ae8d8
10 changed files with 629 additions and 2 deletions

View File

@ -14,6 +14,8 @@ class UserWriteKeysIntoDB;
class UserGenerateKeys;
class DebugPassphrasePage;
class User;
class RepairDefectPassphrase;
// TODO: https://libsodium.gitbook.io/doc/advanced/ed25519-curve25519
class KeyPair
{
@ -21,6 +23,7 @@ class KeyPair
friend UserGenerateKeys;
friend DebugPassphrasePage;
friend User;
friend RepairDefectPassphrase;
public:
KeyPair();
~KeyPair();

View File

@ -24,7 +24,9 @@
#include "AdminCheckUserBackup.h"
#include "TranslatePassphrase.h"
#include "DecodeTransactionPage.h"
#include "RepairDefectPassphrase.h"
#include "../SingletonManager/SessionManager.h"
@ -150,6 +152,11 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c
pageRequestHandler->setProfiler(timeUsed);
return pageRequestHandler;
}
if (url_first_part == "/repairPassphrase") {
auto pageRequestHandler = new RepairDefectPassphrase(s);
pageRequestHandler->setProfiler(timeUsed);
return pageRequestHandler;
}
if (s->getNewUser()->getModel()->getRole() == model::table::ROLE_ADMIN) {
if (url_first_part == "/adminRegister") {
auto pageRequestHandler = new RegisterAdminPage(s);

View File

@ -0,0 +1,357 @@
#include "RepairDefectPassphrase.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/DeflatingStream.h"
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
#include "../SingletonManager/MemoryManager.h"
#include "../SingletonManager/EmailManager.h"
#include "../crypto/KeyPair.h"
#include "../controller/UserBackups.h"
#include "../tasks/SigningTransaction.h"
#include "../ServerConfig.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "Poco/Net/HTTPSClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
enum PageState
{
GENERATE_PASSPHRASE,
SHOW_PASSPHRASE,
CREATE_TRANSACTION,
CHECK_TRANSACTION,
FINISH
};
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
#include "../ServerConfig.h"
RepairDefectPassphrase::RepairDefectPassphrase(Session* arg):
SessionHTTPRequestHandler(arg)
{
}
void RepairDefectPassphrase::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
{
response.setChunkedTransferEncoding(true);
response.setContentType("text/html");
bool _compressResponse(request.hasToken("Accept-Encoding", "gzip"));
if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream());
#line 31 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
auto mm = MemoryManager::getInstance();
auto em = EmailManager::getInstance();
auto user = mSession->getUser();
auto privKey = user->getPrivKey();
auto adminEmail = em->getAdminReceiver();
Mnemonic* wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER];
std::string pageName = "Repariere Defekte Passphrase";
std::string errorString = "";
PageState state = GENERATE_PASSPHRASE;
if(!form.empty())
{
printf("form not empty\n");
auto btn = form.get("generate", "");
auto btn2 = form.get("transfer", "");
printf("btn: %s\n", btn.data());
printf("btn2: %s\n", btn2.data());
if(btn == "Neue Passphrase generieren!")
{
if(!mSession->generatePassphrase())
{
addError(new Error("Passphrase", "Fehler beim generieren der Passphrase, evt. erneut versuchen!"));
}
else
{
auto newPassphrase = mSession->getPassphrase();
if(!User::validatePassphrase(newPassphrase, &wordSource))
{
addError(new Error("Passphrase", "Fehler beim validieren der Passphrase"));
}
else
{
KeyPair keys;
if(!keys.generateFromPassphrase(newPassphrase.data(), wordSource))
{
addError(new Error("Passphrase", "Konnte keine Keys aus der Passphrase generieren"));
}
else
{
auto newPassphraseModel = controller::UserBackups::create(user->getDBId(), newPassphrase);
auto result = newPassphraseModel->getModel()->insertIntoDB(false);
//state = SHOW_PASSPHRASE;
if(result) {
state = SHOW_PASSPHRASE;
} else {
addError(new Error("Speichern", "Fehler beim speichern der neuen Passphrase, evt. erneut versuchen!"));
}//*/
}
}
}
}
else if("" != btn2)
{
KeyPair keys;
auto newPassphrase = mSession->getPassphrase();
if(!User::validatePassphrase(newPassphrase, &wordSource) || !keys.generateFromPassphrase(mSession->getPassphrase().data(), wordSource)) {
addError(new Error("Passphrase", "Ungültige Passphrase, bitte neuladen"));
}
// create payload
Poco::JSON::Object requestJson;
Poco::JSON::Object pubkeys;
pubkeys.set("sender", user->getPublicKeyHex());
pubkeys.set("receiver", keys.getPubkeyHex());
requestJson.set("method", "moveTransaction");
requestJson.set("pubkeys", pubkeys);
requestJson.set("memo", form.get("memo", ""));
requestJson.set("session_id", mSession->getHandle());
printf("[repairDefectPassphrase] prepare request\n");
// send to php server
Poco::Net::HTTPSClientSession httpsClientSession(ServerConfig::g_php_serverHost, 443);
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/JsonRequestHandler");
request.setChunkedTransferEncoding(true);
std::ostream& requestStream = httpsClientSession.sendRequest(request);
requestJson.stringify(requestStream);
Poco::Net::HTTPResponse response;
std::istream& request_stream = httpsClientSession.receiveResponse(response);
std::stringstream responseStringStream;
for (std::string line; std::getline(request_stream, line); ) {
responseStringStream << line << std::endl;
}
// extract parameter from request
Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJson;
printf("[repairDefectPassphrase] parse request result\n");
try {
parsedJson = jsonParser.parse(responseStringStream);
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
auto jsonState = object.get("state");
std::string stateString = jsonState.convert<std::string>();
if (stateString == "error") {
addError(new Error("Transfer", "php server return error"));
if (!object.isNull("msg")) {
addError(new ParamError("php server", "msg:", object.get("msg").convert<std::string>().data()));
}
if (!object.isNull("details")) {
addError(new ParamError("php server", "details:", object.get("details").convert<std::string>().data()));
}
} else if(stateString == "success") {
printf("[repairDefectPassphrase] request success, wait on transaction ready\n");
auto currentActiveTransaction = mSession->getNextReadyTransaction();
while(currentActiveTransaction.isNull()) {
Poco::Thread::sleep(10);
currentActiveTransaction = mSession->getNextReadyTransaction();
}
if(!currentActiveTransaction->isTransfer()) {
addError(new Error("Transaction", "Falsche Transaktion, bitte erst alle anderen Transaktionen abschließen und dann Seite neuladen"));
} else {
auto signing = new SigningTransaction(currentActiveTransaction, user);
printf("[repairDefectPassphrase] before running sign\n");
if(!signing->run()) {
auto newUser = mSession->getNewUser();
auto newUserModel = newUser->getModel();
auto cryptedPrivKey = user->encrypt(keys.getPrivateKey());
newUserModel->setPublicKey(keys.getPublicKey());
newUserModel->setPrivateKey(cryptedPrivKey);
mm->releaseMemory(cryptedPrivKey);
if(!newUserModel->updatePrivkey() || !newUserModel->updatePublickey()) {
printf("[repairDefectPassphrase] error saving keys\n");
addError(new Error("Speichern", "Fehler beim speichern der neuen Keys in die Datenbank, bitte erneut versuchen (Seite neuladen)"));
} else {
//response.redirect(ServerConfig::g_serverPath + "/logout");
//return;
printf("[repairDefectPassphrase] set state to FINISH\n");
state = FINISH;
}
} else {
addError(new Error("Transaction", "Fehler beim signieren, bitter erneut versuchen"));
}
// remove transaction from list
mSession->finalizeTransaction(true, true);
}
}
}
catch (Poco::Exception& ex) {
//printf("[JsonRequestHandler::handleRequest] Exception: %s\n", ex.displayText().data());
addError(new ParamError("Transfer", "Fehler beim erstellen der Transaktion, bitte erneut versuchen", ex.displayText().data()));
errorString = responseStringStream.str();
}
//state = CREATE_TRANSACTION;
}
}
mm->releaseMemory(privKey);
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n";
// begin include header_old.cpsp
responseStream << "\n";
responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
responseStream << "<head>\n";
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<!--<link rel=\"stylesheet\" type=\"text/css\" href=\"css/styles.min.css\">-->\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "/css/styles.css\">\n";
responseStream << "<style type=\"text/css\" >\n";
responseStream << ".grd_container\n";
responseStream << "{\n";
responseStream << " max-width:820px;\n";
responseStream << " margin-left:auto;\n";
responseStream << " margin-right:auto;\n";
responseStream << "}\n";
responseStream << "\n";
responseStream << "input:not([type='radio']) {\n";
responseStream << "\twidth:200px;\n";
responseStream << "}\n";
responseStream << "label:not(.grd_radio_label) {\n";
responseStream << "\twidth:80px;\n";
responseStream << "\tdisplay:inline-block;\n";
responseStream << "}\n";
responseStream << ".grd_container_small\n";
responseStream << "{\n";
responseStream << " max-width:500px;\n";
responseStream << "}\n";
responseStream << ".grd_text {\n";
responseStream << " max-width:550px;\n";
responseStream << " margin-bottom: 5px;\n";
responseStream << "}\n";
responseStream << ".dev-info {\n";
responseStream << "\tposition: fixed;\n";
responseStream << "\tcolor:grey;\n";
responseStream << "\tfont-size: smaller;\n";
responseStream << "\tleft:8px;\n";
responseStream << "}\n";
responseStream << ".grd-time-used { \n";
responseStream << " bottom:0;\n";
responseStream << "} \n";
responseStream << "\n";
responseStream << ".versionstring {\n";
responseStream << "\ttop:0;\n";
responseStream << "}\n";
responseStream << "</style>\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << "<div class=\"versionstring dev-info\">\n";
responseStream << "\t<p class=\"grd_small\">Login Server in Entwicklung</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha ";
#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n";
responseStream << "</div>\n";
// end include header_old.cpsp
responseStream << "\n";
#line 189 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
if("" != errorString) { responseStream << "\n";
responseStream << "\t";
#line 190 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( errorString );
responseStream << "\n";
#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} responseStream << "\n";
responseStream << "<div class=\"grd_container\">\n";
responseStream << "\t";
#line 193 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "\t<h1>Konto reparieren</h1>\n";
responseStream << "\t<p>Der Login-Server hat festgestellt das die gespeicherte Passphrase nicht zu deinem Konto passt.</p>\n";
responseStream << "\t";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
if(GENERATE_PASSPHRASE == state) { responseStream << "\n";
responseStream << "\t\t";
#line 197 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
if(privKey) { responseStream << "\n";
responseStream << "\t\t\t<p>Dein Privat Key konnte noch entschlüsselt werden. Es könnte also eine neue Passphrase generiert werden und dein aktueller Kontostand\n";
responseStream << "\t\t\tauf die neue Adresse transferiert werden. </p>\n";
responseStream << "\t\t\t<form method=\"POST\">\n";
responseStream << "\t\t\t\t<input type=\"submit\" style=\"width:auto;\" name=\"generate\" value=\"Neue Passphrase generieren!\">\n";
responseStream << "\t\t\t</form>\n";
responseStream << "\t\t";
#line 203 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t<p>Dein Privat Key konnte nicht entschlüsselt werden. Bitte wende dich an den Admin: <a href=\"mailto:";
#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( adminEmail);
responseStream << "\">";
#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( adminEmail );
responseStream << "</a></p>\n";
responseStream << "\t\t";
#line 205 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} responseStream << "\n";
responseStream << "\t";
#line 206 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} else if(SHOW_PASSPHRASE == state) { responseStream << "\n";
responseStream << "\t\t<p>Deine neue Passphrase, bitte schreibe sie dir auf (am besten auf einen Zettel) und hebe sie gut auf. \n";
responseStream << "\t\tDu brauchst sie wenn du dein Passwort vergessen hast oder dein Konto umziehen möchtest:</p>\n";
responseStream << "\t\t<fieldset><legend>Deine neue Passphrase:</legend>\n";
responseStream << "\t\t\t<div class=\"grd_container_small grd_container\">\n";
responseStream << "\t\t\t\t";
#line 211 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( mSession->getPassphrase() );
responseStream << "\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</fieldset>\n";
responseStream << "\t\t<form method=\"POST\">\n";
responseStream << "\t\t\t<p><label style=\"width:auto\" for=\"memo-text\">Verwendungszweck für Überweisung:</label></p>\n";
responseStream << "\t\t\t<p><textarea name=\"memo\" id=\"memo-text\" rows=\"4\"></textarea></p>\n";
responseStream << "\t\t\t<p><input type=\"submit\" style=\"width:auto\" name=\"transfer\" value=\"Guthaben auf neue Adresse &uuml;berweisen!\"></p>\n";
responseStream << "\t\t</form>\n";
responseStream << "\t";
#line 219 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} else if(FINISH == state) { responseStream << "\n";
responseStream << "\t\t<p>Neue Daten erfolgreich gespeichert, bitte logge dich nun aus. Danach kannst du dich gerne wieder einloggen und müsstest dein Guthaben wieder auf deinem Konto haben.</p>\n";
responseStream << "\t\t<a class=\"grd-nav-bn\" href=\"";
#line 221 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
responseStream << ( ServerConfig::g_serverPath + "/logout" );
responseStream << "\">Ausloggen</a>\n";
responseStream << "\t";
#line 222 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp"
} responseStream << "\n";
responseStream << "</div>\n";
// begin include footer.cpsp
responseStream << "\t<div class=\"grd-time-used dev-info\">\n";
responseStream << "\t\t\t";
#line 2 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( mTimeProfiler.string() );
responseStream << "\n";
responseStream << "\t</div>\n";
responseStream << "</body>\n";
responseStream << "</html>";
// end include footer.cpsp
if (_compressResponse) _gzipStream.close();
}

View File

@ -0,0 +1,20 @@
#ifndef RepairDefectPassphrase_INCLUDED
#define RepairDefectPassphrase_INCLUDED
#include "Poco/Net/HTTPRequestHandler.h"
#include "SessionHTTPRequestHandler.h"
class RepairDefectPassphrase: public SessionHTTPRequestHandler
{
public:
RepairDefectPassphrase(Session*);
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
};
#endif // RepairDefectPassphrase_INCLUDED

View File

@ -52,6 +52,7 @@ enum SessionStates {
class SessionManager;
class UpdateUserPasswordPage;
class PassphrasePage;
class RepairDefectPassphrase;
class Session : public ErrorList, public UniLib::lib::MultithreadContainer
{
@ -59,6 +60,7 @@ class Session : public ErrorList, public UniLib::lib::MultithreadContainer
friend SessionManager;
friend UpdateUserPasswordPage;
friend PassphrasePage;
friend RepairDefectPassphrase;
public:
Session(int handle);
~Session();

View File

@ -24,6 +24,7 @@ class UserWriteCryptoKeyHashIntoDB;
class SigningTransaction;
class UserGenerateKeys;
class DebugPassphrasePage;
class RepairDefectPassphrase;
enum UserStates
{
@ -55,6 +56,7 @@ class User : public ErrorList
friend SigningTransaction;
friend UserGenerateKeys;
friend DebugPassphrasePage;
friend RepairDefectPassphrase;
public:
// new user
User(const char* email, const char* first_name, const char* last_name);
@ -159,6 +161,7 @@ private:
std::string mPublicHex;
unsigned char mPublicKey[crypto_sign_PUBLICKEYBYTES];
//! crypted private key
MemoryBin* mPrivateKey;
// TODO: insert created if necessary

View File

@ -140,13 +140,23 @@ namespace model {
return select;
}
size_t User::updatePrivkey() {
size_t User::updatePrivkey()
{
lock();
if (mPrivateKey.isNull()) return 0;
auto result = updateIntoDB("privkey", mPrivateKey.value());
unlock();
return result;
}
size_t User::updatePublickey()
{
lock();
if (mPublicKey.isNull()) return 0;
auto result = updateIntoDB("pubkey", mPublicKey.value());
unlock();
return result;
}
/*
std::string mEmail;

View File

@ -44,6 +44,7 @@ namespace model {
// specific db operation
size_t updatePrivkey();
size_t updatePublickey();
// default getter unlocked

View File

@ -200,7 +200,7 @@ int SigningTransaction::run() {
return -10;
}
//printf("state: %s\n", stateString.data());
int zahl = 1;
//int zahl = 1;
}
catch (Poco::Exception& e) {
addError(new ParamError("SigningTransaction", "connect error to php server", e.displayText().data()));

View File

@ -0,0 +1,224 @@
<%@ page class="RepairDefectPassphrase" %>
<%@ page form="true" %>
<%@ page compressed="true" %>
<%@ page baseClass="SessionHTTPRequestHandler" %>
<%@ page ctorArg="Session*" %>
<%@ header include="SessionHTTPRequestHandler.h" %>
<%!
#include "../SingletonManager/MemoryManager.h"
#include "../SingletonManager/EmailManager.h"
#include "../crypto/KeyPair.h"
#include "../controller/UserBackups.h"
#include "../tasks/SigningTransaction.h"
#include "../ServerConfig.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "Poco/Net/HTTPSClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
enum PageState
{
GENERATE_PASSPHRASE,
SHOW_PASSPHRASE,
CREATE_TRANSACTION,
CHECK_TRANSACTION,
FINISH
};
%>
<%%
auto mm = MemoryManager::getInstance();
auto em = EmailManager::getInstance();
auto user = mSession->getUser();
auto privKey = user->getPrivKey();
auto adminEmail = em->getAdminReceiver();
Mnemonic* wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER];
std::string pageName = "Repariere Defekte Passphrase";
std::string errorString = "";
PageState state = GENERATE_PASSPHRASE;
if(!form.empty())
{
printf("form not empty\n");
auto btn = form.get("generate", "");
auto btn2 = form.get("transfer", "");
printf("btn: %s\n", btn.data());
printf("btn2: %s\n", btn2.data());
if(btn == "Neue Passphrase generieren!")
{
if(!mSession->generatePassphrase())
{
addError(new Error("Passphrase", "Fehler beim generieren der Passphrase, evt. erneut versuchen!"));
}
else
{
auto newPassphrase = mSession->getPassphrase();
if(!User::validatePassphrase(newPassphrase, &wordSource))
{
addError(new Error("Passphrase", "Fehler beim validieren der Passphrase"));
}
else
{
KeyPair keys;
if(!keys.generateFromPassphrase(newPassphrase.data(), wordSource))
{
addError(new Error("Passphrase", "Konnte keine Keys aus der Passphrase generieren"));
}
else
{
auto newPassphraseModel = controller::UserBackups::create(user->getDBId(), newPassphrase);
auto result = newPassphraseModel->getModel()->insertIntoDB(false);
//state = SHOW_PASSPHRASE;
if(result) {
state = SHOW_PASSPHRASE;
} else {
addError(new Error("Speichern", "Fehler beim speichern der neuen Passphrase, evt. erneut versuchen!"));
}//*/
}
}
}
}
else if("" != btn2)
{
KeyPair keys;
auto newPassphrase = mSession->getPassphrase();
if(!User::validatePassphrase(newPassphrase, &wordSource) || !keys.generateFromPassphrase(mSession->getPassphrase().data(), wordSource)) {
addError(new Error("Passphrase", "Ungültige Passphrase, bitte neuladen"));
}
// create payload
Poco::JSON::Object requestJson;
Poco::JSON::Object pubkeys;
pubkeys.set("sender", user->getPublicKeyHex());
pubkeys.set("receiver", keys.getPubkeyHex());
requestJson.set("method", "moveTransaction");
requestJson.set("pubkeys", pubkeys);
requestJson.set("memo", form.get("memo", ""));
requestJson.set("session_id", mSession->getHandle());
printf("[repairDefectPassphrase] prepare request\n");
// send to php server
Poco::Net::HTTPSClientSession httpsClientSession(ServerConfig::g_php_serverHost, 443);
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/JsonRequestHandler");
request.setChunkedTransferEncoding(true);
std::ostream& requestStream = httpsClientSession.sendRequest(request);
requestJson.stringify(requestStream);
Poco::Net::HTTPResponse response;
std::istream& request_stream = httpsClientSession.receiveResponse(response);
std::stringstream responseStringStream;
for (std::string line; std::getline(request_stream, line); ) {
responseStringStream << line << std::endl;
}
// extract parameter from request
Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJson;
printf("[repairDefectPassphrase] parse request result\n");
try {
parsedJson = jsonParser.parse(responseStringStream);
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
auto jsonState = object.get("state");
std::string stateString = jsonState.convert<std::string>();
if (stateString == "error") {
addError(new Error("Transfer", "php server return error"));
if (!object.isNull("msg")) {
addError(new ParamError("php server", "msg:", object.get("msg").convert<std::string>().data()));
}
if (!object.isNull("details")) {
addError(new ParamError("php server", "details:", object.get("details").convert<std::string>().data()));
}
} else if(stateString == "success") {
printf("[repairDefectPassphrase] request success, wait on transaction ready\n");
auto currentActiveTransaction = mSession->getNextReadyTransaction();
while(currentActiveTransaction.isNull()) {
Poco::Thread::sleep(10);
currentActiveTransaction = mSession->getNextReadyTransaction();
}
if(!currentActiveTransaction->isTransfer()) {
addError(new Error("Transaction", "Falsche Transaktion, bitte erst alle anderen Transaktionen abschließen und dann Seite neuladen"));
} else {
auto signing = new SigningTransaction(currentActiveTransaction, user);
printf("[repairDefectPassphrase] before running sign\n");
if(!signing->run()) {
auto newUser = mSession->getNewUser();
auto newUserModel = newUser->getModel();
auto cryptedPrivKey = user->encrypt(keys.getPrivateKey());
newUserModel->setPublicKey(keys.getPublicKey());
newUserModel->setPrivateKey(cryptedPrivKey);
mm->releaseMemory(cryptedPrivKey);
if(!newUserModel->updatePrivkey() || !newUserModel->updatePublickey()) {
printf("[repairDefectPassphrase] error saving keys\n");
addError(new Error("Speichern", "Fehler beim speichern der neuen Keys in die Datenbank, bitte erneut versuchen (Seite neuladen)"));
} else {
//response.redirect(ServerConfig::g_serverPath + "/logout");
//return;
printf("[repairDefectPassphrase] set state to FINISH\n");
state = FINISH;
}
} else {
addError(new Error("Transaction", "Fehler beim signieren, bitter erneut versuchen"));
}
// remove transaction from list
mSession->finalizeTransaction(true, true);
}
}
}
catch (Poco::Exception& ex) {
//printf("[JsonRequestHandler::handleRequest] Exception: %s\n", ex.displayText().data());
addError(new ParamError("Transfer", "Fehler beim erstellen der Transaktion, bitte erneut versuchen", ex.displayText().data()));
errorString = responseStringStream.str();
}
//state = CREATE_TRANSACTION;
}
}
mm->releaseMemory(privKey);
%><%@ include file="header_old.cpsp" %>
<% if("" != errorString) { %>
<%= errorString %>
<% } %>
<div class="grd_container">
<%= getErrorsHtml() %>
<h1>Konto reparieren</h1>
<p>Der Login-Server hat festgestellt das die gespeicherte Passphrase nicht zu deinem Konto passt.</p>
<% if(GENERATE_PASSPHRASE == state) { %>
<% if(privKey) { %>
<p>Dein Privat Key konnte noch entschlüsselt werden. Es könnte also eine neue Passphrase generiert werden und dein aktueller Kontostand
auf die neue Adresse transferiert werden. </p>
<form method="POST">
<input type="submit" style="width:auto;" name="generate" value="Neue Passphrase generieren!">
</form>
<% } else {%>
<p>Dein Privat Key konnte nicht entschlüsselt werden. Bitte wende dich an den Admin: <a href="mailto:<%= adminEmail%>"><%= adminEmail %></a></p>
<% } %>
<% } else if(SHOW_PASSPHRASE == state) { %>
<p>Deine neue Passphrase, bitte schreibe sie dir auf (am besten auf einen Zettel) und hebe sie gut auf.
Du brauchst sie wenn du dein Passwort vergessen hast oder dein Konto umziehen möchtest:</p>
<fieldset><legend>Deine neue Passphrase:</legend>
<div class="grd_container_small grd_container">
<%= mSession->getPassphrase() %>
</div>
</fieldset>
<form method="POST">
<p><label style="width:auto" for="memo-text">Verwendungszweck für Überweisung:</label></p>
<p><textarea name="memo" id="memo-text" rows="4"></textarea></p>
<p><input type="submit" style="width:auto" name="transfer" value="Guthaben auf neue Adresse &uuml;berweisen!"></p>
</form>
<% } else if(FINISH == state) { %>
<p>Neue Daten erfolgreich gespeichert, bitte logge dich nun aus. Danach kannst du dich gerne wieder einloggen und müsstest dein Guthaben wieder auf deinem Konto haben.</p>
<a class="grd-nav-bn" href="<%= ServerConfig::g_serverPath + "/logout" %>">Ausloggen</a>
<% } %>
</div>
<%@ include file="footer.cpsp" %>