work on register

This commit is contained in:
Dario 2019-09-27 21:29:55 +02:00
parent 3d3deae9c7
commit c44656da5c
14 changed files with 267 additions and 93 deletions

View File

@ -15,18 +15,20 @@ include_directories(
FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h")
FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp")
FILE(GLOB TASKS "src/cpp/tasks/*.cpp" "src/cpp/tasks/*.h")
FILE(GLOB SINGLETON_MANAGER "src/cpp/SingletonManager/*.h" "src/cpp/SingletonManager/*.cpp")
FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp")
FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp")
FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h")
FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/Poco/*.h")
SET(LOCAL_SRCS ${TINF} ${MAIN} ${HTTPInterface} ${CRYPTO} ${MODEL} ${SINGLETON_MANAGER} ${MYSQL})
SET(LOCAL_SRCS ${TINF} ${MAIN} ${HTTPInterface} ${CRYPTO} ${MODEL} ${SINGLETON_MANAGER} ${MYSQL} ${TASKS})
aux_source_directory("src/cpp" LOCAL_SRCS)
if(MSVC)
# src
source_group("tinf" FILES ${TINF})
source_group("crypto" FILES ${CRYPTO})
source_group("tasks" FILES ${TASKS})
source_group("model" FILES ${MODEL})
source_group("mysql" FILES ${MYSQL})
source_group("SingletonManager" FILES ${SINGLETON_MANAGER})

View File

@ -6,16 +6,16 @@
ObfusArray::ObfusArray(size_t size, const unsigned char * data)
: m_arraySize(0), m_offsetSize(0), m_dataSize(size), m_Data(nullptr)
{
m_arraySize = randombytes_random() % (int)roundf(size + size*0.25f);
m_arraySize = size + randombytes_random() % (int)roundf(size*0.25f);
m_Data = (unsigned char*)malloc(m_arraySize);
m_offsetSize = randombytes_random() % (int)roundf((m_arraySize - m_dataSize) * 0.8f);
uint32_t* d = (uint32_t*)m_Data;
for (size_t i = 0; i < (size_t)floorf(m_arraySize / 4.0f); i++) {
uint32_t* d = (uint32_t*)m_Data[i];
*d = randombytes_random();
d[i] = randombytes_random();
}
uint32_t* d = (uint32_t*)(m_Data + (m_arraySize - 4));
*d = randombytes_random();
d[m_arraySize - 4] = randombytes_random();
memcpy(&m_Data[m_offsetSize], data, size);
}

View File

@ -9,6 +9,7 @@
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/HTTPServer.h"
#include "Poco/Environment.h"
#include "MySQL/Poco/Connector.h"
#include <sodium.h>
@ -70,9 +71,19 @@ int Gradido_LoginServer::main(const std::vector<std::string>& args)
else
{
unsigned short port = (unsigned short)config().getInt("HTTPServer.port", 9980);
// load word lists
ServerConfig::loadMnemonicWordLists();
if (!ServerConfig::loadMnemonicWordLists()) {
printf("[Gradido_LoginServer::%s] error loading mnemonic Word List\n", __FUNCTION__);
return Application::EXIT_CONFIG;
}
if (!ServerConfig::initServerCrypto(config())) {
printf("[Gradido_LoginServer::%s] error init server crypto\n", __FUNCTION__);
return Application::EXIT_CONFIG;
}
// start cpu scheduler
ServerConfig::g_CPUScheduler = new UniLib::controller::CPUSheduler(Poco::Environment::processorCount(), "Login Worker");
// load up connection configs
// register MySQL connector
@ -97,6 +108,7 @@ int Gradido_LoginServer::main(const std::vector<std::string>& args)
waitForTerminationRequest();
// Stop the HTTPServer
srv.stop();
ServerConfig::unload();
}
return Application::EXIT_OK;
}

View File

@ -1,10 +1,14 @@
#include "PageRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "ConfigPage.h"
#include "LoginPage.h"
#include "RegisterPage.h"
#include "HandleFileRequest.h"
#include "DashboardPage.h"
#include "../SingletonManager/SessionManager.h"
PageRequestHandlerFactory::PageRequestHandlerFactory()
{
@ -13,18 +17,40 @@ PageRequestHandlerFactory::PageRequestHandlerFactory()
Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)
{
printf("request uri: %s\n", request.getURI().data());
//printf("request uri: %s\n", request.getURI().data());
std::string uri = request.getURI();
if (uri == "/") {
return new ConfigPage;
auto referer = request.find("Referer");
if (referer != request.end()) {
printf("referer: %s\n", referer->second.data());
}
else if (uri == "/login") {
return new LoginPage;
}
else if (uri == "/register") {
return new RegisterPage;
// check if user has valid session
Poco::Net::NameValueCollection cookies;
request.getCookies(cookies);
int session_id = 0;
try {
session_id = atoi(cookies.get("user").data());
} catch (...) {}
auto sm = SessionManager::getInstance();
auto s = sm->getSession(session_id);
if (s) {
return new DashboardPage(s);
} else {
if (uri == "/") {
return new ConfigPage;
}
else if (uri == "/login") {
return new LoginPage;
}
else if (uri == "/register") {
return new RegisterPage;
}
}
return new HandleFileRequest;
//return new PageRequestHandlerFactory;

View File

@ -8,6 +8,7 @@
#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
#include "../SingletonManager/SessionManager.h"
#include "Poco/Net/HTTPCookie.h"
void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
@ -18,11 +19,7 @@ void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne
if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream());
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n";
#line 7 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
#line 8 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
auto session = SessionManager::getInstance()->getNewSession();
bool userReturned = false;
@ -30,10 +27,20 @@ void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne
userReturned = session->createUser(
form.get("register-name"),
form.get("register-email"),
form.get("register-password"),
form.get("register-key-existing")
form.get("register-password")
);
if(userReturned) {
auto cookie_id = session->getHandle();
//auto user_host_string = request.clientAddress().toString();
auto user_host = request.clientAddress().host();
session->setClientIp(user_host);
//printf("cookie: %d, user_host: %s\n", cookie_id, user_host.data());
response.addCookie(Poco::Net::HTTPCookie("user", std::to_string(cookie_id)));
}
}
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n";
responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
@ -54,19 +61,36 @@ void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne
responseStream << "</style>\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << "<h1>Einen neuen Account anlegen</h1>\n";
responseStream << "\n";
responseStream << "<form method=\"POST\">\n";
responseStream << "\t<div class=\"grd_container\">\n";
responseStream << "<div class=\"grd_container\">\n";
responseStream << "\t<h1>Einen neuen Account anlegen</h1>\n";
responseStream << "\t";
#line 42 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
if(!form.empty() && !userReturned) { responseStream << "\n";
#line 48 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
if(!form.empty() && userReturned) { responseStream << "\n";
responseStream << "\t\t<div class=\"grd_text-max-width\">\n";
responseStream << "\t\t\t<div class=\"grd_text\">\n";
responseStream << "\t\t\t\tSchreibe dir den Merkspruch auf und packe ihn gut weg. Du brauchst ihn um deine Adresse wiederherzustellen. Wenn du ihn verlierst, sind auch deine Gradidos verloren.\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t<div class=\"grd_textarea\">\n";
responseStream << "\t\t\t\t";
#line 54 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << ( session->getPassphrase() );
responseStream << "\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t";
#line 57 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
} else { responseStream << "\n";
responseStream << "\t<form method=\"POST\">\n";
responseStream << "\t\n";
responseStream << "\t\t";
#line 43 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
#line 60 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
if(!form.empty() && !userReturned) { responseStream << "\n";
responseStream << "\t\t\t";
#line 61 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << ( session->getErrorsHtml() );
responseStream << "\n";
responseStream << "\t";
#line 44 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << "\t\t";
#line 62 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
} responseStream << "\n";
responseStream << "\t\t<fieldset class=\"grd_container_small\">\n";
responseStream << "\t\t\t<legend>Account anlegen</legend>\n";
@ -74,14 +98,14 @@ void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne
responseStream << "\t\t\t<p class=\"grd_small\">\n";
responseStream << "\t\t\t\t<label for=\"register-name\">Vorname</label>\n";
responseStream << "\t\t\t\t<input id=\"register-name\" type=\"text\" name=\"register-name\" value=\"";
#line 50 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
#line 68 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << ( !form.empty() ? form.get("register-name") : "" );
responseStream << "\"/>\n";
responseStream << "\t\t\t</p>\n";
responseStream << "\t\t\t<p class=\"grd_small\">\n";
responseStream << "\t\t\t\t<label for=\"register-email\">E-Mail</label>\n";
responseStream << "\t\t\t\t<input id=\"register-email\" type=\"email\" name=\"register-email\" value=\"";
#line 54 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
#line 72 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << ( !form.empty() ? form.get("register-email") : "" );
responseStream << "\"/>\n";
responseStream << "\t\t\t</p>\n";
@ -89,23 +113,14 @@ void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne
responseStream << "\t\t\t\t<label for=\"register-password\">Passwort</label>\n";
responseStream << "\t\t\t\t<input id=\"register-password\" type=\"password\" name=\"register-password\"/>\n";
responseStream << "\t\t\t</p>\n";
responseStream << "\t\t\t<p>Hast du bereits schonmal ein Gradido Konto besessen?</p>\n";
responseStream << "\t\t\t<p class=\"grd_small\">\n";
responseStream << "\t\t\t\t<input id=\"register-key-new-yes\" type=\"radio\" name=\"register-key\" value=\"yes\" checked/>\n";
responseStream << "\t\t\t\t<label class=\"grd_radio_label\" for=\"register-key-new-yes\">Nein, bitte ein neues erstellen!</label>\n";
responseStream << "\t\t\t</p>\n";
responseStream << "\t\t\t<p class=\"grd_small\">\n";
responseStream << "\t\t\t\t<input id=\"register-key-new-no\" type=\"radio\" name=\"register-key\" value=\"no\"/>\n";
responseStream << "\t\t\t\t<label class=\"grd_radio_label\" for=\"register-key-new-no\">Ja, bitte wiederherstellen!</label>\n";
responseStream << "\t\t\t</p>\n";
responseStream << "\t\t\t<textarea style=\"width:100%;height:100px\" name=\"register-key-existing\">";
#line 69 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
responseStream << ( !form.empty() ? form.get("register-key-existing") : "" );
responseStream << "</textarea>\n";
responseStream << "\t\t</fieldset>\n";
responseStream << "\t\t<input class=\"grd_bn_succeed\" type=\"submit\" name=\"submit\" value=\"Einloggen\">\n";
responseStream << "\t</div>\n";
responseStream << "</form>\n";
responseStream << "\t\t<input class=\"grd_bn_succeed\" type=\"submit\" name=\"submit\" value=\"Anmelden\">\n";
responseStream << "\t\t\n";
responseStream << "\t</form>\n";
responseStream << "\t";
#line 82 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp"
} responseStream << "\n";
responseStream << "</div>\n";
responseStream << "</body>\n";
responseStream << "</html>\n";
if (_compressResponse) _gzipStream.close();

View File

@ -1,11 +1,14 @@
#include "ServerConfig.h"
#include "Crypto/mnemonic_german.h"
#include "Crypto/mnemonic_bip0039.h"
#include "sodium.h"
namespace ServerConfig {
Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX];
ObfusArray* g_ServerCryptoKey = nullptr;
UniLib::controller::CPUSheduler* g_CPUScheduler = nullptr;
void loadMnemonicWordLists()
bool loadMnemonicWordLists()
{
for (int i = 0; i < MNEMONIC_MAX; i++) {
int iResult = 0;
@ -14,18 +17,46 @@ namespace ServerConfig {
iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_german, g_mnemonic_german_original_size, g_mnemonic_german_compressed_size);
if (iResult) {
printf("[%s] error init german mnemonic set, error nr: %d\n", __FUNCTION__, iResult);
//return -1;
return false;
}
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);
if (iResult) {
printf("[%s] error init bip0039 mnemonic set, error nr: %d\n", __FUNCTION__, iResult);
return false;
}
break;
default: printf("[%s] unknown MnemonicType\n", __FUNCTION__);
default: printf("[%s] unknown MnemonicType\n", __FUNCTION__); return false;
}
}
return true;
}
bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg)
{
auto serverKey = cfg.getString("crypto.server_key");
unsigned char key[crypto_shorthash_KEYBYTES];
size_t realBinSize = 0;
if (sodium_hex2bin(key, crypto_shorthash_KEYBYTES, serverKey.data(), serverKey.size(), nullptr, &realBinSize, nullptr)) {
printf("[%s] serverKey isn't valid hex: %s\n", __FUNCTION__, serverKey.data());
return false;
}
if (realBinSize != crypto_shorthash_KEYBYTES) {
printf("[%s] serverKey hasn't valid size, expecting: %d, get: %d\n",
__FUNCTION__, crypto_shorthash_KEYBYTES, realBinSize);
return false;
}
g_ServerCryptoKey = new ObfusArray(realBinSize, key);
return true;
}
void unload() {
if (g_ServerCryptoKey) {
delete g_ServerCryptoKey;
}
if (g_CPUScheduler) {
delete g_CPUScheduler;
}
}
}

View File

@ -1,4 +1,8 @@
#include "Crypto/mnemonic.h"
#include "Crypto/Obfus_array.h"
#include "Poco/Util/LayeredConfiguration.h"
#include "tasks/CPUSheduler.h"
namespace ServerConfig {
@ -9,6 +13,11 @@ namespace ServerConfig {
};
extern Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX];
extern ObfusArray* g_ServerCryptoKey;
extern UniLib::controller::CPUSheduler* g_CPUScheduler;
void loadMnemonicWordLists();
bool loadMnemonicWordLists();
bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg);
void unload();
}

View File

@ -90,6 +90,7 @@ Session* SessionManager::getNewSession(int* handle)
auto resultIt = mRequestSessionMap.find(local_handle);
if (resultIt != mRequestSessionMap.end()) {
Session* result = resultIt->second;
result->reset();
mWorkingMutex.unlock();
if (handle) {

View File

@ -27,6 +27,8 @@ enum SessionValidationTypes {
VALIDATE_MAX
};
// TODO: cleanup timeouted sessions
class SessionManager
{
public:

View File

@ -1,7 +1,10 @@
#include "Session.h"
#include "../ServerConfig.h"
#include "Poco/RegularExpression.h"
#include "../SingletonManager/SessionManager.h"
#include "sodium.h"
Session::Session(int handle)
: mHandleId(handle)
{
@ -17,10 +20,20 @@ Session::~Session()
void Session::reset()
{
if (mSessionUser) {
delete mSessionUser;
mSessionUser = nullptr;
}
updateTimeout();
mClientLoginIP = Poco::Net::IPAddress();
}
bool Session::createUser(const std::string& name, const std::string& email, const std::string& password, const std::string& passphrase)
void Session::updateTimeout()
{
mLastActivity = Poco::DateTime();
}
bool Session::createUser(const std::string& name, const std::string& email, const std::string& password)
{
auto sm = SessionManager::getInstance();
if (!sm->isValid(name, VALIDATE_NAME)) {
@ -35,15 +48,43 @@ bool Session::createUser(const std::string& name, const std::string& email, cons
addError(new Error("Password", "Bitte gebe ein g&uuml;ltiges Password ein mit mindestens 8 Zeichen, Gro&szlig;- und Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen"));
return false;
}
if (passphrase.size() > 0 && !sm->isValid(passphrase, VALIDATE_PASSPHRASE)) {
addError(new Error("Merksatz", "Der Merksatz ist nicht g&uuml;ltig, er besteht aus 24 W&ouml;rtern, mit Komma getrennt."));
/*if (passphrase.size() > 0 && !sm->isValid(passphrase, VALIDATE_PASSPHRASE)) {
addError(new Error("Merkspruch", "Der Merkspruch ist nicht g&uuml;ltig, er besteht aus 24 W&ouml;rtern, mit Komma getrennt."));
return false;
}
mSessionUser = new User(email.data(), name.data(), password.data(), passphrase.size() ? passphrase.data() : nullptr);
if (passphrase.size() == 0) {
//mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]);
mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER]);
}
else {
//mPassphrase = passphrase;
}*/
//mSessionUser = new User(email.data(), name.data(), password.data(), passphrase.size() ? passphrase.data() : mPassphrase.data());
updateTimeout();
// write user into db
// generate and write email verification into db
// send email
return true;
}
bool Session::loadUser(const std::string& email, const std::string& password)
{
return true;
}
int Session::createEmailVerificationCode()
{
uint32_t* code_p = (uint32_t*)mEmailVerification;
for (int i = 0; i < EMAIL_VERIFICATION_CODE_SIZE / 4; i++) {
code_p[i] = randombytes_random();
}
return 0;
}

View File

@ -13,22 +13,43 @@
#include "ErrorList.h"
#include "User.h"
#include "Poco/Thread.h"
#include "Poco/DateTime.h"
#include "Poco/Net/IPAddress.h"
#define EMAIL_VERIFICATION_CODE_SIZE 8
class Session : public ErrorList
{
public:
Session(int handle);
~Session();
bool createUser(const std::string& name, const std::string& email, const std::string& password, const std::string& passphrase);
bool createUser(const std::string& name, const std::string& email, const std::string& password);
bool loadUser(const std::string& email, const std::string& password);
inline User* getUser() { return mSessionUser; }
inline int getHandle() { return mHandleId; }
inline const char* getPassphrase() { return mPassphrase.data(); }
inline void setClientIp(Poco::Net::IPAddress ip) { mClientLoginIP = ip; }
inline bool isIPValid(Poco::Net::IPAddress ip) { return mClientLoginIP == ip; }
void reset();
protected:
void updateTimeout();
int createEmailVerificationCode();
int mHandleId;
User* mSessionUser;
std::string mPassphrase;
Poco::DateTime mLastActivity;
Poco::Net::IPAddress mClientLoginIP;
unsigned char* mEmailVerification[EMAIL_VERIFICATION_CODE_SIZE];
};
#endif // DR_LUA_WEB_MODULE_SESSION_SESSION_H

View File

@ -2,6 +2,7 @@
#include <sodium.h>
#include "ed25519/ed25519.h"
#include "Poco/Util/Application.h"
#include "../ServerConfig.h"
NewUser::NewUser(User* user, const char* password, const char* passphrase)
: mUser(user), mPassword(password), mPassphrase(passphrase)
@ -46,16 +47,18 @@ void LoginUser::run()
// *******************************************************************************
User::User(const char* email, const char* name, const char* password, const char* passphrase)
User::User(const char* email, const char* name, const char* password)
: mEmail(email), mFirstName(name), mCryptoKey(nullptr)
{
//crypto_shorthash_KEYBYTES
//mPasswordHashed =
crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey);
}
User::User(const char* email, const char* password)
: mEmail(email)
{
crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey);
}

View File

@ -13,7 +13,7 @@ class User : public ErrorList
friend NewUser;
public:
// new user
User(const char* email, const char* name, const char* password, const char* passphrase);
User(const char* email, const char* name, const char* password);
// existing user
User(const char* email, const char* password);
@ -23,21 +23,22 @@ public:
inline bool hasCryptoKey() { lock(); bool bRet = mCryptoKey != nullptr; unlock(); return bRet; }
inline const char* getEmail() { return mEmail.data(); }
inline const char* getName() { return mFirstName.data(); }
protected:
void createCryptoKey(const char* email, const char* password);
inline void lock() { mWorkingMutex->lock(); }
inline void unlock() { mWorkingMutex->unlock(); }
inline void lock() { mWorkingMutex.lock(); }
inline void unlock() { mWorkingMutex.unlock(); }
private:
std::string mEmail;
std::string mFirstName;
unsigned char mPasswordHashed[crypto_shorthash_BYTES];
// crypto key as obfus array
ObfusArray* mCryptoKey;
Poco::Mutex* mWorkingMutex;
Poco::Mutex mWorkingMutex;
};

View File

@ -3,17 +3,25 @@
<%@ page compressed="true" %>
<%!
#include "../SingletonManager/SessionManager.h"
#include "Poco/Net/HTTPCookie.h"
%>
<%
<%%
auto session = SessionManager::getInstance()->getNewSession();
bool userReturned = false;
if(!form.empty()) {
userReturned = session->createUser(
form.get("register-name"),
form.get("register-email"),
form.get("register-password"),
form.get("register-key-existing")
form.get("register-password")
);
if(userReturned) {
auto cookie_id = session->getHandle();
//auto user_host_string = request.clientAddress().toString();
auto user_host = request.clientAddress().host();
session->setClientIp(user_host);
//printf("cookie: %d, user_host: %s\n", cookie_id, user_host.data());
response.addCookie(Poco::Net::HTTPCookie("user", std::to_string(cookie_id)));
}
}
%>
<!DOCTYPE html>
@ -35,13 +43,23 @@ label:not(.grd_radio_label) {
</style>
</head>
<body>
<h1>Einen neuen Account anlegen</h1>
<form method="POST">
<div class="grd_container">
<% if(!form.empty() && !userReturned) {%>
<%= session->getErrorsHtml() %>
<%} %>
<div class="grd_container">
<h1>Einen neuen Account anlegen</h1>
<% if(!form.empty() && userReturned) {%>
<div class="grd_text-max-width">
<div class="grd_text">
Schreibe dir den Merkspruch auf und packe ihn gut weg. Du brauchst ihn um deine Adresse wiederherzustellen. Wenn du ihn verlierst, sind auch deine Gradidos verloren.
</div>
<div class="grd_textarea">
<%= session->getPassphrase() %>
</div>
</div>
<% } else { %>
<form method="POST">
<% if(!form.empty() && !userReturned) {%>
<%= session->getErrorsHtml() %>
<%} %>
<fieldset class="grd_container_small">
<legend>Account anlegen</legend>
<p>Bitte gebe deine Daten um einen Account anzulegen</p>
@ -57,19 +75,11 @@ label:not(.grd_radio_label) {
<label for="register-password">Passwort</label>
<input id="register-password" type="password" name="register-password"/>
</p>
<p>Hast du bereits schonmal ein Gradido Konto besessen?</p>
<p class="grd_small">
<input id="register-key-new-yes" type="radio" name="register-key" value="yes" checked/>
<label class="grd_radio_label" for="register-key-new-yes">Nein, bitte ein neues erstellen!</label>
</p>
<p class="grd_small">
<input id="register-key-new-no" type="radio" name="register-key" value="no"/>
<label class="grd_radio_label" for="register-key-new-no">Ja, bitte wiederherstellen!</label>
</p>
<textarea style="width:100%;height:100px" name="register-key-existing"><%= !form.empty() ? form.get("register-key-existing") : "" %></textarea>
</fieldset>
<input class="grd_bn_succeed" type="submit" name="submit" value="Einloggen">
</div>
</form>
<input class="grd_bn_succeed" type="submit" name="submit" value="Anmelden">
</form>
<% } %>
</div>
</body>
</html>