diff --git a/src/cpp/Crypto/KeyPair.h b/src/cpp/Crypto/KeyPair.h index 088e7092d..c2a557462 100644 --- a/src/cpp/Crypto/KeyPair.h +++ b/src/cpp/Crypto/KeyPair.h @@ -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(); diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index 4a08b6df4..b8391d1fd 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -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); diff --git a/src/cpp/HTTPInterface/RepairDefectPassphrase.cpp b/src/cpp/HTTPInterface/RepairDefectPassphrase.cpp new file mode 100644 index 000000000..9a3074b75 --- /dev/null +++ b/src/cpp/HTTPInterface/RepairDefectPassphrase.cpp @@ -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(); + auto jsonState = object.get("state"); + std::string stateString = jsonState.convert(); + 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().data())); + } + if (!object.isNull("details")) { + addError(new ParamError("php server", "details:", object.get("details").convert().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 << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: "; +#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" + responseStream << ( pageName ); + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "\t

Login Server in Entwicklung

\n"; + responseStream << "\t

Alpha "; +#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" + responseStream << ( ServerConfig::g_versionString ); + responseStream << "

\n"; + responseStream << "
\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 << "
\n"; + responseStream << "\t"; +#line 193 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp" + responseStream << ( getErrorsHtml() ); + responseStream << "\n"; + responseStream << "\t

Konto reparieren

\n"; + responseStream << "\t

Der Login-Server hat festgestellt das die gespeicherte Passphrase nicht zu deinem Konto passt.

\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

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.

\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t"; +#line 203 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp" + } else { responseStream << "\n"; + responseStream << "\t\t\t

Dein Privat Key konnte nicht entschlüsselt werden. Bitte wende dich an den Admin: "; +#line 204 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp" + responseStream << ( adminEmail ); + responseStream << "

\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

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:

\n"; + responseStream << "\t\t
Deine neue Passphrase:\n"; + responseStream << "\t\t\t
\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
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t
\n"; + responseStream << "\t"; +#line 219 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp" + } else if(FINISH == state) { responseStream << "\n"; + responseStream << "\t\t

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.

\n"; + responseStream << "\t\tAusloggen\n"; + responseStream << "\t"; +#line 222 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\repairDefectPassphrase.cpsp" + } responseStream << "\n"; + responseStream << "
\n"; + // begin include footer.cpsp + responseStream << "\t
\n"; + responseStream << "\t\t\t"; +#line 2 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" + responseStream << ( mTimeProfiler.string() ); + responseStream << "\n"; + responseStream << "\t
\n"; + responseStream << "\n"; + responseStream << ""; + // end include footer.cpsp + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/RepairDefectPassphrase.h b/src/cpp/HTTPInterface/RepairDefectPassphrase.h new file mode 100644 index 000000000..9ea3371e0 --- /dev/null +++ b/src/cpp/HTTPInterface/RepairDefectPassphrase.h @@ -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 diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index 5efa00690..c81e3d4c7 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -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(); diff --git a/src/cpp/model/User.h b/src/cpp/model/User.h index c0668abf2..54effae90 100644 --- a/src/cpp/model/User.h +++ b/src/cpp/model/User.h @@ -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 diff --git a/src/cpp/model/table/User.cpp b/src/cpp/model/table/User.cpp index 3f066fdac..d27df7073 100644 --- a/src/cpp/model/table/User.cpp +++ b/src/cpp/model/table/User.cpp @@ -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; diff --git a/src/cpp/model/table/User.h b/src/cpp/model/table/User.h index 3c72946d8..024ffbcea 100644 --- a/src/cpp/model/table/User.h +++ b/src/cpp/model/table/User.h @@ -44,6 +44,7 @@ namespace model { // specific db operation size_t updatePrivkey(); + size_t updatePublickey(); // default getter unlocked diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 53288583a..b31ba65dd 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -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())); diff --git a/src/cpsp/repairDefectPassphrase.cpsp b/src/cpsp/repairDefectPassphrase.cpsp new file mode 100644 index 000000000..035aa414f --- /dev/null +++ b/src/cpsp/repairDefectPassphrase.cpsp @@ -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(); + auto jsonState = object.get("state"); + std::string stateString = jsonState.convert(); + 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().data())); + } + if (!object.isNull("details")) { + addError(new ParamError("php server", "details:", object.get("details").convert().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 %> +<% } %> +
+ <%= getErrorsHtml() %> +

Konto reparieren

+

Der Login-Server hat festgestellt das die gespeicherte Passphrase nicht zu deinem Konto passt.

+ <% if(GENERATE_PASSPHRASE == state) { %> + <% if(privKey) { %> +

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.

+
+ +
+ <% } else {%> +

Dein Privat Key konnte nicht entschlüsselt werden. Bitte wende dich an den Admin: <%= adminEmail %>

+ <% } %> + <% } else if(SHOW_PASSPHRASE == state) { %> +

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:

+
Deine neue Passphrase: +
+ <%= mSession->getPassphrase() %> +
+
+
+

+

+

+
+ <% } else if(FINISH == state) { %> +

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.

+ ">Ausloggen + <% } %> +
+<%@ include file="footer.cpsp" %> \ No newline at end of file