From 90469fb94b600a5321e569f19799d5fee7781289 Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 6 Apr 2020 11:45:00 +0200 Subject: [PATCH] adding debug mnemonic page --- src/cpp/Crypto/mnemonic.cpp | 5 +- src/cpp/HTTPInterface/DebugMnemonicPage.cpp | 262 ++++++++++++++++++ src/cpp/HTTPInterface/DebugMnemonicPage.h | 20 ++ .../PageRequestHandlerFactory.cpp | 6 + src/cpp/ServerConfig.cpp | 5 +- src/cpsp/debugMnemonic.cpsp | 135 +++++++++ src/cpsp/passphrase.cpsp | 2 +- 7 files changed, 429 insertions(+), 6 deletions(-) create mode 100644 src/cpp/HTTPInterface/DebugMnemonicPage.cpp create mode 100644 src/cpp/HTTPInterface/DebugMnemonicPage.h create mode 100644 src/cpsp/debugMnemonic.cpsp diff --git a/src/cpp/Crypto/mnemonic.cpp b/src/cpp/Crypto/mnemonic.cpp index 16faa3638..442069ee9 100644 --- a/src/cpp/Crypto/mnemonic.cpp +++ b/src/cpp/Crypto/mnemonic.cpp @@ -88,10 +88,7 @@ int Mnemonic::init(void(*fill_words_func)(unsigned char*), unsigned int original return -4; } memcpy(mWords[cursor], &uncompressed_buffer[word_begin], word_size); - - //char bu[256]; memset(bu, 0, 256); - //memcpy(bu, &uncompressed_buffer[word_begin - 1], 15); - //printf("word (%d): %s\n", cursor, bu); + //printf("%d: %s\n", cursor, mWords[cursor]); DHASH word_hash = DRMakeStringHash(mWords[cursor]); //mWordHashIndices.addByHash(word_hash, (void*)cursor); diff --git a/src/cpp/HTTPInterface/DebugMnemonicPage.cpp b/src/cpp/HTTPInterface/DebugMnemonicPage.cpp new file mode 100644 index 000000000..2c875e300 --- /dev/null +++ b/src/cpp/HTTPInterface/DebugMnemonicPage.cpp @@ -0,0 +1,262 @@ +#include "DebugMnemonicPage.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\\debugMnemonic.cpsp" + +#include "../ServerConfig.h" +#include "../Crypto/KeyPair.h" + + struct WordChecked { + WordChecked() : index(0), bSet(false) {}; + + int index; + std::string word; + std::string language; + bool bSet; + + std::string print() + { + std::string str; + str = std::to_string(index); + str += ": "; + str += word; + str += " ("; + str += language; + str += ")"; + return str; + } + }; + + const char* getLanguageByMnemonicListIndex(ServerConfig::Mnemonic_Types type) + { + switch(type) { + case ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER: return "de"; + case ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER: return "en"; + } + return "unknown"; + } +#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" + +#include "../ServerConfig.h" + + +DebugMnemonicPage::DebugMnemonicPage(Session* arg): + SessionHTTPRequestHandler(arg) +{ +} + + +void DebugMnemonicPage::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 41 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + + const char* pageName = "Debug Mnemonic"; + WordChecked checkedWord; + WordChecked checkedIndex[ServerConfig::Mnemonic_Types::MNEMONIC_MAX]; + + if(!form.empty()) + { + if("" != form.get("check_word", "")) + { + auto word = KeyPair::filterPassphrase(form.get("word", "")); + if("" != word) { + checkedWord.bSet = true; + checkedWord.word = word; + + for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) + { + Mnemonic& m = ServerConfig::g_Mnemonic_WordLists[i]; + + if (word != "\0" && word != "" && word.size() > 3) { + if(m.isWordExist(word)) { + checkedWord.index = m.getWordIndex(word.data()); + checkedWord.language = getLanguageByMnemonicListIndex((ServerConfig::Mnemonic_Types)i); + break; + } + } + else { + addError(new Error("Word", "Ungültiges Wort, es sollte länger als 3 Zeichen sein")); + checkedWord.bSet = false; + break; + } + } + } + } + if("" != form.get("check_index", "")) + { + try { + auto index = stoi(form.get("index", "")); + if(index < 0 || index >= 2048) { + addError(new Error("Index", "Ungültiger Index, muss sich im Bereich [0:2047] bewegen")); + } else { + for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) + { + Mnemonic& m = ServerConfig::g_Mnemonic_WordLists[i]; + checkedIndex[i].bSet = true; + checkedIndex[i].index = index; + checkedIndex[i].word = m.getWord(index); + checkedIndex[i].language = getLanguageByMnemonicListIndex((ServerConfig::Mnemonic_Types)i); + } + } + + } catch(...) { + addError(new Error("Index", "Ungültiger Index, keine Nummer")); + } + + + } + } + + + 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"; + responseStream << "
\n"; + responseStream << "\t

Debug Mnemonic

\n"; + responseStream << "\t"; +#line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + responseStream << ( getErrorsHtml() ); + responseStream << "\n"; + responseStream << "\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tWort prüfen\n"; + responseStream << "\t\t\t

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

\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t\t"; +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + if(checkedWord.bSet) { responseStream << "\n"; + responseStream << "\t\t\t\t

"; +#line 113 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + responseStream << ( checkedWord.print() ); + responseStream << "

\n"; + responseStream << "\t\t\t"; +#line 114 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + } responseStream << "\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tIndex prüfen\n"; + responseStream << "\t\t\t

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

\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t\t"; +#line 123 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + if(checkedIndex[0].bSet) { responseStream << "\n"; + responseStream << "\t\t\t\t
    \n"; + responseStream << "\t\t\t\t"; +#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) { responseStream << "\n"; + responseStream << "\t\t\t\t\t
  • \n"; + responseStream << "\t\t\t\t\t"; +#line 127 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + responseStream << ( checkedIndex[i].print() ); + responseStream << "\n"; + responseStream << "\t\t\t\t\t
  • \n"; + responseStream << "\t\t\t\t"; +#line 129 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t"; +#line 131 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" + } responseStream << "\n"; + responseStream << "\t\t
\n"; + responseStream << "\t
\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 + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/DebugMnemonicPage.h b/src/cpp/HTTPInterface/DebugMnemonicPage.h new file mode 100644 index 000000000..51e8c28e3 --- /dev/null +++ b/src/cpp/HTTPInterface/DebugMnemonicPage.h @@ -0,0 +1,20 @@ +#ifndef DebugMnemonicPage_INCLUDED +#define DebugMnemonicPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +#include "SessionHTTPRequestHandler.h" + + +class DebugMnemonicPage: public SessionHTTPRequestHandler +{ +public: + DebugMnemonicPage(Session*); + + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // DebugMnemonicPage_INCLUDED diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index de55e529e..adacc7b33 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -21,6 +21,7 @@ #include "ResetPassword.h" #include "RegisterAdminPage.h" #include "DebugPassphrasePage.h" +#include "DebugMnemonicPage.h" #include "AdminCheckUserBackup.h" #include "TranslatePassphrase.h" #include "PassphrasedTransaction.h" @@ -174,6 +175,11 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c pageRequestHandler->setProfiler(timeUsed); return pageRequestHandler; } + if (url_first_part == "/debugMnemonic") { + auto pageRequestHandler = new DebugMnemonicPage(s); + pageRequestHandler->setProfiler(timeUsed); + return pageRequestHandler; + } if (url_first_part == "/checkUserBackups") { auto pageRequestHandler = new AdminCheckUserBackup(s); pageRequestHandler->setProfiler(timeUsed); diff --git a/src/cpp/ServerConfig.cpp b/src/cpp/ServerConfig.cpp index a94f73572..07fc92b23 100644 --- a/src/cpp/ServerConfig.cpp +++ b/src/cpp/ServerConfig.cpp @@ -58,7 +58,10 @@ namespace ServerConfig { printf("[%s] error init german mnemonic set, error nr: %d\n", __FUNCTION__, iResult); return false; } - //g_Mnemonic_WordLists[i].printToFile("de_words.txt"); + g_Mnemonic_WordLists[i].printToFile("de_words.txt"); + for (int iWord = 750; iWord < 755; iWord++) { + printf("%d: %s\n", iWord, g_Mnemonic_WordLists[i].getWord(iWord)); + } break; case MNEMONIC_BIP0039_SORTED_ORDER: iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_bip0039, g_mnemonic_bip0039_original_size, g_mnemonic_bip0039_compressed_size); diff --git a/src/cpsp/debugMnemonic.cpsp b/src/cpsp/debugMnemonic.cpsp new file mode 100644 index 000000000..bed6ba32b --- /dev/null +++ b/src/cpsp/debugMnemonic.cpsp @@ -0,0 +1,135 @@ +<%@ page class="DebugMnemonicPage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%@ page baseClass="SessionHTTPRequestHandler" %> +<%@ page ctorArg="Session*" %> +<%@ header include="SessionHTTPRequestHandler.h" %> +<%! +#include "../ServerConfig.h" +#include "../Crypto/KeyPair.h" + + struct WordChecked { + WordChecked() : index(0), bSet(false) {}; + + int index; + std::string word; + std::string language; + bool bSet; + + std::string print() + { + std::string str; + str = std::to_string(index); + str += ": "; + str += word; + str += " ("; + str += language; + str += ")"; + return str; + } + }; + + const char* getLanguageByMnemonicListIndex(ServerConfig::Mnemonic_Types type) + { + switch(type) { + case ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER: return "de"; + case ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER: return "en"; + } + return "unknown"; + } +%> +<%% + const char* pageName = "Debug Mnemonic"; + WordChecked checkedWord; + WordChecked checkedIndex[ServerConfig::Mnemonic_Types::MNEMONIC_MAX]; + + if(!form.empty()) + { + if("" != form.get("check_word", "")) + { + auto word = KeyPair::filterPassphrase(form.get("word", "")); + if("" != word) { + checkedWord.bSet = true; + checkedWord.word = word; + + for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) + { + Mnemonic& m = ServerConfig::g_Mnemonic_WordLists[i]; + + if (word != "\0" && word != "" && word.size() > 3) { + if(m.isWordExist(word)) { + checkedWord.index = m.getWordIndex(word.data()); + checkedWord.language = getLanguageByMnemonicListIndex((ServerConfig::Mnemonic_Types)i); + break; + } + } + else { + addError(new Error("Word", "Ungültiges Wort, es sollte länger als 3 Zeichen sein")); + checkedWord.bSet = false; + break; + } + } + } + } + if("" != form.get("check_index", "")) + { + try { + auto index = stoi(form.get("index", "")); + if(index < 0 || index >= 2048) { + addError(new Error("Index", "Ungültiger Index, muss sich im Bereich [0:2047] bewegen")); + } else { + for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) + { + Mnemonic& m = ServerConfig::g_Mnemonic_WordLists[i]; + checkedIndex[i].bSet = true; + checkedIndex[i].index = index; + checkedIndex[i].word = m.getWord(index); + checkedIndex[i].language = getLanguageByMnemonicListIndex((ServerConfig::Mnemonic_Types)i); + } + } + + } catch(...) { + addError(new Error("Index", "Ungültiger Index, keine Nummer")); + } + + + } + } + + +%><%@ include file="header_old.cpsp" %> +
+

Debug Mnemonic

+ <%= getErrorsHtml() %> +
+
+ Wort prüfen +

+ + "/> +

+ + <% if(checkedWord.bSet) { %> +

<%= checkedWord.print() %>

+ <% } %> +
+
+ Index prüfen +

+ + "/> +

+ + <% if(checkedIndex[0].bSet) { %> +
    + <% for (int i = ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) { %> +
  • + <%= checkedIndex[i].print() %> +
  • + <% } %> +
+ <% } %> +
+
+
+<%@ include file="footer.cpsp" %> diff --git a/src/cpsp/passphrase.cpsp b/src/cpsp/passphrase.cpsp index a6f4841fd..616247d4f 100644 --- a/src/cpsp/passphrase.cpsp +++ b/src/cpsp/passphrase.cpsp @@ -111,7 +111,7 @@ enum PageState addError(new ParamError("PassphrasePage", "user email", mSession->getNewUser()->getModel()->getEmail())); } sendErrorsAsEmail(); - addError(new Error(gettext("Passphrase"), gettext("intern errorm please try again later")), false); + addError(new Error(gettext("Passphrase"), gettext("intern error please try again later")), false); //response.redirect(ServerConfig::g_serverPath + "/error500"); //return; }