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 << "
\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() %>
+
+
+<%@ 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;
}