diff --git a/src/cpp/Crypto/KeyPair.cpp b/src/cpp/Crypto/KeyPair.cpp index 3f7d41fcb..d57b177a5 100644 --- a/src/cpp/Crypto/KeyPair.cpp +++ b/src/cpp/Crypto/KeyPair.cpp @@ -90,7 +90,8 @@ bool KeyPair::generateFromPassphrase(const char* passphrase, Mnemonic* word_sour // debug passphrase // printf("\passsphrase: <%s>\n", passphrase); -// printf("word_indices: \n%s\n", getHex((unsigned char*)word_indices, sizeof(word_indices)).data()); + printf("word_indices: \n%s\n", getHex((unsigned char*)word_indices, sizeof(word_indices)).data()); + printf("clear passphrase: \n%s\n", clearPassphrase.data()); // printf("passphrase bin: \n%s\n\n", getHex((unsigned char*)passphrase, pass_phrase_size).data()); //ed25519_create_keypair(public_key, private_key, hash); @@ -212,6 +213,11 @@ std::string KeyPair::getHex(const unsigned char* data, Poco::UInt32 size) return hex; } +std::string KeyPair::getHex(const MemoryBin* data) +{ + return getHex(*data, data->size()); +} + bool KeyPair::savePrivKey(int userId) { auto cm = ConnectionManager::getInstance(); diff --git a/src/cpp/Crypto/KeyPair.h b/src/cpp/Crypto/KeyPair.h index 07a1de4bf..cde5f0a9a 100644 --- a/src/cpp/Crypto/KeyPair.h +++ b/src/cpp/Crypto/KeyPair.h @@ -12,11 +12,13 @@ class UserWriteKeysIntoDB; class UserGenerateKeys; +class DebugPassphrasePage; // TODO: https://libsodium.gitbook.io/doc/advanced/ed25519-curve25519 class KeyPair { friend UserWriteKeysIntoDB; friend UserGenerateKeys; + friend DebugPassphrasePage; public: KeyPair(); ~KeyPair(); @@ -26,6 +28,7 @@ public: std::string getPubkeyHex(); bool savePrivKey(int userId); static std::string getHex(const unsigned char* data, Poco::UInt32 size); + static std::string getHex(const MemoryBin* data); inline const unsigned char* getPublicKey() const { return mSodiumPublic; } diff --git a/src/cpp/HTTPInterface/DebugPassphrasePage.cpp b/src/cpp/HTTPInterface/DebugPassphrasePage.cpp new file mode 100644 index 000000000..32f3b589c --- /dev/null +++ b/src/cpp/HTTPInterface/DebugPassphrasePage.cpp @@ -0,0 +1,187 @@ +#include "DebugPassphrasePage.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\\debugPassphrase.cpsp" + +#include "../crypto/KeyPair.h" +#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" + +#include "../ServerConfig.h" + + +DebugPassphrasePage::DebugPassphrasePage(Session* arg): + SessionHTTPRequestHandler(arg) +{ +} + + +void DebugPassphrasePage::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 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + + const char* pageName = "Debug Passphrase"; + auto mm = MemoryManager::getInstance(); + KeyPair keys; + std::string privKeyHex = ""; + std::string privKeyCryptedHex = ""; + User::passwordHashed pwdHashed = 0; + if(!form.empty()) { + auto passphrase = KeyPair::filterPassphrase(form.get("passphrase", "")); + Mnemonic* wordSource = nullptr; + if(!User::validatePassphrase(passphrase, &wordSource)) { + addError(new Error("debug Passphrase", "invalid passphrase")); + } else { + keys.generateFromPassphrase(passphrase.data(), wordSource); + } + auto newUser = new User(form.get("email", "").data(), "first_name", "last_name"); + newUser->validatePwd(form.get("password", ""), this); + pwdHashed = newUser->getPwdHashed(); + auto privKey = keys.getPrivateKey(); + if(privKey) { + privKeyHex = KeyPair::getHex(privKey); + auto privKeyCrypted = newUser->encrypt(privKey); + if(privKeyCrypted) { + privKeyCryptedHex = KeyPair::getHex(privKeyCrypted); + mm->releaseMemory(privKeyCrypted); + } + } + getErrors(newUser); + delete newUser; + } + + + 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 Passphrase

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

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

Public key:
"; +#line 61 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( keys.getPubkeyHex() ); + responseStream << "

\n"; + responseStream << "\t

Private Key:
"; +#line 62 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( privKeyHex ); + responseStream << "

\n"; + responseStream << "\t

Passwort Hashed:
"; +#line 63 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( std::to_string(pwdHashed) ); + responseStream << "

\n"; + responseStream << "\t

Private key crypted:
"; +#line 64 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( privKeyCryptedHex ); + 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 + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/DebugPassphrasePage.h b/src/cpp/HTTPInterface/DebugPassphrasePage.h new file mode 100644 index 000000000..131752a6f --- /dev/null +++ b/src/cpp/HTTPInterface/DebugPassphrasePage.h @@ -0,0 +1,20 @@ +#ifndef DebugPassphrasePage_INCLUDED +#define DebugPassphrasePage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +#include "SessionHTTPRequestHandler.h" + + +class DebugPassphrasePage: public SessionHTTPRequestHandler +{ +public: + DebugPassphrasePage(Session*); + + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // DebugPassphrasePage_INCLUDED diff --git a/src/cpp/HTTPInterface/ElopageWebhook.cpp b/src/cpp/HTTPInterface/ElopageWebhook.cpp index 557e92287..3f1b65fd9 100644 --- a/src/cpp/HTTPInterface/ElopageWebhook.cpp +++ b/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -228,7 +228,7 @@ int HandleElopageRequestTask::run() // get input data // check event type std::string event = mRequestData.get("event", ""); - if (event == "lesson.viewed" || event == "lesson.completed") { + if (event == "lesson.viewed" || event == "lesson.completed" || event == "lesson.commented") { return 0; } diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index 730ec79aa..f9b277dff 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -19,6 +19,7 @@ #include "CheckTransactionPage.h" #include "ResetPassword.h" #include "RegisterAdminPage.h" +#include "DebugPassphrasePage.h" #include "DecodeTransactionPage.h" @@ -132,10 +133,17 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c pageRequestHandler->setProfiler(timeUsed); return pageRequestHandler; } - if (url_first_part == "/adminRegister") { - auto pageRequestHandler = new RegisterAdminPage(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); + pageRequestHandler->setProfiler(timeUsed); + return pageRequestHandler; + } + if (url_first_part == "/debugPassphrase") { + auto pageRequestHandler = new DebugPassphrasePage(s); + pageRequestHandler->setProfiler(timeUsed); + return pageRequestHandler; + } } if(url_first_part == "/logout") { diff --git a/src/cpp/model/User.cpp b/src/cpp/model/User.cpp index 625480906..e1a71a942 100644 --- a/src/cpp/model/User.cpp +++ b/src/cpp/model/User.cpp @@ -748,6 +748,12 @@ bool User::validatePwd(const std::string& pwd, ErrorList* validationErrorsToPrin if (sizeof(User::passwordHashed) != crypto_shorthash_BYTES) { throw Poco::Exception("crypto_shorthash_BYTES != sizeof(User::passwordHashed)"); } + if (nullptr == cmpCryptoKey) { + if (validationErrorsToPrint) { + validationErrorsToPrint->addError(new Error("User::validatePwd", "couldn't create crypto key")); + return false; + } + } User::passwordHashed pwdHashed; if (!ServerConfig::g_ServerCryptoKey) { if (validationErrorsToPrint) { diff --git a/src/cpp/model/User.h b/src/cpp/model/User.h index 2c46cbde3..c0668abf2 100644 --- a/src/cpp/model/User.h +++ b/src/cpp/model/User.h @@ -23,7 +23,7 @@ class Session; class UserWriteCryptoKeyHashIntoDB; class SigningTransaction; class UserGenerateKeys; - +class DebugPassphrasePage; enum UserStates { @@ -54,6 +54,7 @@ class User : public ErrorList friend UserWriteCryptoKeyHashIntoDB; friend SigningTransaction; friend UserGenerateKeys; + friend DebugPassphrasePage; public: // new user User(const char* email, const char* first_name, const char* last_name); diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 6c504acac..53288583a 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -1,5 +1,7 @@ #include "SigningTransaction.h" +#include + #include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/MemoryManager.h" #include "../SingletonManager/SingletonTaskObserver.h" @@ -99,7 +101,14 @@ int SigningTransaction::run() { *sigBytes = std::string((char*)*sign, sign->size()); mm->releaseMemory(sign); - + /*std::string protoPrettyPrint; + google::protobuf::TextFormat::PrintToString(transaction, &protoPrettyPrint); + printf("transaction pretty: %s\n", protoPrettyPrint.data()); + model::messages::gradido::TransactionBody transactionBody; + transactionBody.MergeFromString(transaction.bodybytes()); + google::protobuf::TextFormat::PrintToString(transactionBody, &protoPrettyPrint); + printf("transaction body pretty: \n%s\n", protoPrettyPrint.data()); + */ // finalize //printf("sigpair size: %d\n", transaction.sigmap().sigpair_size()); std::string finalTransactionBin = transaction.SerializeAsString(); @@ -199,6 +208,7 @@ int SigningTransaction::run() { sendErrorsAsEmail(); return -8; } + return 0; } \ No newline at end of file diff --git a/src/cpsp/debugPassphrase.cpsp b/src/cpsp/debugPassphrase.cpsp new file mode 100644 index 000000000..b0451f7e0 --- /dev/null +++ b/src/cpsp/debugPassphrase.cpsp @@ -0,0 +1,66 @@ +<%@ page class="DebugPassphrasePage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%@ page baseClass="SessionHTTPRequestHandler" %> +<%@ page ctorArg="Session*" %> +<%@ header include="SessionHTTPRequestHandler.h" %> +<%! +#include "../crypto/KeyPair.h" +%> +<%% + const char* pageName = "Debug Passphrase"; + auto mm = MemoryManager::getInstance(); + KeyPair keys; + std::string privKeyHex = ""; + std::string privKeyCryptedHex = ""; + User::passwordHashed pwdHashed = 0; + if(!form.empty()) { + auto passphrase = KeyPair::filterPassphrase(form.get("passphrase", "")); + Mnemonic* wordSource = nullptr; + if(!User::validatePassphrase(passphrase, &wordSource)) { + addError(new Error("debug Passphrase", "invalid passphrase")); + } else { + keys.generateFromPassphrase(passphrase.data(), wordSource); + } + auto newUser = new User(form.get("email", "").data(), "first_name", "last_name"); + newUser->validatePwd(form.get("password", ""), this); + pwdHashed = newUser->getPwdHashed(); + auto privKey = keys.getPrivateKey(); + if(privKey) { + privKeyHex = KeyPair::getHex(privKey); + auto privKeyCrypted = newUser->encrypt(privKey); + if(privKeyCrypted) { + privKeyCryptedHex = KeyPair::getHex(privKeyCrypted); + mm->releaseMemory(privKeyCrypted); + } + } + getErrors(newUser); + delete newUser; + } + + +%><%@ include file="header_old.cpsp" %> +
+

Debug Passphrase

+ <%= getErrorsHtml() %> +
+
+ Userdata +

+ + "/> +

+

+ + +

+ +
+ +
+

Public key:
<%= keys.getPubkeyHex() %>

+

Private Key:
<%= privKeyHex %>

+

Passwort Hashed:
<%= std::to_string(pwdHashed) %>

+

Private key crypted:
<%= privKeyCryptedHex %>

+
+<%@ include file="footer.cpsp" %>