lineendings login_server

This commit is contained in:
Ulf Gebhardt 2021-03-30 17:06:41 +02:00
parent d4d9a22164
commit f09a0017f9
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
32 changed files with 5494 additions and 5494 deletions

View File

@ -1,177 +1,177 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(Gradido_LoginServer C CXX) project(Gradido_LoginServer C CXX)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin" ) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin" )
SET ( CMAKE_CXX_FLAGS "-std=c++17" ) SET ( CMAKE_CXX_FLAGS "-std=c++17" )
include_directories( include_directories(
"dependencies" "dependencies"
"dependencies/tinf/src/" "dependencies/tinf/src/"
"dependencies/iroha-ed25519/include" "dependencies/iroha-ed25519/include"
"dependencies/mariadb-connector-c/include" "dependencies/mariadb-connector-c/include"
"dependencies/mariadb-connector-c/build/include" "dependencies/mariadb-connector-c/build/include"
"dependencies/spirit-po/include" "dependencies/spirit-po/include"
"src/cpp/proto" "src/cpp/proto"
#"dependencies/mariadb-connector-c/build/include" #"dependencies/mariadb-connector-c/build/include"
#"dependencies/mariadb-connector-c/include" #"dependencies/mariadb-connector-c/include"
#"import/mariadb/include" #"import/mariadb/include"
) )
FILE(GLOB CONTROLLER "src/cpp/controller/*.cpp" "src/cpp/controller/*.h") FILE(GLOB CONTROLLER "src/cpp/controller/*.cpp" "src/cpp/controller/*.h")
FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h") FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h")
FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp") FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp")
FILE(GLOB JSONInterface "src/cpp/JSONInterface/*.h" "src/cpp/JSONInterface/*.cpp") FILE(GLOB JSONInterface "src/cpp/JSONInterface/*.h" "src/cpp/JSONInterface/*.cpp")
FILE(GLOB TASKS "src/cpp/tasks/*.cpp" "src/cpp/tasks/*.h") 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 SINGLETON_MANAGER "src/cpp/SingletonManager/*.h" "src/cpp/SingletonManager/*.cpp")
FILE(GLOB LIB_SRC "src/cpp/lib/*.h" "src/cpp/lib/*.cpp") FILE(GLOB LIB_SRC "src/cpp/lib/*.h" "src/cpp/lib/*.cpp")
FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp") FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp")
FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp") FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp")
FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp") FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp")
FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.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 MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h")
FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h") FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h")
FILE(GLOB PROTO_GRADIDO "src/cpp/proto/gradido/*.cc" "src/cpp/proto/gradido/*.h") FILE(GLOB PROTO_GRADIDO "src/cpp/proto/gradido/*.cc" "src/cpp/proto/gradido/*.h")
FILE(GLOB PROTO_HEDERA "src/cpp/proto/hedera/*.cc" "src/cpp/proto/hedera/*.h") FILE(GLOB PROTO_HEDERA "src/cpp/proto/hedera/*.cc" "src/cpp/proto/hedera/*.h")
# used only for test project # used only for test project
FILE(GLOB TEST "src/cpp/test/*.cpp" "src/cpp/test/*.h") FILE(GLOB TEST "src/cpp/test/*.cpp" "src/cpp/test/*.h")
FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h") FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h")
FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h") FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h")
FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h") FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h")
FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h") FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h")
SET(LOCAL_SRCS SET(LOCAL_SRCS
${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface} ${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface}
${JSONInterface} ${CRYPTO} ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${JSONInterface} ${CRYPTO} ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL}
${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS} ${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS}
${PROTO_GRADIDO} ${PROTO_HEDERA} ${PROTO_GRADIDO} ${PROTO_HEDERA}
) )
SET(LOCAL_TEST_SRC SET(LOCAL_TEST_SRC
${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER}
) )
aux_source_directory("src/cpp" LOCAL_SRCS) aux_source_directory("src/cpp" LOCAL_SRCS)
if(MSVC) if(MSVC)
# src # src
source_group("controller" FILES ${CONTROLLER}) source_group("controller" FILES ${CONTROLLER})
source_group("proto\\gradido" FILES ${PROTO_GRADIDO}) source_group("proto\\gradido" FILES ${PROTO_GRADIDO})
source_group("proto\\hedera" FILES ${PROTO_HEDERA}) source_group("proto\\hedera" FILES ${PROTO_HEDERA})
source_group("tinf" FILES ${TINF}) source_group("tinf" FILES ${TINF})
source_group("Crypto" FILES ${CRYPTO}) source_group("Crypto" FILES ${CRYPTO})
source_group("tasks" FILES ${TASKS}) source_group("tasks" FILES ${TASKS})
source_group("model\\table" FILES ${MODEL_TABLE}) source_group("model\\table" FILES ${MODEL_TABLE})
source_group("model\\email" FILES ${MODEL_EMAIL}) source_group("model\\email" FILES ${MODEL_EMAIL})
source_group("model" FILES ${MODEL}) source_group("model" FILES ${MODEL})
source_group("mysql" FILES ${MYSQL}) source_group("mysql" FILES ${MYSQL})
source_group("SingletonManager" FILES ${SINGLETON_MANAGER}) source_group("SingletonManager" FILES ${SINGLETON_MANAGER})
source_group("lib" FILES ${LIB_SRC}) source_group("lib" FILES ${LIB_SRC})
source_group("HTTP-Interface" FILES ${HTTPInterface}) source_group("HTTP-Interface" FILES ${HTTPInterface})
source_group("Json-Interface" FILES ${JSONInterface}) source_group("Json-Interface" FILES ${JSONInterface})
source_group("Test\\crypto" FILES ${TEST_CRYPTO}) source_group("Test\\crypto" FILES ${TEST_CRYPTO})
source_group("Test\\model\\table" FILES ${TEST_MODEL_TABLE}) source_group("Test\\model\\table" FILES ${TEST_MODEL_TABLE})
source_group("Test\\model" FILES ${TEST_MODEL}) source_group("Test\\model" FILES ${TEST_MODEL})
source_group("Test\\controller" FILES ${TEST_CONTROLLER}) source_group("Test\\controller" FILES ${TEST_CONTROLLER})
source_group("Test" FILES ${TEST}) source_group("Test" FILES ${TEST})
endif(MSVC) endif(MSVC)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup() conan_basic_setup()
#add_subdirectory("dependencies/curl") #add_subdirectory("dependencies/curl")
#add_subdirectory("dependencies/mariadb-connector-c") #add_subdirectory("dependencies/mariadb-connector-c")
add_executable(Gradido_LoginServer ${LOCAL_SRCS}) add_executable(Gradido_LoginServer ${LOCAL_SRCS})
#SUBDIRS("src/test") #SUBDIRS("src/test")
if(WIN32) if(WIN32)
find_library(MYSQL_LIBRARIES mariadbclient.lib PATHS "dependencies/mariadb-connector-c/build/libmariadb/Release" REQUIRED) find_library(MYSQL_LIBRARIES mariadbclient.lib PATHS "dependencies/mariadb-connector-c/build/libmariadb/Release" REQUIRED)
#find_library(MYSQL_LIBRARIES_DEBUG mariadbclient.lib PATHS "import/mariadb/lib/debug") #find_library(MYSQL_LIBRARIES_DEBUG mariadbclient.lib PATHS "import/mariadb/lib/debug")
find_library(COMPILED_MARIADB_CLIENT_DEBUG mariadbclient PATHS "dependencies/mariadb-connector-c/build/libmariadb/Debug" REQUIRED) find_library(COMPILED_MARIADB_CLIENT_DEBUG mariadbclient PATHS "dependencies/mariadb-connector-c/build/libmariadb/Debug" REQUIRED)
find_library(IROHA_ED25519 ed25519 PATHS "dependencies/iroha-ed25519/build/Debug" REQUIRED) find_library(IROHA_ED25519 ed25519 PATHS "dependencies/iroha-ed25519/build/Debug" REQUIRED)
set(MYSQL_INCLUDE_DIR "dependencies/mariadb-connector-c/include") set(MYSQL_INCLUDE_DIR "dependencies/mariadb-connector-c/include")
#set(POCO_DEBUG_PATH "I:/FremdCode/C++/poco/win64/lib/Debug") #set(POCO_DEBUG_PATH "I:/FremdCode/C++/poco/win64/lib/Debug")
#find_library(POCO_DEBUG_FOUNDATION PocoFoundationd PocoFoundation PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_FOUNDATION PocoFoundationd PocoFoundation PATHS ${POCO_DEBUG_PATH} REQUIRED)
#find_library(POCO_DEBUG_DATA PocoDatad PocoData PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_DATA PocoDatad PocoData PATHS ${POCO_DEBUG_PATH} REQUIRED)
#find_library(POCO_DEBUG_NET PocoNetd PocoNet PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_NET PocoNetd PocoNet PATHS ${POCO_DEBUG_PATH} REQUIRED)
#find_library(POCO_DEBUG_NET_SSL PocoNetSSLd PocoNetSSL PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_NET_SSL PocoNetSSLd PocoNetSSL PATHS ${POCO_DEBUG_PATH} REQUIRED)
#find_library(POCO_DEBUG_UTIL PocoUtild PocoUtil PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_UTIL PocoUtild PocoUtil PATHS ${POCO_DEBUG_PATH} REQUIRED)
#find_library(POCO_DEBUG_CRYPTO PocoCryptod PocoCrypto PATHS ${POCO_DEBUG_PATH} REQUIRED) #find_library(POCO_DEBUG_CRYPTO PocoCryptod PocoCrypto PATHS ${POCO_DEBUG_PATH} REQUIRED)
#set(POCO_DEBUG_LIBS ${POCO_DEBUG_FOUNDATION} ${POCO_DEBUG_UTIL} ${POCO_DEBUG_DATA} ${POCO_DEBUG_NET} ${POCO_DEBUG_NET_SSL} ${POCO_DEBUG_CRYPTO}) #set(POCO_DEBUG_LIBS ${POCO_DEBUG_FOUNDATION} ${POCO_DEBUG_UTIL} ${POCO_DEBUG_DATA} ${POCO_DEBUG_NET} ${POCO_DEBUG_NET_SSL} ${POCO_DEBUG_CRYPTO})
#include_directories( #include_directories(
# "I:/FremdCode/C++/poco/Foundation/include" # "I:/FremdCode/C++/poco/Foundation/include"
# "I:/FremdCode/C++/poco/Data/include" # "I:/FremdCode/C++/poco/Data/include"
# "I:/FremdCode/C++/poco/Net/include" # "I:/FremdCode/C++/poco/Net/include"
#"I:/FremdCode/C++/poco/NetSSL_Win/include" #"I:/FremdCode/C++/poco/NetSSL_Win/include"
# "I:/FremdCode/C++/poco/NetSSL_OpenSSL/include" # "I:/FremdCode/C++/poco/NetSSL_OpenSSL/include"
# "I:/FremdCode/C++/poco/Crypto/include" # "I:/FremdCode/C++/poco/Crypto/include"
# "I:/FremdCode/C++/poco/Util/include" # "I:/FremdCode/C++/poco/Util/include"
# "I:/FremdCode/C++/ssl/include" # "I:/FremdCode/C++/ssl/include"
#) #)
set(CMAKE_CXX_FLAGS "/MP /EHsc") set(CMAKE_CXX_FLAGS "/MP /EHsc")
#set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") #set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
#set(CMAKE_CXX_FLAGS_RELEASE "-O3") #set(CMAKE_CXX_FLAGS_RELEASE "-O3")
else() else()
find_library(IROHA_ED25519 ed25519 PATHS "dependencies/iroha-ed25519/build" REQUIRED) find_library(IROHA_ED25519 ed25519 PATHS "dependencies/iroha-ed25519/build" REQUIRED)
# set vars for mariadb cmake files # set vars for mariadb cmake files
set(INSTALL_BINDIR "bin") set(INSTALL_BINDIR "bin")
set(INSTALL_PLUGINDIR "bin") set(INSTALL_PLUGINDIR "bin")
add_subdirectory("dependencies/mariadb-connector-c") add_subdirectory("dependencies/mariadb-connector-c")
include_directories( include_directories(
"dependencies/mariadb-connector-c/include" "dependencies/mariadb-connector-c/include"
"build/dependencies/mariadb-connector-c/include" "build/dependencies/mariadb-connector-c/include"
) )
endif() endif()
target_link_libraries(Gradido_LoginServer ${CONAN_LIBS} ${IROHA_ED25519}) target_link_libraries(Gradido_LoginServer ${CONAN_LIBS} ${IROHA_ED25519})
if(WIN32) if(WIN32)
TARGET_LINK_LIBRARIES(Gradido_LoginServer optimized ${MYSQL_LIBRARIES} Shlwapi) TARGET_LINK_LIBRARIES(Gradido_LoginServer optimized ${MYSQL_LIBRARIES} Shlwapi)
TARGET_LINK_LIBRARIES(Gradido_LoginServer debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) TARGET_LINK_LIBRARIES(Gradido_LoginServer debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi)
else() else()
target_link_libraries(Gradido_LoginServer libmariadb -pthread) target_link_libraries(Gradido_LoginServer libmariadb -pthread)
endif() endif()
# install # install
if(UNIX) if(UNIX)
install(TARGETS Gradido_LoginServer RUNTIME DESTINATION /usr/local/bin) install(TARGETS Gradido_LoginServer RUNTIME DESTINATION /usr/local/bin)
#install(FILES lib/libmariadb /usr/local/lib) #install(FILES lib/libmariadb /usr/local/lib)
install(FILES DESTINATION lib COMPONENT libmariadb) install(FILES DESTINATION lib COMPONENT libmariadb)
install(DIRECTORY src/LOCALE DESTINATION /etc/grd_login/ install(DIRECTORY src/LOCALE DESTINATION /etc/grd_login/
FILES_MATCHING PATTERN "*.po(t)") FILES_MATCHING PATTERN "*.po(t)")
endif(UNIX) endif(UNIX)
enable_testing() enable_testing()
# ---------------------- Test ----------------------------------------- # ---------------------- Test -----------------------------------------
#project(Gradido_LoginServer_Test C CXX) #project(Gradido_LoginServer_Test C CXX)
#_TEST_BUILD #_TEST_BUILD
add_executable(Gradido_LoginServer_Test ${LOCAL_SRCS} ${LOCAL_TEST_SRC}) add_executable(Gradido_LoginServer_Test ${LOCAL_SRCS} ${LOCAL_TEST_SRC})
target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD") target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD")
target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} ${IROHA_ED25519}) target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} ${IROHA_ED25519})
if(WIN32) if(WIN32)
TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi) TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi)
TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi)
else() else()
target_link_libraries(Gradido_LoginServer_Test libmariadb -pthread) target_link_libraries(Gradido_LoginServer_Test libmariadb -pthread)
endif() endif()
add_test(NAME main COMMAND Gradido_LoginServer_Test) add_test(NAME main COMMAND Gradido_LoginServer_Test)

View File

@ -1,16 +1,16 @@
CREATE TABLE `users` ( CREATE TABLE `users` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT, `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`email` varchar(191) NOT NULL, `email` varchar(191) NOT NULL,
`first_name` varchar(150) NOT NULL, `first_name` varchar(150) NOT NULL,
`last_name` varchar(255) DEFAULT '', `last_name` varchar(255) DEFAULT '',
`password` bigint unsigned DEFAULT 0, `password` bigint unsigned DEFAULT 0,
`pubkey` binary(32) DEFAULT NULL, `pubkey` binary(32) DEFAULT NULL,
`privkey` binary(80) DEFAULT NULL, `privkey` binary(80) DEFAULT NULL,
`created` datetime NOT NULL DEFAULT current_timestamp(), `created` datetime NOT NULL DEFAULT current_timestamp(),
`email_checked` tinyint NOT NULL DEFAULT 0, `email_checked` tinyint NOT NULL DEFAULT 0,
`passphrase_shown` tinyint NOT NULL DEFAULT 0, `passphrase_shown` tinyint NOT NULL DEFAULT 0,
`language` varchar(4) NOT NULL DEFAULT 'de', `language` varchar(4) NOT NULL DEFAULT 'de',
`disabled` BOOLEAN NULL DEFAULT FALSE, `disabled` BOOLEAN NULL DEFAULT FALSE,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`) UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -1,267 +1,267 @@
#include "Gradido_LoginServer.h" #include "Gradido_LoginServer.h"
#include "ServerConfig.h" #include "ServerConfig.h"
#include "HTTPInterface/PageRequestHandlerFactory.h" #include "HTTPInterface/PageRequestHandlerFactory.h"
#include "JSONInterface/JsonRequestHandlerFactory.h" #include "JSONInterface/JsonRequestHandlerFactory.h"
#include "lib/Profiler.h" #include "lib/Profiler.h"
#include "SingletonManager/ConnectionManager.h" #include "SingletonManager/ConnectionManager.h"
#include "SingletonManager/SessionManager.h" #include "SingletonManager/SessionManager.h"
#include "SingletonManager/EmailManager.h" #include "SingletonManager/EmailManager.h"
#include "controller/User.h" #include "controller/User.h"
#include "Poco/Util/HelpFormatter.h" #include "Poco/Util/HelpFormatter.h"
#include "Poco/Net/ServerSocket.h" #include "Poco/Net/ServerSocket.h"
#include "Poco/Net/HTTPServer.h" #include "Poco/Net/HTTPServer.h"
#include "Poco/Net/SSLManager.h" #include "Poco/Net/SSLManager.h"
#include "Poco/Environment.h" #include "Poco/Environment.h"
#include "Poco/Logger.h" #include "Poco/Logger.h"
#include "Poco/Path.h" #include "Poco/Path.h"
#include "Poco/AsyncChannel.h" #include "Poco/AsyncChannel.h"
#include "Poco/SimpleFileChannel.h" #include "Poco/SimpleFileChannel.h"
#include "Poco/ConsoleChannel.h" #include "Poco/ConsoleChannel.h"
#include "Poco/SplitterChannel.h" #include "Poco/SplitterChannel.h"
#include "MySQL/Poco/Connector.h" #include "MySQL/Poco/Connector.h"
#include <sodium.h> #include <sodium.h>
Gradido_LoginServer::Gradido_LoginServer() Gradido_LoginServer::Gradido_LoginServer()
: _helpRequested(false) : _helpRequested(false)
{ {
} }
Gradido_LoginServer::~Gradido_LoginServer() Gradido_LoginServer::~Gradido_LoginServer()
{ {
} }
void Gradido_LoginServer::initialize(Application& self) void Gradido_LoginServer::initialize(Application& self)
{ {
loadConfiguration(); // load default configuration files, if present loadConfiguration(); // load default configuration files, if present
ServerApplication::initialize(self); ServerApplication::initialize(self);
} }
void Gradido_LoginServer::uninitialize() void Gradido_LoginServer::uninitialize()
{ {
ServerApplication::uninitialize(); ServerApplication::uninitialize();
} }
void Gradido_LoginServer::defineOptions(Poco::Util::OptionSet& options) void Gradido_LoginServer::defineOptions(Poco::Util::OptionSet& options)
{ {
ServerApplication::defineOptions(options); ServerApplication::defineOptions(options);
/*options.addOption( /*options.addOption(
Poco::Util::Option("help", "h", "display help information on command line arguments") Poco::Util::Option("help", "h", "display help information on command line arguments")
.required(false) .required(false)
.repeatable(false));*/ .repeatable(false));*/
options.addOption( options.addOption(
Poco::Util::Option("config", "c", "use non default config file (default is /etc/grd_login.properties)", false) Poco::Util::Option("config", "c", "use non default config file (default is /etc/grd_login.properties)", false)
.repeatable(false) .repeatable(false)
.argument("Gradido_LoginServer.properties", true) .argument("Gradido_LoginServer.properties", true)
.callback(Poco::Util::OptionCallback<Gradido_LoginServer>(this, &Gradido_LoginServer::handleOption))); .callback(Poco::Util::OptionCallback<Gradido_LoginServer>(this, &Gradido_LoginServer::handleOption)));
} }
void Gradido_LoginServer::handleOption(const std::string& name, const std::string& value) void Gradido_LoginServer::handleOption(const std::string& name, const std::string& value)
{ {
//printf("handle option: %s with value: %s\n", name.data(), value.data()); //printf("handle option: %s with value: %s\n", name.data(), value.data());
if (name == "config") { if (name == "config") {
mConfigPath = value; mConfigPath = value;
return; return;
} }
ServerApplication::handleOption(name, value); ServerApplication::handleOption(name, value);
if (name == "help") _helpRequested = true; if (name == "help") _helpRequested = true;
} }
void Gradido_LoginServer::displayHelp() void Gradido_LoginServer::displayHelp()
{ {
Poco::Util::HelpFormatter helpFormatter(options()); Poco::Util::HelpFormatter helpFormatter(options());
helpFormatter.setCommand(commandName()); helpFormatter.setCommand(commandName());
helpFormatter.setUsage("OPTIONS"); helpFormatter.setUsage("OPTIONS");
helpFormatter.setHeader("Gradido Login Server"); helpFormatter.setHeader("Gradido Login Server");
helpFormatter.format(std::cout); helpFormatter.format(std::cout);
} }
void Gradido_LoginServer::createConsoleFileAsyncLogger(std::string name, std::string filePath) void Gradido_LoginServer::createConsoleFileAsyncLogger(std::string name, std::string filePath)
{ {
Poco::AutoPtr<Poco::ConsoleChannel> logConsoleChannel(new Poco::ConsoleChannel); Poco::AutoPtr<Poco::ConsoleChannel> logConsoleChannel(new Poco::ConsoleChannel);
Poco::AutoPtr<Poco::SimpleFileChannel> logFileChannel(new Poco::SimpleFileChannel(filePath)); Poco::AutoPtr<Poco::SimpleFileChannel> logFileChannel(new Poco::SimpleFileChannel(filePath));
logFileChannel->setProperty("rotation", "500 K"); logFileChannel->setProperty("rotation", "500 K");
Poco::AutoPtr<Poco::SplitterChannel> logSplitter(new Poco::SplitterChannel); Poco::AutoPtr<Poco::SplitterChannel> logSplitter(new Poco::SplitterChannel);
logSplitter->addChannel(logConsoleChannel); logSplitter->addChannel(logConsoleChannel);
logSplitter->addChannel(logFileChannel); logSplitter->addChannel(logFileChannel);
Poco::AutoPtr<Poco::AsyncChannel> logAsyncChannel(new Poco::AsyncChannel(logSplitter)); Poco::AutoPtr<Poco::AsyncChannel> logAsyncChannel(new Poco::AsyncChannel(logSplitter));
Poco::Logger& log = Poco::Logger::get(name); Poco::Logger& log = Poco::Logger::get(name);
log.setChannel(logAsyncChannel); log.setChannel(logAsyncChannel);
log.setLevel("information"); log.setLevel("information");
} }
int Gradido_LoginServer::main(const std::vector<std::string>& args) int Gradido_LoginServer::main(const std::vector<std::string>& args)
{ {
Profiler usedTime; Profiler usedTime;
if (_helpRequested) if (_helpRequested)
{ {
displayHelp(); displayHelp();
} }
else else
{ {
// ********** logging ************************************ // ********** logging ************************************
std::string log_Path = "/var/log/grd_login/"; std::string log_Path = "/var/log/grd_login/";
//#ifdef _WIN32 //#ifdef _WIN32
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
log_Path = "./"; log_Path = "./";
#endif #endif
// init speed logger // init speed logger
Poco::AutoPtr<Poco::SimpleFileChannel> speedLogFileChannel(new Poco::SimpleFileChannel(log_Path + "speedLog.txt")); Poco::AutoPtr<Poco::SimpleFileChannel> speedLogFileChannel(new Poco::SimpleFileChannel(log_Path + "speedLog.txt"));
/* /*
The optional log file rotation mode: The optional log file rotation mode:
never: no rotation (default) never: no rotation (default)
<n>: rotate if file size exceeds <n> bytes <n>: rotate if file size exceeds <n> bytes
<n> K: rotate if file size exceeds <n> Kilobytes <n> K: rotate if file size exceeds <n> Kilobytes
<n> M: rotate if file size exceeds <n> Megabytes <n> M: rotate if file size exceeds <n> Megabytes
*/ */
speedLogFileChannel->setProperty("rotation", "500 K"); speedLogFileChannel->setProperty("rotation", "500 K");
Poco::AutoPtr<Poco::AsyncChannel> speedLogAsyncChannel(new Poco::AsyncChannel(speedLogFileChannel)); Poco::AutoPtr<Poco::AsyncChannel> speedLogAsyncChannel(new Poco::AsyncChannel(speedLogFileChannel));
Poco::Logger& speedLogger = Poco::Logger::get("SpeedLog"); Poco::Logger& speedLogger = Poco::Logger::get("SpeedLog");
speedLogger.setChannel(speedLogAsyncChannel); speedLogger.setChannel(speedLogAsyncChannel);
speedLogger.setLevel("information"); speedLogger.setLevel("information");
// logging for request handling // logging for request handling
createConsoleFileAsyncLogger("requestLog", log_Path + "requestLog.txt"); createConsoleFileAsyncLogger("requestLog", log_Path + "requestLog.txt");
// error logging // error logging
createConsoleFileAsyncLogger("errorLog", log_Path + "errorLog.txt"); createConsoleFileAsyncLogger("errorLog", log_Path + "errorLog.txt");
Poco::Logger& errorLog = Poco::Logger::get("errorLog"); Poco::Logger& errorLog = Poco::Logger::get("errorLog");
createConsoleFileAsyncLogger("emailLog", log_Path + "emailLog.txt"); createConsoleFileAsyncLogger("emailLog", log_Path + "emailLog.txt");
// *************** load from config ******************************************** // *************** load from config ********************************************
std::string cfg_Path = Poco::Path::config() + "grd_login/grd_login.properties"; std::string cfg_Path = Poco::Path::config() + "grd_login/grd_login.properties";
if (mConfigPath != "") { if (mConfigPath != "") {
cfg_Path = mConfigPath; cfg_Path = mConfigPath;
} }
try { try {
loadConfiguration(cfg_Path); loadConfiguration(cfg_Path);
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
errorLog.error("error loading config: %s from path: %s", ex.displayText(), cfg_Path); errorLog.error("error loading config: %s from path: %s", ex.displayText(), cfg_Path);
} }
unsigned short port = (unsigned short)config().getInt("HTTPServer.port", 9980); unsigned short port = (unsigned short)config().getInt("HTTPServer.port", 9980);
unsigned short json_port = (unsigned short)config().getInt("JSONServer.port", 1201); unsigned short json_port = (unsigned short)config().getInt("JSONServer.port", 1201);
//printf("show mnemonic list: \n"); //printf("show mnemonic list: \n");
//printf(ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER].getCompleteWordList().data()); //printf(ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER].getCompleteWordList().data());
if (!ServerConfig::initServerCrypto(config())) { if (!ServerConfig::initServerCrypto(config())) {
//printf("[Gradido_LoginServer::%s] error init server crypto\n", __FUNCTION__); //printf("[Gradido_LoginServer::%s] error init server crypto\n", __FUNCTION__);
errorLog.error("[Gradido_LoginServer::main] error init server crypto"); errorLog.error("[Gradido_LoginServer::main] error init server crypto");
return Application::EXIT_CONFIG; return Application::EXIT_CONFIG;
} }
// first check time for crypto // first check time for crypto
auto testUser = new User("email@google.de", "Max", "Mustermann"); auto testUser = new User("email@google.de", "Max", "Mustermann");
Profiler timeUsed; Profiler timeUsed;
testUser->validatePwd("haz27Newpassword", nullptr); testUser->validatePwd("haz27Newpassword", nullptr);
ServerConfig::g_FakeLoginSleepTime = (int)std::round(timeUsed.millis()); ServerConfig::g_FakeLoginSleepTime = (int)std::round(timeUsed.millis());
delete testUser; delete testUser;
Poco::Int64 i1 = randombytes_random(); Poco::Int64 i1 = randombytes_random();
Poco::Int64 i2 = randombytes_random(); Poco::Int64 i2 = randombytes_random();
ServerConfig::g_ServerKeySeed->put(1, i1 | (i2 << 8)); ServerConfig::g_ServerKeySeed->put(1, i1 | (i2 << 8));
ServerConfig::initEMailAccount(config()); ServerConfig::initEMailAccount(config());
EmailManager::getInstance()->init(config()); EmailManager::getInstance()->init(config());
// start cpu scheduler // start cpu scheduler
uint8_t worker_count = Poco::Environment::processorCount() * 2; uint8_t worker_count = Poco::Environment::processorCount() * 2;
ServerConfig::g_CPUScheduler = new UniLib::controller::CPUSheduler(worker_count, "Default Worker"); ServerConfig::g_CPUScheduler = new UniLib::controller::CPUSheduler(worker_count, "Default Worker");
ServerConfig::g_CryptoCPUScheduler = new UniLib::controller::CPUSheduler(2, "Crypto Worker"); ServerConfig::g_CryptoCPUScheduler = new UniLib::controller::CPUSheduler(2, "Crypto Worker");
// load up connection configs // load up connection configs
// register MySQL connector // register MySQL connector
Poco::Data::MySQL::Connector::registerConnector(); Poco::Data::MySQL::Connector::registerConnector();
//Poco::Data::MySQL::Connector::KEY; //Poco::Data::MySQL::Connector::KEY;
auto conn = ConnectionManager::getInstance(); auto conn = ConnectionManager::getInstance();
//conn->setConnection() //conn->setConnection()
//printf("try connect login server mysql db\n"); //printf("try connect login server mysql db\n");
try { try {
conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_LOGIN_SERVER); conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_LOGIN_SERVER);
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
// maybe we in docker environment and db needs some time to start up // maybe we in docker environment and db needs some time to start up
// let's wait 10 seconds // let's wait 10 seconds
int count = 10; int count = 10;
while (count > 0) { while (count > 0) {
printf("\rwait on mysql/mariadb %d seconds...", count); printf("\rwait on mysql/mariadb %d seconds...", count);
count--; count--;
Poco::Thread::sleep(1000); Poco::Thread::sleep(1000);
} }
conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_LOGIN_SERVER); conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_LOGIN_SERVER);
} }
//printf("try connect php server mysql \n"); //printf("try connect php server mysql \n");
//conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_PHP_SERVER); //conn->setConnectionsFromConfig(config(), CONNECTION_MYSQL_PHP_SERVER);
SessionManager::getInstance()->init(); SessionManager::getInstance()->init();
// put urandom on linux servers // put urandom on linux servers
//srand(); //srand();
Poco::Net::initializeSSL(); Poco::Net::initializeSSL();
if(!ServerConfig::initSSLClientContext()) { if(!ServerConfig::initSSLClientContext()) {
//printf("[Gradido_LoginServer::%s] error init server SSL Client\n", __FUNCTION__); //printf("[Gradido_LoginServer::%s] error init server SSL Client\n", __FUNCTION__);
errorLog.error("[Gradido_LoginServer::main] error init server SSL Client\n"); errorLog.error("[Gradido_LoginServer::main] error init server SSL Client\n");
return Application::EXIT_CONFIG; return Application::EXIT_CONFIG;
} }
// schedule email verification resend // schedule email verification resend
controller::User::checkIfVerificationEmailsShouldBeResend(ServerConfig::g_CronJobsTimer); controller::User::checkIfVerificationEmailsShouldBeResend(ServerConfig::g_CronJobsTimer);
// HTTP Interface Server // HTTP Interface Server
// set-up a server socket // set-up a server socket
Poco::Net::ServerSocket svs(port); Poco::Net::ServerSocket svs(port);
// set-up a HTTPServer instance // set-up a HTTPServer instance
Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool(); Poco::ThreadPool& pool = Poco::ThreadPool::defaultPool();
Poco::Net::HTTPServer srv(new PageRequestHandlerFactory, svs, new Poco::Net::HTTPServerParams); Poco::Net::HTTPServer srv(new PageRequestHandlerFactory, svs, new Poco::Net::HTTPServerParams);
ServerConfig::g_ServerKeySeed->put(7, 918276611); ServerConfig::g_ServerKeySeed->put(7, 918276611);
// start the HTTPServer // start the HTTPServer
srv.start(); srv.start();
// JSON Interface Server // JSON Interface Server
Poco::Net::ServerSocket json_svs(json_port); Poco::Net::ServerSocket json_svs(json_port);
Poco::Net::HTTPServer json_srv(new JsonRequestHandlerFactory, json_svs, new Poco::Net::HTTPServerParams); Poco::Net::HTTPServer json_srv(new JsonRequestHandlerFactory, json_svs, new Poco::Net::HTTPServerParams);
// start the json server // start the json server
json_srv.start(); json_srv.start();
printf("[Gradido_LoginServer::main] started in %s\n", usedTime.string().data()); printf("[Gradido_LoginServer::main] started in %s\n", usedTime.string().data());
// wait for CTRL-C or kill // wait for CTRL-C or kill
waitForTerminationRequest(); waitForTerminationRequest();
// Stop the HTTPServer // Stop the HTTPServer
srv.stop(); srv.stop();
// Stop the json server // Stop the json server
json_srv.stop(); json_srv.stop();
ServerConfig::unload(); ServerConfig::unload();
Poco::Net::uninitializeSSL(); Poco::Net::uninitializeSSL();
// Optional: Delete all global objects allocated by libprotobuf. // Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary(); google::protobuf::ShutdownProtobufLibrary();
} }
return Application::EXIT_OK; return Application::EXIT_OK;
} }

View File

@ -1,42 +1,42 @@
#ifndef Gradido_LoginServer_INCLUDED #ifndef Gradido_LoginServer_INCLUDED
#define Gradido_LoginServer_INCLUDED #define Gradido_LoginServer_INCLUDED
#include "Poco/Util/ServerApplication.h" #include "Poco/Util/ServerApplication.h"
class Gradido_LoginServer : public Poco::Util::ServerApplication class Gradido_LoginServer : public Poco::Util::ServerApplication
{ {
/// The main application class. /// The main application class.
/// ///
/// This class handles command-line arguments and /// This class handles command-line arguments and
/// configuration files. /// configuration files.
/// Start the Gradido_LoginServer executable with the help /// Start the Gradido_LoginServer executable with the help
/// option (/help on Windows, --help on Unix) for /// option (/help on Windows, --help on Unix) for
/// the available command line options. /// the available command line options.
/// ///
public: public:
Gradido_LoginServer(); Gradido_LoginServer();
~Gradido_LoginServer(); ~Gradido_LoginServer();
protected: protected:
void initialize(Application& self); void initialize(Application& self);
void uninitialize(); void uninitialize();
void defineOptions(Poco::Util::OptionSet& options); void defineOptions(Poco::Util::OptionSet& options);
void handleOption(const std::string& name, const std::string& value); void handleOption(const std::string& name, const std::string& value);
void displayHelp(); void displayHelp();
int main(const std::vector<std::string>& args); int main(const std::vector<std::string>& args);
void createConsoleFileAsyncLogger(std::string name, std::string filePath); void createConsoleFileAsyncLogger(std::string name, std::string filePath);
private: private:
bool _helpRequested; bool _helpRequested;
std::string mConfigPath; std::string mConfigPath;
}; };
#endif //Gradido_LoginServer_INCLUDED #endif //Gradido_LoginServer_INCLUDED

View File

@ -1,365 +1,365 @@
#include "LoginPage.h" #include "LoginPage.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTMLForm.h" #include "Poco/Net/HTMLForm.h"
#include "Poco/DeflatingStream.h" #include "Poco/DeflatingStream.h"
#line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
#include "../gettext.h" #include "../gettext.h"
#include "Poco/Net/HTTPCookie.h" #include "Poco/Net/HTTPCookie.h"
#include "Poco/Net/HTTPServerParams.h" #include "Poco/Net/HTTPServerParams.h"
#include "Poco/Logger.h" #include "Poco/Logger.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/LanguageManager.h" #include "../SingletonManager/LanguageManager.h"
#include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/ErrorManager.h"
#line 1 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 1 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
#include "../ServerConfig.h" #include "../ServerConfig.h"
LoginPage::LoginPage(Session* arg): LoginPage::LoginPage(Session* arg):
SessionHTTPRequestHandler(arg) SessionHTTPRequestHandler(arg)
{ {
} }
void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
{ {
response.setChunkedTransferEncoding(true); response.setChunkedTransferEncoding(true);
response.setContentType("text/html"); response.setContentType("text/html");
bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); bool _compressResponse(request.hasToken("Accept-Encoding", "gzip"));
if (_compressResponse) response.set("Content-Encoding", "gzip"); if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream()); Poco::Net::HTMLForm form(request, request.stream());
#line 18 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 18 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
const char* pageName = "Login"; const char* pageName = "Login";
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
auto lm = LanguageManager::getInstance(); auto lm = LanguageManager::getInstance();
auto em = ErrorManager::getInstance(); auto em = ErrorManager::getInstance();
auto lang = chooseLanguage(request); auto lang = chooseLanguage(request);
//printf("choose language return: %d\n", lang); //printf("choose language return: %d\n", lang);
auto langCatalog = lm->getFreeCatalog(lang); auto langCatalog = lm->getFreeCatalog(lang);
std::string presetEmail(""); std::string presetEmail("");
if(mSession && mSession->getUser()) { if(mSession && mSession->getUser()) {
presetEmail = mSession->getUser()->getEmail(); presetEmail = mSession->getUser()->getEmail();
} }
if(!form.empty()) { if(!form.empty()) {
bool langUpdatedByBtn = false; bool langUpdatedByBtn = false;
auto langBtn = form.get("lang", ""); auto langBtn = form.get("lang", "");
if(langBtn != "") { if(langBtn != "") {
langUpdatedByBtn = true; langUpdatedByBtn = true;
} }
/* /*
auto langInput = form.get("lang", ""); auto langInput = form.get("lang", "");
auto updatedLang = LANG_NULL; auto updatedLang = LANG_NULL;
if(langBtn != "") { if(langBtn != "") {
updatedLang = chooseLanguage(request, langBtn); updatedLang = chooseLanguage(request, langBtn);
langUpdatedByBtn = true; langUpdatedByBtn = true;
} else if(langInput != "") { } else if(langInput != "") {
updatedLang = chooseLanguage(request, langInput); updatedLang = chooseLanguage(request, langInput);
} }
if(updatedLang != LANG_NULL && updatedLang != lang) { if(updatedLang != LANG_NULL && updatedLang != lang) {
lang = updatedLang; lang = updatedLang;
langCatalog = lm->getFreeCatalog(lang); langCatalog = lm->getFreeCatalog(lang);
} }
*/ */
auto email = form.get("login-email", ""); auto email = form.get("login-email", "");
auto password = form.get("login-password", ""); auto password = form.get("login-password", "");
if(email != "" && password != "") { if(email != "" && password != "") {
//auto session = sm->getSession(request); //auto session = sm->getSession(request);
//if(!mSession) mSession = sm->findByEmail(email); //if(!mSession) mSession = sm->findByEmail(email);
if(!mSession) { if(!mSession) {
mSession = sm->getNewSession(); mSession = sm->getNewSession();
mSession->setLanguageCatalog(langCatalog); mSession->setLanguageCatalog(langCatalog);
// get language // get language
// first check url, second check language header // first check url, second check language header
// for debugging client ip // for debugging client ip
auto client_host = request.clientAddress().host(); auto client_host = request.clientAddress().host();
//auto client_ip = request.clientAddress(); //auto client_ip = request.clientAddress();
// X-Real-IP forwarded ip from nginx config // X-Real-IP forwarded ip from nginx config
auto client_host_string = request.get("X-Real-IP", client_host.toString()); auto client_host_string = request.get("X-Real-IP", client_host.toString());
std::string clientIpString = "client ip: "; std::string clientIpString = "client ip: ";
client_host = Poco::Net::IPAddress(client_host_string); client_host = Poco::Net::IPAddress(client_host_string);
clientIpString += client_host_string; clientIpString += client_host_string;
Poco::Logger::get("requestLog").information(clientIpString); Poco::Logger::get("requestLog").information(clientIpString);
// debugging end // debugging end
mSession->setClientIp(client_host); mSession->setClientIp(client_host);
response.addCookie(mSession->getLoginCookie()); response.addCookie(mSession->getLoginCookie());
} else { } else {
langCatalog = mSession->getLanguageCatalog(); langCatalog = mSession->getLanguageCatalog();
} }
UserStates user_state; UserStates user_state;
try { try {
user_state = mSession->loadUser(email, password); user_state = mSession->loadUser(email, password);
} catch (Poco::Exception& ex) { } catch (Poco::Exception& ex) {
addError(new ParamError("login", "exception by calling loadUser: ", ex.displayText())); addError(new ParamError("login", "exception by calling loadUser: ", ex.displayText()));
sendErrorsAsEmail(); sendErrorsAsEmail();
addError(new Error("Error", "Intern Server error, please try again later")); addError(new Error("Error", "Intern Server error, please try again later"));
} }
auto user = mSession->getNewUser(); auto user = mSession->getNewUser();
if(user_state >= USER_LOADED_FROM_DB && !user.isNull() && !user->getModel()->getPublicKey()) { if(user_state >= USER_LOADED_FROM_DB && !user.isNull() && !user->getModel()->getPublicKey()) {
if(mSession->generateKeys(true, true)) { if(mSession->generateKeys(true, true)) {
user_state = USER_COMPLETE; user_state = USER_COMPLETE;
if(user->getModel()->isDisabled()) { if(user->getModel()->isDisabled()) {
user_state = USER_DISABLED; user_state = USER_DISABLED;
} }
} }
} else { } else {
//printf("pubkey exist: %p\n",user->getModel()->getPublicKey()); //printf("pubkey exist: %p\n",user->getModel()->getPublicKey());
} }
getErrors(mSession); getErrors(mSession);
auto uri_start = request.serverParams().getServerName(); auto uri_start = request.serverParams().getServerName();
auto lastExternReferer = mSession->getLastReferer(); auto lastExternReferer = mSession->getLastReferer();
printf("user_state: %d\n", user_state); printf("user_state: %d\n", user_state);
switch(user_state) { switch(user_state) {
case USER_EMPTY: case USER_EMPTY:
case USER_PASSWORD_INCORRECT: case USER_PASSWORD_INCORRECT:
addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!")), false); addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!")), false);
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
break; break;
case USER_PASSWORD_ENCRYPTION_IN_PROCESS: case USER_PASSWORD_ENCRYPTION_IN_PROCESS:
addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut.")), false); addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut.")), false);
break; break;
case USER_KEYS_DONT_MATCH: case USER_KEYS_DONT_MATCH:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it."))); addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it.")));
break; break;
case USER_DISABLED: case USER_DISABLED:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Benutzer ist deaktiviert, kein Login möglich!"))); addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Benutzer ist deaktiviert, kein Login möglich!")));
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
break; break;
case USER_NO_PRIVATE_KEY: case USER_NO_PRIVATE_KEY:
case USER_COMPLETE: case USER_COMPLETE:
case USER_EMAIL_NOT_ACTIVATED: case USER_EMAIL_NOT_ACTIVATED:
auto referer = request.find("Referer"); auto referer = request.find("Referer");
std::string refererString; std::string refererString;
if (referer != request.end()) { if (referer != request.end()) {
refererString = referer->second; refererString = referer->second;
} }
if(lastExternReferer != "") { if(lastExternReferer != "") {
//printf("redirect to: %s\n", lastExternReferer.data()); //printf("redirect to: %s\n", lastExternReferer.data());
response.redirect(lastExternReferer); response.redirect(lastExternReferer);
} else if(refererString != "" && } else if(refererString != "" &&
refererString.find("login") == std::string::npos && refererString.find("login") == std::string::npos &&
refererString.find("logout") == std::string::npos && refererString.find("logout") == std::string::npos &&
refererString.find("user_delete") == std::string::npos && refererString.find("user_delete") == std::string::npos &&
refererString != ServerConfig::g_serverPath + request.getURI()) { refererString != ServerConfig::g_serverPath + request.getURI()) {
std::string uri = request.getURI(); std::string uri = request.getURI();
printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data()); printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data());
response.redirect(refererString); response.redirect(refererString);
} else { } else {
//printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data()); //printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data());
response.redirect(ServerConfig::g_php_serverPath + "/"); response.redirect(ServerConfig::g_php_serverPath + "/");
} }
return; return;
} }
} else if(!langUpdatedByBtn) { } else if(!langUpdatedByBtn) {
addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("Username and password are needed!")), false); addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("Username and password are needed!")), false);
} }
} else { } else {
// on enter login page with empty form // on enter login page with empty form
//auto session = sm->getSession(request); //auto session = sm->getSession(request);
// remove old cookies and session if exist // remove old cookies and session if exist
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
} }
#line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
bool withMaterialIcons = false; bool withMaterialIcons = false;
std::ostream& _responseStream = response.send(); std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n"; responseStream << "\n";
// begin include header.cpsp // begin include header.cpsp
responseStream << "\n"; responseStream << "\n";
responseStream << "<!DOCTYPE html>\n"; responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n"; responseStream << "<html>\n";
responseStream << "<head>\n"; responseStream << "<head>\n";
responseStream << "<meta charset=\"UTF-8\">\n"; responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n"; responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
responseStream << "<title>Gradido Login Server: "; responseStream << "<title>Gradido Login Server: ";
#line 11 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 11 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( pageName ); responseStream << ( pageName );
responseStream << "</title>\n"; responseStream << "</title>\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\""; responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 12 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 12 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/main.css\">\n"; responseStream << "css/main.css\">\n";
#line 13 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 13 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
if(withMaterialIcons) { responseStream << "\n"; if(withMaterialIcons) { responseStream << "\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\""; responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 14 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 14 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/materialdesignicons.min.css\">\n"; responseStream << "css/materialdesignicons.min.css\">\n";
#line 15 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 15 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
} responseStream << "\n"; } responseStream << "\n";
responseStream << "</head>\n"; responseStream << "</head>\n";
responseStream << "<body>\n"; responseStream << "<body>\n";
responseStream << " <div class=\"layout\">\n"; responseStream << " <div class=\"layout\">\n";
responseStream << " <div class=\"center-form-single\">\n"; responseStream << " <div class=\"center-form-single\">\n";
responseStream << " <div class=\"center-form-header\">\n"; responseStream << " <div class=\"center-form-header\">\n";
responseStream << " <a href=\""; responseStream << " <a href=\"";
#line 21 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 21 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"center-logo\">\n"; responseStream << "\" class=\"center-logo\">\n";
responseStream << " <picture>\n"; responseStream << " <picture>\n";
responseStream << " <source srcset=\""; responseStream << " <source srcset=\"";
#line 23 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 23 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n"; responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
responseStream << " <source srcset=\""; responseStream << " <source srcset=\"";
#line 24 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 24 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" type=\"image/png\">\n"; responseStream << "img/logo_schrift.png\" type=\"image/png\">\n";
responseStream << " <img src=\""; responseStream << " <img src=\"";
#line 25 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp" #line 25 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath ); responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n"; responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
responseStream << " </picture>\n"; responseStream << " </picture>\n";
responseStream << " </a>\n"; responseStream << " </a>\n";
responseStream << " </div>"; responseStream << " </div>";
// end include header.cpsp // end include header.cpsp
responseStream << "\n"; responseStream << "\n";
#line 175 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 175 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( getErrorsHtml() ); responseStream << ( getErrorsHtml() );
responseStream << "\n"; responseStream << "\n";
responseStream << "<!--<input type=\"hidden\" name=\"lang\" value=\""; responseStream << "<!--<input type=\"hidden\" name=\"lang\" value=\"";
#line 176 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 176 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( LanguageManager::keyForLanguage(lang) ); responseStream << ( LanguageManager::keyForLanguage(lang) );
responseStream << "\">-->\n"; responseStream << "\">-->\n";
responseStream << "<div class=\"center-form-container\">\n"; responseStream << "<div class=\"center-form-container\">\n";
responseStream << " "; responseStream << " ";
// begin include flags.cpsp // begin include flags.cpsp
responseStream << "<div class=\"center-form-selectors\">\n"; responseStream << "<div class=\"center-form-selectors\">\n";
responseStream << "<form method=\"GET\" action=\"\">\n"; responseStream << "<form method=\"GET\" action=\"\">\n";
responseStream << "\t<button id=\"flag-england\" name=\"lang\" value=\"en\" title=\"English\" type=\"submit\" "; responseStream << "\t<button id=\"flag-england\" name=\"lang\" value=\"en\" title=\"English\" type=\"submit\" ";
#line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
if(lang != LANG_EN) { responseStream << "class=\"flag-btn\""; if(lang != LANG_EN) { responseStream << "class=\"flag-btn\"";
#line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 3 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
} }
else { responseStream << "class=\"flag-btn\" disabled"; else { responseStream << "class=\"flag-btn\" disabled";
#line 4 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 4 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
} responseStream << ">\n"; } responseStream << ">\n";
responseStream << "\t <span class=\"flag flag-england\"></span>\n"; responseStream << "\t <span class=\"flag flag-england\"></span>\n";
responseStream << "\t</button>\n"; responseStream << "\t</button>\n";
responseStream << "\t<button id=\"flag-germany\" name=\"lang\" value=\"de\" title=\"Deutsch\" type=\"submit\" "; responseStream << "\t<button id=\"flag-germany\" name=\"lang\" value=\"de\" title=\"Deutsch\" type=\"submit\" ";
#line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
if(lang != LANG_DE) { responseStream << "class=\"flag-btn\""; if(lang != LANG_DE) { responseStream << "class=\"flag-btn\"";
#line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 7 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
} }
else { responseStream << "class=\"flag-btn\" disabled"; else { responseStream << "class=\"flag-btn\" disabled";
#line 8 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp" #line 8 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\flags.cpsp"
} responseStream << ">\n"; } responseStream << ">\n";
responseStream << "\t <span class=\"flag flag-germany\"></span>\n"; responseStream << "\t <span class=\"flag flag-germany\"></span>\n";
responseStream << "\t</button>\n"; responseStream << "\t</button>\n";
responseStream << "</form>\n"; responseStream << "</form>\n";
responseStream << "</div>"; responseStream << "</div>";
// end include flags.cpsp // end include flags.cpsp
responseStream << "\n"; responseStream << "\n";
responseStream << " <div class=\"center-form-form\">\n"; responseStream << " <div class=\"center-form-form\">\n";
responseStream << "\t\t<form action=\""; responseStream << "\t\t<form action=\"";
#line 180 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 180 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_serverPath ); responseStream << ( ServerConfig::g_serverPath );
responseStream << "/\" method=\"POST\">\n"; responseStream << "/\" method=\"POST\">\n";
responseStream << "\t\t\t<input class=\"form-control\" type=\"text\" name=\"login-email\" placeholder=\""; responseStream << "\t\t\t<input class=\"form-control\" type=\"text\" name=\"login-email\" placeholder=\"";
#line 181 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 181 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("E-Mail") ); responseStream << ( langCatalog->gettext("E-Mail") );
responseStream << "\" value=\""; responseStream << "\" value=\"";
#line 181 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 181 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( presetEmail ); responseStream << ( presetEmail );
responseStream << "\"/>\n"; responseStream << "\"/>\n";
responseStream << "\t\t\t<input class=\"form-control\" type=\"password\" name=\"login-password\" placeholder=\""; responseStream << "\t\t\t<input class=\"form-control\" type=\"password\" name=\"login-password\" placeholder=\"";
#line 182 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 182 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Password") ); responseStream << ( langCatalog->gettext("Password") );
responseStream << "\" />\n"; responseStream << "\" />\n";
responseStream << "\t\t <button type=\"submit\" name=\"submit\" class=\"center-form-submit form-button\">"; responseStream << "\t\t <button type=\"submit\" name=\"submit\" class=\"center-form-submit form-button\">";
#line 183 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 183 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext(" Login ") ); responseStream << ( langCatalog->gettext(" Login ") );
responseStream << "</button>\n"; responseStream << "</button>\n";
responseStream << "\t\t</form>\n"; responseStream << "\t\t</form>\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << " <div class=\"center-form-bottom\">\n"; responseStream << " <div class=\"center-form-bottom\">\n";
responseStream << " <div class=\"signup-link\">\n"; responseStream << " <div class=\"signup-link\">\n";
responseStream << "\t <p>"; responseStream << "\t <p>";
#line 188 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 188 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") ); responseStream << ( langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") );
responseStream << "</p>\n"; responseStream << "</p>\n";
responseStream << "\t <a href=\"https://elopage.com/s/gradido/registration-de/payment?locale=de\">\n"; responseStream << "\t <a href=\"https://elopage.com/s/gradido/registration-de/payment?locale=de\">\n";
responseStream << "\t\t\t"; responseStream << "\t\t\t";
#line 190 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 190 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Create New Account") ); responseStream << ( langCatalog->gettext("Create New Account") );
responseStream << "\n"; responseStream << "\n";
responseStream << "\t\t </a>\n"; responseStream << "\t\t </a>\n";
responseStream << "\t </div>\n"; responseStream << "\t </div>\n";
responseStream << "\t\t<div class=\"reset-pwd-link\">\n"; responseStream << "\t\t<div class=\"reset-pwd-link\">\n";
responseStream << "\t\t\t<a href=\""; responseStream << "\t\t\t<a href=\"";
#line 194 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 194 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_serverPath ); responseStream << ( ServerConfig::g_serverPath );
responseStream << "/resetPassword\">"; responseStream << "/resetPassword\">";
#line 194 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp" #line 194 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Passwort vergessen") ); responseStream << ( langCatalog->gettext("Passwort vergessen") );
responseStream << "</a>\n"; responseStream << "</a>\n";
responseStream << "\t\t</div>\n"; responseStream << "\t\t</div>\n";
responseStream << "\t</div>\n"; responseStream << "\t</div>\n";
responseStream << "</div>\n"; responseStream << "</div>\n";
responseStream << "<p>&nbsp;</p>\n"; responseStream << "<p>&nbsp;</p>\n";
responseStream << "<div class=\"container\">\n"; responseStream << "<div class=\"container\">\n";
responseStream << "\t<a href=\"https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing\" target=\"_blank\">Zum Whitepaper</a>\n"; responseStream << "\t<a href=\"https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing\" target=\"_blank\">Zum Whitepaper</a>\n";
responseStream << "\t<br>\n"; responseStream << "\t<br>\n";
responseStream << "\t<br>\n"; responseStream << "\t<br>\n";
responseStream << "\t<a href=\"https://docs.google.com/document/d/1kcX1guOi6tDgnFHD9tf7fB_MneKTx-0nHJxzdN8ygNs/edit?usp=sharing\" target=\"_blank\">To the Whitepaper</a>\n"; responseStream << "\t<a href=\"https://docs.google.com/document/d/1kcX1guOi6tDgnFHD9tf7fB_MneKTx-0nHJxzdN8ygNs/edit?usp=sharing\" target=\"_blank\">To the Whitepaper</a>\n";
responseStream << "</div>\n"; responseStream << "</div>\n";
// begin include footer.cpsp // begin include footer.cpsp
responseStream << " <div class=\"center-bottom\">\n"; responseStream << " <div class=\"center-bottom\">\n";
responseStream << " <p>Copyright © Gradido 2020</p>\n"; responseStream << " <p>Copyright © Gradido 2020</p>\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << " <div class=\"bottomleft\">\n"; responseStream << " <div class=\"bottomleft\">\n";
responseStream << " "; responseStream << " ";
#line 6 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\footer.cpsp" #line 6 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( mTimeProfiler.string() ); responseStream << ( mTimeProfiler.string() );
responseStream << "\n"; responseStream << "\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << " <div class=\"bottomright\">\n"; responseStream << " <div class=\"bottomright\">\n";
responseStream << " <p>Login Server in Entwicklung</p>\n"; responseStream << " <p>Login Server in Entwicklung</p>\n";
responseStream << " <p>Alpha "; responseStream << " <p>Alpha ";
#line 10 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\footer.cpsp" #line 10 "F:\\Gradido\\gradido_local\\login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( ServerConfig::g_versionString ); responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n"; responseStream << "</p>\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << " </div>\n"; responseStream << " </div>\n";
responseStream << "</body>\n"; responseStream << "</body>\n";
responseStream << "\n"; responseStream << "\n";
responseStream << "</html>"; responseStream << "</html>";
// end include footer.cpsp // end include footer.cpsp
if (_compressResponse) _gzipStream.close(); if (_compressResponse) _gzipStream.close();
} }

View File

@ -1,20 +1,20 @@
#ifndef LoginPage_INCLUDED #ifndef LoginPage_INCLUDED
#define LoginPage_INCLUDED #define LoginPage_INCLUDED
#include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandler.h"
#include "SessionHTTPRequestHandler.h" #include "SessionHTTPRequestHandler.h"
class LoginPage: public SessionHTTPRequestHandler class LoginPage: public SessionHTTPRequestHandler
{ {
public: public:
LoginPage(Session*); LoginPage(Session*);
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
}; };
#endif // LoginPage_INCLUDED #endif // LoginPage_INCLUDED

View File

@ -1,4 +1,4 @@
#include "ImportantTests.h" #include "ImportantTests.h"
#include <string> #include <string>
#include "ServerConfig.h" #include "ServerConfig.h"

View File

@ -1,108 +1,108 @@
#include "JsonCreateUser.h" #include "JsonCreateUser.h"
#include "../model/email/Email.h" #include "../model/email/Email.h"
#include "../controller/User.h" #include "../controller/User.h"
#include "../controller/EmailVerificationCode.h" #include "../controller/EmailVerificationCode.h"
#include "../SingletonManager/EmailManager.h" #include "../SingletonManager/EmailManager.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../tasks/AuthenticatedEncryptionCreateKeyTask.h" #include "../tasks/AuthenticatedEncryptionCreateKeyTask.h"
Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params) Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params)
{ {
std::string email; std::string email;
std::string first_name; std::string first_name;
std::string last_name; std::string last_name;
std::string password; std::string password;
bool login_after_register = false; bool login_after_register = false;
int emailType; int emailType;
auto em = EmailManager::getInstance(); auto em = EmailManager::getInstance();
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
// if is json object // if is json object
if (params.type() == typeid(Poco::JSON::Object::Ptr)) { if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>(); Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
/// Throws a RangeException if the value does not fit /// Throws a RangeException if the value does not fit
/// into the result variable. /// into the result variable.
/// Throws a NotImplementedException if conversion is /// Throws a NotImplementedException if conversion is
/// not available for the given type. /// not available for the given type.
/// Throws InvalidAccessException if Var is empty. /// Throws InvalidAccessException if Var is empty.
try { try {
paramJsonObject->get("email").convert(email); paramJsonObject->get("email").convert(email);
paramJsonObject->get("first_name").convert(first_name); paramJsonObject->get("first_name").convert(first_name);
paramJsonObject->get("last_name").convert(last_name); paramJsonObject->get("last_name").convert(last_name);
paramJsonObject->get("emailType").convert(emailType); paramJsonObject->get("emailType").convert(emailType);
if ((ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_PASSWORD_REQUESTS)) { if ((ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_PASSWORD_REQUESTS)) {
paramJsonObject->get("password").convert(password); paramJsonObject->get("password").convert(password);
} }
if (!paramJsonObject->isNull("login_after_register")) { if (!paramJsonObject->isNull("login_after_register")) {
paramJsonObject->get("login_after_register").convert(login_after_register); paramJsonObject->get("login_after_register").convert(login_after_register);
} }
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText()); return stateError("json exception", ex.displayText());
} }
} }
else { else {
return stateError("parameter format unknown"); return stateError("parameter format unknown");
} }
auto user = controller::User::create(); auto user = controller::User::create();
if (user->load(email) > 0) { if (user->load(email) > 0) {
return customStateError("exist", "user already exist"); return customStateError("exist", "user already exist");
} }
if (password.size()) { if (password.size()) {
ErrorList errors; ErrorList errors;
if (!sm->checkPwdValidation(password, &errors)) { if (!sm->checkPwdValidation(password, &errors)) {
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", "error"); result->set("state", "error");
result->set("msg", errors.getLastError()->getString(false)); result->set("msg", errors.getLastError()->getString(false));
if (errors.errorCount()) { if (errors.errorCount()) {
result->set("details", errors.getLastError()->getString(false)); result->set("details", errors.getLastError()->getString(false));
} }
return result; return result;
} }
} }
// create user // create user
user = controller::User::create(email, first_name, last_name); user = controller::User::create(email, first_name, last_name);
auto userModel = user->getModel(); auto userModel = user->getModel();
Session* session = nullptr; Session* session = nullptr;
if (!userModel->insertIntoDB(true)) { if (!userModel->insertIntoDB(true)) {
userModel->sendErrorsAsEmail(); userModel->sendErrorsAsEmail();
return stateError("insert user failed"); return stateError("insert user failed");
} }
if (password.size()) { if (password.size()) {
session = sm->getNewSession(); session = sm->getNewSession();
session->setUser(user); session->setUser(user);
session->generateKeys(true, true); session->generateKeys(true, true);
session->setClientIp(mClientIP); session->setClientIp(mClientIP);
// calculate encryption key, could need some time, will save encrypted privkey to db // calculate encryption key, could need some time, will save encrypted privkey to db
UniLib::controller::TaskPtr create_authenticated_encrypten_key = new AuthenticatedEncryptionCreateKeyTask(user, password); UniLib::controller::TaskPtr create_authenticated_encrypten_key = new AuthenticatedEncryptionCreateKeyTask(user, password);
create_authenticated_encrypten_key->scheduleTask(create_authenticated_encrypten_key); create_authenticated_encrypten_key->scheduleTask(create_authenticated_encrypten_key);
} }
auto emailOptIn = controller::EmailVerificationCode::create(userModel->getID(), model::table::EMAIL_OPT_IN_REGISTER); auto emailOptIn = controller::EmailVerificationCode::create(userModel->getID(), model::table::EMAIL_OPT_IN_REGISTER);
auto emailOptInModel = emailOptIn->getModel(); auto emailOptInModel = emailOptIn->getModel();
if (!emailOptInModel->insertIntoDB(false)) { if (!emailOptInModel->insertIntoDB(false)) {
emailOptInModel->sendErrorsAsEmail(); emailOptInModel->sendErrorsAsEmail();
return stateError("insert emailOptIn failed"); return stateError("insert emailOptIn failed");
} }
em->addEmail(new model::Email(emailOptIn, user, model::Email::convertTypeFromInt(emailType))); em->addEmail(new model::Email(emailOptIn, user, model::Email::convertTypeFromInt(emailType)));
if (login_after_register && session) { if (login_after_register && session) {
Poco::JSON::Object* result = stateSuccess(); Poco::JSON::Object* result = stateSuccess();
result->set("session_id", session->getHandle()); result->set("session_id", session->getHandle());
return result; return result;
} }
return stateSuccess(); return stateSuccess();
} }

View File

@ -1,144 +1,144 @@
#include "JsonGetUserInfos.h" #include "JsonGetUserInfos.h"
#include "../lib/DataTypeConverter.h" #include "../lib/DataTypeConverter.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../controller/User.h" #include "../controller/User.h"
#include "../controller/EmailVerificationCode.h" #include "../controller/EmailVerificationCode.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
Poco::UInt64 JsonGetUserInfos::readOrCreateEmailVerificationCode(int user_id, model::table::EmailOptInType type) Poco::UInt64 JsonGetUserInfos::readOrCreateEmailVerificationCode(int user_id, model::table::EmailOptInType type)
{ {
try { try {
auto emailVerificationCode = controller::EmailVerificationCode::load(user_id, type); auto emailVerificationCode = controller::EmailVerificationCode::load(user_id, type);
if (!emailVerificationCode) { if (!emailVerificationCode) {
emailVerificationCode = controller::EmailVerificationCode::create(user_id, type); emailVerificationCode = controller::EmailVerificationCode::create(user_id, type);
UniLib::controller::TaskPtr insert = new model::table::ModelInsertTask(emailVerificationCode->getModel(), false); UniLib::controller::TaskPtr insert = new model::table::ModelInsertTask(emailVerificationCode->getModel(), false);
insert->scheduleTask(insert); insert->scheduleTask(insert);
} }
return emailVerificationCode->getModel()->getCode(); return emailVerificationCode->getModel()->getCode();
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
ErrorList errors; ErrorList errors;
//printf("exception: %s\n", ex.displayText().data()); //printf("exception: %s\n", ex.displayText().data());
errors.addError(new ParamError("JsonGetUserInfos::readOrCreateEmailVerificationCode", "exception: ", ex.displayText())); errors.addError(new ParamError("JsonGetUserInfos::readOrCreateEmailVerificationCode", "exception: ", ex.displayText()));
errors.sendErrorsAsEmail(); errors.sendErrorsAsEmail();
} }
return 0; return 0;
} }
Poco::JSON::Object* JsonGetUserInfos::handle(Poco::Dynamic::Var params) Poco::JSON::Object* JsonGetUserInfos::handle(Poco::Dynamic::Var params)
{ {
/* /*
'session_id' => $session_id, 'session_id' => $session_id,
'email' => $email, 'email' => $email,
'ask' => ['EmailOptIn.Register'] 'ask' => ['EmailOptIn.Register']
*/ */
// incoming // incoming
int session_id = 0; int session_id = 0;
std::string email; std::string email;
Poco::JSON::Array::Ptr askArray; Poco::JSON::Array::Ptr askArray;
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
// if is json object // if is json object
if (params.type() == typeid(Poco::JSON::Object::Ptr)) { if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>(); Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
/// Throws a RangeException if the value does not fit /// Throws a RangeException if the value does not fit
/// into the result variable. /// into the result variable.
/// Throws a NotImplementedException if conversion is /// Throws a NotImplementedException if conversion is
/// not available for the given type. /// not available for the given type.
/// Throws InvalidAccessException if Var is empty. /// Throws InvalidAccessException if Var is empty.
try { try {
paramJsonObject->get("email").convert(email); paramJsonObject->get("email").convert(email);
paramJsonObject->get("session_id").convert(session_id); paramJsonObject->get("session_id").convert(session_id);
askArray = paramJsonObject->getArray("ask"); askArray = paramJsonObject->getArray("ask");
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText()); return stateError("json exception", ex.displayText());
} }
} }
else { else {
return stateError("parameter format unknown"); return stateError("parameter format unknown");
} }
if (!session_id) { if (!session_id) {
return stateError("session_id invalid"); return stateError("session_id invalid");
} }
if (askArray.isNull()) { if (askArray.isNull()) {
return stateError("ask is zero or not an array"); return stateError("ask is zero or not an array");
} }
auto session = sm->getSession(session_id); auto session = sm->getSession(session_id);
if (!session) { if (!session) {
return customStateError("not found", "session not found"); return customStateError("not found", "session not found");
} }
auto session_user = session->getNewUser(); auto session_user = session->getNewUser();
auto session_user_model = session_user->getModel(); auto session_user_model = session_user->getModel();
bool isAdmin = false; bool isAdmin = false;
bool emailBelongToUser = false; bool emailBelongToUser = false;
if (model::table::ROLE_ADMIN == session_user_model->getRole()) { if (model::table::ROLE_ADMIN == session_user_model->getRole()) {
isAdmin = true; isAdmin = true;
} }
if (session_user_model->getEmail() == email) { if (session_user_model->getEmail() == email) {
emailBelongToUser = true; emailBelongToUser = true;
} }
auto user = controller::User::create(); auto user = controller::User::create();
if (1 != user->load(email)) { if (1 != user->load(email)) {
return customStateError("not found", "user not found"); return customStateError("not found", "user not found");
} }
auto user_model = user->getModel(); auto user_model = user->getModel();
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", "success"); result->set("state", "success");
Poco::JSON::Array jsonErrorsArray; Poco::JSON::Array jsonErrorsArray;
Poco::JSON::Object jsonUser; Poco::JSON::Object jsonUser;
Poco::JSON::Object jsonServer; Poco::JSON::Object jsonServer;
for (auto it = askArray->begin(); it != askArray->end(); it++) { for (auto it = askArray->begin(); it != askArray->end(); it++) {
auto parameter = *it; auto parameter = *it;
std::string parameterString; std::string parameterString;
try { try {
parameter.convert(parameterString); parameter.convert(parameterString);
if (parameterString == "EmailVerificationCode.Register" && isAdmin && !emailBelongToUser) { if (parameterString == "EmailVerificationCode.Register" && isAdmin && !emailBelongToUser) {
auto code = readOrCreateEmailVerificationCode(user_model->getID(), model::table::EMAIL_OPT_IN_REGISTER_DIRECT); auto code = readOrCreateEmailVerificationCode(user_model->getID(), model::table::EMAIL_OPT_IN_REGISTER_DIRECT);
if (code) { if (code) {
jsonUser.set("EmailVerificationCode.Register", std::to_string(code)); jsonUser.set("EmailVerificationCode.Register", std::to_string(code));
} }
} }
else if (parameterString == "loginServer.path") { else if (parameterString == "loginServer.path") {
jsonServer.set("loginServer.path", ServerConfig::g_serverPath); jsonServer.set("loginServer.path", ServerConfig::g_serverPath);
} }
else if (parameterString == "user.pubkeyhex") { else if (parameterString == "user.pubkeyhex") {
jsonUser.set("pubkeyhex", user_model->getPublicKeyHex()); jsonUser.set("pubkeyhex", user_model->getPublicKeyHex());
} }
else if (parameterString == "user.first_name") { else if (parameterString == "user.first_name") {
jsonUser.set("first_name", user_model->getFirstName()); jsonUser.set("first_name", user_model->getFirstName());
} }
else if (parameterString == "user.last_name") { else if (parameterString == "user.last_name") {
jsonUser.set("last_name", user_model->getLastName()); jsonUser.set("last_name", user_model->getLastName());
} }
else if (parameterString == "user.disabled") { else if (parameterString == "user.disabled") {
jsonUser.set("disabled", user_model->isDisabled()); jsonUser.set("disabled", user_model->isDisabled());
} }
else if (parameterString == "user.email_checked" && (isAdmin || emailBelongToUser)) { else if (parameterString == "user.email_checked" && (isAdmin || emailBelongToUser)) {
jsonUser.set("email_checked", user_model->isEmailChecked()); jsonUser.set("email_checked", user_model->isEmailChecked());
} }
else if (parameterString == "user.identHash") { else if (parameterString == "user.identHash") {
auto email = user_model->getEmail(); auto email = user_model->getEmail();
jsonUser.set("identHash", DRMakeStringHash(email.data(), email.size())); jsonUser.set("identHash", DRMakeStringHash(email.data(), email.size()));
} }
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
jsonErrorsArray.add("ask parameter invalid"); jsonErrorsArray.add("ask parameter invalid");
} }
} }
result->set("errors", jsonErrorsArray); result->set("errors", jsonErrorsArray);
result->set("userData", jsonUser); result->set("userData", jsonUser);
result->set("server", jsonServer); result->set("server", jsonServer);
return result; return result;
} }

View File

@ -1,44 +1,44 @@
#include "JsonLogout.h" #include "JsonLogout.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
Poco::JSON::Object* JsonLogout::handle(Poco::Dynamic::Var params) Poco::JSON::Object* JsonLogout::handle(Poco::Dynamic::Var params)
{ {
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
int session_id = 0; int session_id = 0;
// if is json object // if is json object
if (params.type() == typeid(Poco::JSON::Object::Ptr)) { if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>(); Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
/// Throws a RangeException if the value does not fit /// Throws a RangeException if the value does not fit
/// into the result variable. /// into the result variable.
/// Throws a NotImplementedException if conversion is /// Throws a NotImplementedException if conversion is
/// not available for the given type. /// not available for the given type.
/// Throws InvalidAccessException if Var is empty. /// Throws InvalidAccessException if Var is empty.
try { try {
paramJsonObject->get("session_id").convert(session_id); paramJsonObject->get("session_id").convert(session_id);
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
return stateError("json exception", ex.displayText()); return stateError("json exception", ex.displayText());
} }
} }
else { else {
return stateError("parameter format unknown"); return stateError("parameter format unknown");
} }
auto session = sm->getSession(session_id); auto session = sm->getSession(session_id);
if (!session) { if (!session) {
return stateError("session not found", std::to_string(session_id)); return stateError("session not found", std::to_string(session_id));
} }
if (sm->releaseSession(session_id)) { if (sm->releaseSession(session_id)) {
return stateSuccess(); return stateSuccess();
} }
return stateError("error by releasing session"); return stateError("error by releasing session");
} }

View File

@ -1,18 +1,18 @@
#ifndef __JSON_INTERFACE_JSON_LOGOUT_ #ifndef __JSON_INTERFACE_JSON_LOGOUT_
#define __JSON_INTERFACE_JSON_LOGOUT_ #define __JSON_INTERFACE_JSON_LOGOUT_
#include "JsonRequestHandler.h" #include "JsonRequestHandler.h"
class JsonLogout : public JsonRequestHandler class JsonLogout : public JsonRequestHandler
{ {
public: public:
JsonLogout(Poco::Net::IPAddress ip) : mClientIP(ip) {} JsonLogout(Poco::Net::IPAddress ip) : mClientIP(ip) {}
Poco::JSON::Object* handle(Poco::Dynamic::Var params); Poco::JSON::Object* handle(Poco::Dynamic::Var params);
protected: protected:
Poco::Net::IPAddress mClientIP; Poco::Net::IPAddress mClientIP;
}; };
#endif // __JSON_INTERFACE_JSON_LOGOUT_ #endif // __JSON_INTERFACE_JSON_LOGOUT_

View File

@ -1,141 +1,141 @@
#include "JsonRequestHandler.h" #include "JsonRequestHandler.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerResponse.h"
#include "Poco/URI.h" #include "Poco/URI.h"
#include "Poco/DeflatingStream.h" #include "Poco/DeflatingStream.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
#include "../lib/DataTypeConverter.h" #include "../lib/DataTypeConverter.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
{ {
response.setChunkedTransferEncoding(false); response.setChunkedTransferEncoding(false);
response.setContentType("application/json"); response.setContentType("application/json");
if (ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_CORS_ALL) { if (ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_CORS_ALL) {
response.set("Access-Control-Allow-Origin", "*"); response.set("Access-Control-Allow-Origin", "*");
response.set("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); response.set("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
} }
//bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); //bool _compressResponse(request.hasToken("Accept-Encoding", "gzip"));
//if (_compressResponse) response.set("Content-Encoding", "gzip"); //if (_compressResponse) response.set("Content-Encoding", "gzip");
std::ostream& responseStream = response.send(); std::ostream& responseStream = response.send();
//Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); //Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
//std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; //std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
auto method = request.getMethod(); auto method = request.getMethod();
std::istream& request_stream = request.stream(); std::istream& request_stream = request.stream();
Poco::JSON::Object* json_result = nullptr; Poco::JSON::Object* json_result = nullptr;
if (method == "POST" || method == "PUT") { if (method == "POST" || method == "PUT") {
// extract parameter from request // extract parameter from request
Poco::Dynamic::Var parsedResult = parseJsonWithErrorPrintFile(request_stream); Poco::Dynamic::Var parsedResult = parseJsonWithErrorPrintFile(request_stream);
if (parsedResult.size() != 0) { if (parsedResult.size() != 0) {
json_result = handle(parsedResult); json_result = handle(parsedResult);
} }
else { else {
json_result = stateError("empty body"); json_result = stateError("empty body");
} }
} }
else if(method == "GET") { else if(method == "GET") {
Poco::URI uri(request.getURI()); Poco::URI uri(request.getURI());
auto queryParameters = uri.getQueryParameters(); auto queryParameters = uri.getQueryParameters();
json_result = handle(queryParameters); json_result = handle(queryParameters);
} }
if (json_result) { if (json_result) {
if (!json_result->isNull("session_id")) { if (!json_result->isNull("session_id")) {
int session_id = 0; int session_id = 0;
try { try {
json_result->get("session_id").convert(session_id); json_result->get("session_id").convert(session_id);
} }
catch (Poco::Exception& e) { catch (Poco::Exception& e) {
ErrorList erros; ErrorList erros;
erros.addError(new Error("json request", "invalid session_id")); erros.addError(new Error("json request", "invalid session_id"));
erros.sendErrorsAsEmail(); erros.sendErrorsAsEmail();
} }
if (session_id) { if (session_id) {
auto session = SessionManager::getInstance()->getSession(session_id); auto session = SessionManager::getInstance()->getSession(session_id);
response.addCookie(session->getLoginCookie()); response.addCookie(session->getLoginCookie());
} }
} }
json_result->stringify(responseStream); json_result->stringify(responseStream);
delete json_result; delete json_result;
} }
//if (_compressResponse) _gzipStream.close(); //if (_compressResponse) _gzipStream.close();
} }
Poco::Dynamic::Var JsonRequestHandler::parseJsonWithErrorPrintFile(std::istream& request_stream, ErrorList* errorHandler /* = nullptr*/, const char* functionName /* = nullptr*/) Poco::Dynamic::Var JsonRequestHandler::parseJsonWithErrorPrintFile(std::istream& request_stream, ErrorList* errorHandler /* = nullptr*/, const char* functionName /* = nullptr*/)
{ {
// debugging answer // debugging answer
std::stringstream responseStringStream; std::stringstream responseStringStream;
for (std::string line; std::getline(request_stream, line); ) { for (std::string line; std::getline(request_stream, line); ) {
responseStringStream << line << std::endl; responseStringStream << line << std::endl;
} }
// extract parameter from request // extract parameter from request
Poco::JSON::Parser jsonParser; Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJson; Poco::Dynamic::Var parsedJson;
try { try {
parsedJson = jsonParser.parse(responseStringStream.str()); parsedJson = jsonParser.parse(responseStringStream.str());
return parsedJson; return parsedJson;
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
if (errorHandler) { if (errorHandler) {
errorHandler->addError(new ParamError(functionName, "error parsing request answer", ex.displayText().data())); errorHandler->addError(new ParamError(functionName, "error parsing request answer", ex.displayText().data()));
errorHandler->sendErrorsAsEmail(responseStringStream.str()); errorHandler->sendErrorsAsEmail(responseStringStream.str());
} }
std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d_%m_%yT%H_%M_%S"); std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d_%m_%yT%H_%M_%S");
std::string filename = dateTimeString + "_response.html"; std::string filename = dateTimeString + "_response.html";
FILE* f = fopen(filename.data(), "wt"); FILE* f = fopen(filename.data(), "wt");
if (f) { if (f) {
std::string responseString = responseStringStream.str(); std::string responseString = responseStringStream.str();
fwrite(responseString.data(), 1, responseString.size(), f); fwrite(responseString.data(), 1, responseString.size(), f);
fclose(f); fclose(f);
} }
return Poco::Dynamic::Var(); return Poco::Dynamic::Var();
} }
return Poco::Dynamic::Var(); return Poco::Dynamic::Var();
} }
Poco::JSON::Object* JsonRequestHandler::stateError(const char* msg, std::string details) Poco::JSON::Object* JsonRequestHandler::stateError(const char* msg, std::string details)
{ {
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", "error"); result->set("state", "error");
result->set("msg", msg); result->set("msg", msg);
if (details != "") { if (details != "") {
result->set("details", details); result->set("details", details);
} }
return result; return result;
} }
Poco::JSON::Object* JsonRequestHandler::stateSuccess() Poco::JSON::Object* JsonRequestHandler::stateSuccess()
{ {
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", "success"); result->set("state", "success");
return result; return result;
} }
Poco::JSON::Object* JsonRequestHandler::customStateError(const char* state, const char* msg, std::string details/* = ""*/) Poco::JSON::Object* JsonRequestHandler::customStateError(const char* state, const char* msg, std::string details/* = ""*/)
{ {
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
result->set("state", state); result->set("state", state);
result->set("msg", msg); result->set("msg", msg);
if (details != "") { if (details != "") {
result->set("details", details); result->set("details", details);
} }
return result; return result;
} }

View File

@ -1,82 +1,82 @@
#include "JsonRequestHandlerFactory.h" #include "JsonRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "JsonAdminEmailVerificationResend.h" #include "JsonAdminEmailVerificationResend.h"
#include "JsonCheckSessionState.h" #include "JsonCheckSessionState.h"
#include "JsonCreateUser.h" #include "JsonCreateUser.h"
#include "JsonGetLogin.h" #include "JsonGetLogin.h"
#include "JsonUnknown.h" #include "JsonUnknown.h"
#include "JsonTransaction.h" #include "JsonTransaction.h"
#include "JsonGetRunningUserTasks.h" #include "JsonGetRunningUserTasks.h"
#include "JsonGetUsers.h" #include "JsonGetUsers.h"
#include "JsonLoginViaEmailVerificationCode.h" #include "JsonLoginViaEmailVerificationCode.h"
#include "JsonGetUserInfos.h" #include "JsonGetUserInfos.h"
#include "JsonUpdateUserInfos.h" #include "JsonUpdateUserInfos.h"
#include "JsonUnsecureLogin.h" #include "JsonUnsecureLogin.h"
#include "JsonLogout.h" #include "JsonLogout.h"
JsonRequestHandlerFactory::JsonRequestHandlerFactory() JsonRequestHandlerFactory::JsonRequestHandlerFactory()
: mRemoveGETParameters("^/([a-zA-Z0-9_-]*)"), mLogging(Poco::Logger::get("requestLog")) : mRemoveGETParameters("^/([a-zA-Z0-9_-]*)"), mLogging(Poco::Logger::get("requestLog"))
{ {
} }
Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request) Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)
{ {
std::string uri = request.getURI(); std::string uri = request.getURI();
std::string url_first_part; std::string url_first_part;
std::stringstream logStream; std::stringstream logStream;
mRemoveGETParameters.extract(uri, url_first_part); mRemoveGETParameters.extract(uri, url_first_part);
std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S"); std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S");
logStream << dateTimeString << " call " << uri; logStream << dateTimeString << " call " << uri;
mLogging.information(logStream.str()); mLogging.information(logStream.str());
auto client_host = request.clientAddress().host(); auto client_host = request.clientAddress().host();
//auto client_ip = request.clientAddress(); //auto client_ip = request.clientAddress();
// X-Real-IP forwarded ip from nginx config // X-Real-IP forwarded ip from nginx config
auto client_host_string = request.get("X-Real-IP", client_host.toString()); auto client_host_string = request.get("X-Real-IP", client_host.toString());
client_host = Poco::Net::IPAddress(client_host_string); client_host = Poco::Net::IPAddress(client_host_string);
if (url_first_part == "/login") { if (url_first_part == "/login") {
return new JsonGetLogin; return new JsonGetLogin;
} }
else if (url_first_part == "/checkSessionState") { else if (url_first_part == "/checkSessionState") {
return new JsonCheckSessionState; return new JsonCheckSessionState;
} }
else if (url_first_part == "/checkTransaction") { else if (url_first_part == "/checkTransaction") {
return new JsonTransaction; return new JsonTransaction;
} }
else if (url_first_part == "/getRunningUserTasks") { else if (url_first_part == "/getRunningUserTasks") {
return new JsonGetRunningUserTasks; return new JsonGetRunningUserTasks;
} }
else if (url_first_part == "/getUsers") { else if (url_first_part == "/getUsers") {
return new JsonGetUsers; return new JsonGetUsers;
} }
else if (url_first_part == "/createUser") { else if (url_first_part == "/createUser") {
return new JsonCreateUser(client_host); return new JsonCreateUser(client_host);
} }
else if (url_first_part == "/adminEmailVerificationResend") { else if (url_first_part == "/adminEmailVerificationResend") {
return new JsonAdminEmailVerificationResend; return new JsonAdminEmailVerificationResend;
} }
else if (url_first_part == "/getUserInfos") { else if (url_first_part == "/getUserInfos") {
return new JsonGetUserInfos; return new JsonGetUserInfos;
} }
else if (url_first_part == "/updateUserInfos") { else if (url_first_part == "/updateUserInfos") {
return new JsonUpdateUserInfos; return new JsonUpdateUserInfos;
} }
else if (url_first_part == "/unsecureLogin" && (ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_PASSWORD_REQUESTS)) { else if (url_first_part == "/unsecureLogin" && (ServerConfig::g_AllowUnsecureFlags & ServerConfig::UNSECURE_PASSWORD_REQUESTS)) {
return new JsonUnsecureLogin(client_host); return new JsonUnsecureLogin(client_host);
} }
else if (url_first_part == "/loginViaEmailVerificationCode") { else if (url_first_part == "/loginViaEmailVerificationCode") {
return new JsonLoginViaEmailVerificationCode(client_host); return new JsonLoginViaEmailVerificationCode(client_host);
} }
else if (url_first_part == "/logout") { else if (url_first_part == "/logout") {
return new JsonLogout(client_host); return new JsonLogout(client_host);
} }
return new JsonUnknown; return new JsonUnknown;
} }

View File

@ -1,175 +1,175 @@
#include "JsonTransaction.h" #include "JsonTransaction.h"
#include "Poco/URI.h" #include "Poco/URI.h"
#include "Poco/Dynamic/Struct.h" #include "Poco/Dynamic/Struct.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params) Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params)
{ {
Poco::JSON::Object* result = new Poco::JSON::Object; Poco::JSON::Object* result = new Poco::JSON::Object;
int session_id = 0; int session_id = 0;
// if is json object // if is json object
if (params.type() == typeid(Poco::JSON::Object::Ptr)) { if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>(); Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
try { try {
/// Throws a RangeException if the value does not fit /// Throws a RangeException if the value does not fit
/// into the result variable. /// into the result variable.
/// Throws a NotImplementedException if conversion is /// Throws a NotImplementedException if conversion is
/// not available for the given type. /// not available for the given type.
/// Throws InvalidAccessException if Var is empty. /// Throws InvalidAccessException if Var is empty.
paramJsonObject->get("session_id").convert(session_id); paramJsonObject->get("session_id").convert(session_id);
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
if (session_id != 0) { if (session_id != 0) {
auto session = sm->getSession(session_id); auto session = sm->getSession(session_id);
if (!session) { if (!session) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "session not found"); result->set("msg", "session not found");
return result; return result;
} }
int balance = 0; int balance = 0;
if (!paramJsonObject->isNull("balance")) { if (!paramJsonObject->isNull("balance")) {
paramJsonObject->get("balance").convert(balance); paramJsonObject->get("balance").convert(balance);
if (balance) { if (balance) {
auto u = session->getUser(); auto u = session->getUser();
if (u) { if (u) {
u->setBalance(balance); u->setBalance(balance);
} }
auto nu = session->getNewUser(); auto nu = session->getNewUser();
if (!nu.isNull()) { if (!nu.isNull()) {
nu->setBalance(balance); nu->setBalance(balance);
} }
} }
} }
std::string transactionBase64String; std::string transactionBase64String;
Poco::Dynamic::Var transaction_base64 = paramJsonObject->get("transaction_base64"); Poco::Dynamic::Var transaction_base64 = paramJsonObject->get("transaction_base64");
bool auto_sign = false; bool auto_sign = false;
auto auto_sign_json = paramJsonObject->get("auto_sign"); auto auto_sign_json = paramJsonObject->get("auto_sign");
if (!auto_sign_json.isEmpty()) { if (!auto_sign_json.isEmpty()) {
auto_sign_json.convert(auto_sign); auto_sign_json.convert(auto_sign);
} }
if (transaction_base64.isString()) { if (transaction_base64.isString()) {
paramJsonObject->get("transaction_base64").convert(transactionBase64String); paramJsonObject->get("transaction_base64").convert(transactionBase64String);
if (!session->startProcessingTransaction(transactionBase64String, auto_sign)) { if (!session->startProcessingTransaction(transactionBase64String, auto_sign)) {
if (auto_sign) { if (auto_sign) {
auto errorJson = session->getErrorsArray(); auto errorJson = session->getErrorsArray();
result->set("state", "error"); result->set("state", "error");
result->set("msg", "error processing transaction"); result->set("msg", "error processing transaction");
result->set("details", errorJson); result->set("details", errorJson);
return result; return result;
} }
auto lastError = session->getLastError(); auto lastError = session->getLastError();
if (lastError) delete lastError; if (lastError) delete lastError;
result->set("state", "error"); result->set("state", "error");
result->set("msg", "already enlisted"); result->set("msg", "already enlisted");
return result; return result;
} }
} else { } else {
Poco::DynamicStruct ds = *paramJsonObject; Poco::DynamicStruct ds = *paramJsonObject;
int alreadyEnlisted = 0; int alreadyEnlisted = 0;
for (int i = 0; i < ds["transaction_base64"].size(); i++) { for (int i = 0; i < ds["transaction_base64"].size(); i++) {
ds["transaction_base64"][i].convert(transactionBase64String); ds["transaction_base64"][i].convert(transactionBase64String);
if (!session->startProcessingTransaction(transactionBase64String, auto_sign)) { if (!session->startProcessingTransaction(transactionBase64String, auto_sign)) {
auto lastError = session->getLastError(); auto lastError = session->getLastError();
if (lastError) delete lastError; if (lastError) delete lastError;
alreadyEnlisted++; alreadyEnlisted++;
} }
} }
if (alreadyEnlisted > 0) { if (alreadyEnlisted > 0) {
result->set("state", "warning"); result->set("state", "warning");
result->set("msg", std::to_string(alreadyEnlisted) + " already enlisted"); result->set("msg", std::to_string(alreadyEnlisted) + " already enlisted");
return result; return result;
} }
} }
result->set("state", "success"); result->set("state", "success");
return result; return result;
} }
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
printf("[JsonTransaction::handle] try to use params as jsonObject: %s\n", ex.displayText().data()); printf("[JsonTransaction::handle] try to use params as jsonObject: %s\n", ex.displayText().data());
result->set("state", "error"); result->set("state", "error");
result->set("msg", "json exception"); result->set("msg", "json exception");
result->set("details", ex.displayText()); result->set("details", ex.displayText());
return result; return result;
} }
} }
else if (params.isVector()) { else if (params.isVector()) {
const Poco::URI::QueryParameters queryParams = params.extract<Poco::URI::QueryParameters>(); const Poco::URI::QueryParameters queryParams = params.extract<Poco::URI::QueryParameters>();
auto transactionIT = queryParams.begin(); auto transactionIT = queryParams.begin();
for (auto it = queryParams.begin(); it != queryParams.end(); it++) { for (auto it = queryParams.begin(); it != queryParams.end(); it++) {
if (it->first == "session_id") { if (it->first == "session_id") {
session_id = stoi(it->second); session_id = stoi(it->second);
//break; //break;
} }
else if (it->first == "transaction_base64") { else if (it->first == "transaction_base64") {
transactionIT = it; transactionIT = it;
} }
} }
if (session_id) { if (session_id) {
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
auto session = sm->getSession(session_id); auto session = sm->getSession(session_id);
if (!session) { if (!session) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "session not found"); result->set("msg", "session not found");
return result; return result;
} }
if (!session->startProcessingTransaction(transactionIT->second)) { if (!session->startProcessingTransaction(transactionIT->second)) {
auto lastError = session->getLastError(); auto lastError = session->getLastError();
if (lastError) delete lastError; if (lastError) delete lastError;
result->set("state", "error"); result->set("state", "error");
result->set("msg", "already enlisted"); result->set("msg", "already enlisted");
return result; return result;
} }
result->set("state", "success"); result->set("state", "success");
return result; return result;
} }
else { else {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "session id not set"); result->set("msg", "session id not set");
return result; return result;
} }
} }
else if (params.isStruct()) { else if (params.isStruct()) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "struct not implemented yet"); result->set("msg", "struct not implemented yet");
} }
else if (params.isArray()) { else if (params.isArray()) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "array not implemented yet"); result->set("msg", "array not implemented yet");
} }
else if (params.isList()) { else if (params.isList()) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "list not implemented yet"); result->set("msg", "list not implemented yet");
} }
else if (params.isString()) { else if (params.isString()) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "string not implemented yet"); result->set("msg", "string not implemented yet");
} }
else if (params.isDeque()) { else if (params.isDeque()) {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "deque not implemented yet"); result->set("msg", "deque not implemented yet");
} }
else { else {
result->set("state", "error"); result->set("state", "error");
result->set("msg", "format not implemented"); result->set("msg", "format not implemented");
result->set("details", std::string(params.type().name())); result->set("details", std::string(params.type().name()));
} }
return result; return result;
} }

View File

@ -1,19 +1,19 @@
#ifndef __JSON_INTERFACE_JSON_TRANSACTION_ #ifndef __JSON_INTERFACE_JSON_TRANSACTION_
#define __JSON_INTERFACE_JSON_TRANSACTION_ #define __JSON_INTERFACE_JSON_TRANSACTION_
#include "JsonRequestHandler.h" #include "JsonRequestHandler.h"
class Session; class Session;
class JsonTransaction : public JsonRequestHandler class JsonTransaction : public JsonRequestHandler
{ {
public: public:
Poco::JSON::Object* handle(Poco::Dynamic::Var params); Poco::JSON::Object* handle(Poco::Dynamic::Var params);
protected: protected:
bool startProcessingTransaction(Session* session, const std::string& transactionBase64); bool startProcessingTransaction(Session* session, const std::string& transactionBase64);
}; };
#endif // __JSON_INTERFACE_JSON_TRANSACTION_ #endif // __JSON_INTERFACE_JSON_TRANSACTION_

View File

@ -1,349 +1,349 @@
#include "ServerConfig.h" #include "ServerConfig.h"
#include "Crypto/mnemonic_german.h" #include "Crypto/mnemonic_german.h"
#include "Crypto/mnemonic_german2.h" #include "Crypto/mnemonic_german2.h"
#include "Crypto/mnemonic_bip0039.h" #include "Crypto/mnemonic_bip0039.h"
#include "Crypto/DRRandom.h" #include "Crypto/DRRandom.h"
#include "lib/DataTypeConverter.h" #include "lib/DataTypeConverter.h"
#include "sodium.h" #include "sodium.h"
#include "Poco/Net/SSLManager.h" #include "Poco/Net/SSLManager.h"
#include "Poco/Net/KeyConsoleHandler.h" #include "Poco/Net/KeyConsoleHandler.h"
#include "Poco/Net/RejectCertificateHandler.h" #include "Poco/Net/RejectCertificateHandler.h"
#include "Poco/Net/DNS.h" #include "Poco/Net/DNS.h"
#include "Poco/SharedPtr.h" #include "Poco/SharedPtr.h"
#include "Poco/Mutex.h" #include "Poco/Mutex.h"
#include "Poco/Path.h" #include "Poco/Path.h"
#include "Poco/FileStream.h" #include "Poco/FileStream.h"
#include "Poco/LocalDateTime.h" #include "Poco/LocalDateTime.h"
#include "Poco/DateTimeFormat.h" #include "Poco/DateTimeFormat.h"
#include "Poco/DateTimeFormatter.h" #include "Poco/DateTimeFormatter.h"
using Poco::Net::SSLManager; using Poco::Net::SSLManager;
using Poco::Net::Context; using Poco::Net::Context;
using Poco::Net::KeyConsoleHandler; using Poco::Net::KeyConsoleHandler;
using Poco::Net::PrivateKeyPassphraseHandler; using Poco::Net::PrivateKeyPassphraseHandler;
using Poco::Net::InvalidCertificateHandler; using Poco::Net::InvalidCertificateHandler;
using Poco::Net::RejectCertificateHandler; using Poco::Net::RejectCertificateHandler;
using Poco::SharedPtr; using Poco::SharedPtr;
namespace ServerConfig { namespace ServerConfig {
#define SESSION_TIMEOUT_DEFAULT 10 #define SESSION_TIMEOUT_DEFAULT 10
Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX]; Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX];
ObfusArray* g_ServerCryptoKey = nullptr; ObfusArray* g_ServerCryptoKey = nullptr;
ObfusArray* g_ServerKeySeed = nullptr; ObfusArray* g_ServerKeySeed = nullptr;
// std::string g_ServerAdminPublic; // std::string g_ServerAdminPublic;
UniLib::controller::CPUSheduler* g_CPUScheduler = nullptr; UniLib::controller::CPUSheduler* g_CPUScheduler = nullptr;
UniLib::controller::CPUSheduler* g_CryptoCPUScheduler = nullptr; UniLib::controller::CPUSheduler* g_CryptoCPUScheduler = nullptr;
Context::Ptr g_SSL_CLient_Context = nullptr; Context::Ptr g_SSL_CLient_Context = nullptr;
Poco::Util::Timer g_CronJobsTimer; Poco::Util::Timer g_CronJobsTimer;
EmailAccount g_EmailAccount; EmailAccount g_EmailAccount;
int g_SessionTimeout = SESSION_TIMEOUT_DEFAULT; int g_SessionTimeout = SESSION_TIMEOUT_DEFAULT;
std::string g_serverPath; std::string g_serverPath;
int g_serverPort = 0; int g_serverPort = 0;
Languages g_default_locale; Languages g_default_locale;
std::string g_php_serverPath; std::string g_php_serverPath;
std::string g_php_serverHost; std::string g_php_serverHost;
int g_phpServerPort; int g_phpServerPort;
Poco::Mutex g_TimeMutex; Poco::Mutex g_TimeMutex;
int g_FakeLoginSleepTime = 820; int g_FakeLoginSleepTime = 820;
std::string g_versionString = ""; std::string g_versionString = "";
bool g_disableEmail = false; bool g_disableEmail = false;
ServerSetupType g_ServerSetupType = SERVER_TYPE_PRODUCTION; ServerSetupType g_ServerSetupType = SERVER_TYPE_PRODUCTION;
std::string g_gRPCRelayServerFullURL; std::string g_gRPCRelayServerFullURL;
MemoryBin* g_CryptoAppSecret = nullptr; MemoryBin* g_CryptoAppSecret = nullptr;
AllowUnsecure g_AllowUnsecureFlags = NOT_UNSECURE; AllowUnsecure g_AllowUnsecureFlags = NOT_UNSECURE;
#ifdef __linux__ #ifdef __linux__
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <ifaddrs.h> #include <ifaddrs.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <string.h> #include <string.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#endif //#ifdef __linux__ #endif //#ifdef __linux__
std::string getHostIpString() std::string getHostIpString()
{ {
#ifdef __linux__ #ifdef __linux__
struct ifaddrs * ifAddrStruct = NULL; struct ifaddrs * ifAddrStruct = NULL;
struct ifaddrs * ifa = NULL; struct ifaddrs * ifa = NULL;
void * tmpAddrPtr = NULL; void * tmpAddrPtr = NULL;
getifaddrs(&ifAddrStruct); getifaddrs(&ifAddrStruct);
std::string ipAddressString; std::string ipAddressString;
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr) { if (!ifa->ifa_addr) {
continue; continue;
} }
if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
// is a valid IP4 Address // is a valid IP4 Address
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN]; char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
ipAddressString = addressBuffer; ipAddressString = addressBuffer;
printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
} }
else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6 else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
// is a valid IP6 Address // is a valid IP6 Address
tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN]; char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
} }
} }
if (ifAddrStruct != NULL) freeifaddrs(ifAddrStruct); if (ifAddrStruct != NULL) freeifaddrs(ifAddrStruct);
return ipAddressString; return ipAddressString;
#else //__linux__ #else //__linux__
std::string ipAddressString = ""; std::string ipAddressString = "";
auto host = Poco::Net::DNS::thisHost(); auto host = Poco::Net::DNS::thisHost();
for (auto it = host.addresses().begin(); it != host.addresses().end(); it++) { for (auto it = host.addresses().begin(); it != host.addresses().end(); it++) {
auto ipAddress = *it; auto ipAddress = *it;
if (!ipAddress.isIPv4Compatible() && !ipAddress.isIPv4Mapped()) { if (!ipAddress.isIPv4Compatible() && !ipAddress.isIPv4Mapped()) {
continue; continue;
} }
if (ipAddress.isLoopback()) { if (ipAddress.isLoopback()) {
continue; continue;
} }
ipAddressString = ipAddress.toString(); ipAddressString = ipAddress.toString();
//isIPv4Compatible //isIPv4Compatible
//!isLoopback //!isLoopback
//printf("ipaddress: %s\n", ipAddressString.data()); //printf("ipaddress: %s\n", ipAddressString.data());
break; break;
//break; //break;
} }
return ipAddressString; return ipAddressString;
#endif // __linux__ #endif // __linux__
} }
bool replaceZeroIPWithLocalhostIP(std::string& url) bool replaceZeroIPWithLocalhostIP(std::string& url)
{ {
auto pos = url.find("0.0.0.0", 0); auto pos = url.find("0.0.0.0", 0);
if (pos != std::string::npos) { if (pos != std::string::npos) {
std::string ipAddressString = getHostIpString(); std::string ipAddressString = getHostIpString();
if ("" != ipAddressString) { if ("" != ipAddressString) {
url.replace(pos, 7, ipAddressString); url.replace(pos, 7, ipAddressString);
} }
} }
//printf("ipaddress: %s\n", ipAddress.data()); //printf("ipaddress: %s\n", ipAddress.data());
return true; return true;
} }
ServerSetupType getServerSetupTypeFromString(const std::string& serverSetupTypeString) { ServerSetupType getServerSetupTypeFromString(const std::string& serverSetupTypeString) {
if ("test" == serverSetupTypeString) { if ("test" == serverSetupTypeString) {
return SERVER_TYPE_TEST; return SERVER_TYPE_TEST;
} }
if ("staging" == serverSetupTypeString) { if ("staging" == serverSetupTypeString) {
return SERVER_TYPE_STAGING; return SERVER_TYPE_STAGING;
} }
if ("production" == serverSetupTypeString) { if ("production" == serverSetupTypeString) {
return SERVER_TYPE_PRODUCTION; return SERVER_TYPE_PRODUCTION;
} }
return SERVER_TYPE_PRODUCTION; return SERVER_TYPE_PRODUCTION;
} }
bool loadMnemonicWordLists() bool loadMnemonicWordLists()
{ {
for (int i = 0; i < MNEMONIC_MAX; i++) { for (int i = 0; i < MNEMONIC_MAX; i++) {
int iResult = 0; int iResult = 0;
switch (i) { switch (i) {
case MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER: case MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER:
iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_german, g_mnemonic_german_original_size, g_mnemonic_german_compressed_size); iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_german, g_mnemonic_german_original_size, g_mnemonic_german_compressed_size);
if (iResult) { if (iResult) {
printf("[%s] error init german mnemonic set, error nr: %d\n", __FUNCTION__, iResult); printf("[%s] error init german mnemonic set, error nr: %d\n", __FUNCTION__, iResult);
return false; return false;
} }
g_Mnemonic_WordLists[i].printToFile("de_words.txt"); g_Mnemonic_WordLists[i].printToFile("de_words.txt");
break; break;
case MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES: case MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES:
iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_german2, g_mnemonic_german2_original_size, g_mnemonic_german2_compressed_size); iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_german2, g_mnemonic_german2_original_size, g_mnemonic_german2_compressed_size);
if (iResult) { if (iResult) {
printf("[%s] error init german mnemonic set 2, error nr: %d\n", __FUNCTION__, iResult); printf("[%s] error init german mnemonic set 2, error nr: %d\n", __FUNCTION__, iResult);
return false; return false;
} }
g_Mnemonic_WordLists[i].printToFile("de_words2.txt"); g_Mnemonic_WordLists[i].printToFile("de_words2.txt");
break; break;
case MNEMONIC_BIP0039_SORTED_ORDER: case MNEMONIC_BIP0039_SORTED_ORDER:
iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_bip0039, g_mnemonic_bip0039_original_size, g_mnemonic_bip0039_compressed_size); iResult = g_Mnemonic_WordLists[i].init(populate_mnemonic_bip0039, g_mnemonic_bip0039_original_size, g_mnemonic_bip0039_compressed_size);
if (iResult) { if (iResult) {
printf("[%s] error init bip0039 mnemonic set, error nr: %d\n", __FUNCTION__, iResult); printf("[%s] error init bip0039 mnemonic set, error nr: %d\n", __FUNCTION__, iResult);
return false; return false;
} }
//g_Mnemonic_WordLists[i].printToFile("en_words.txt"); //g_Mnemonic_WordLists[i].printToFile("en_words.txt");
break; break;
default: printf("[%s] unknown MnemonicType\n", __FUNCTION__); return false; default: printf("[%s] unknown MnemonicType\n", __FUNCTION__); return false;
} }
} }
return true; return true;
} }
bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg) bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg)
{ {
auto serverKey = cfg.getString("crypto.server_key"); auto serverKey = cfg.getString("crypto.server_key");
unsigned char key[crypto_shorthash_KEYBYTES]; unsigned char key[crypto_shorthash_KEYBYTES];
size_t realBinSize = 0; size_t realBinSize = 0;
NULLPAD_10; NULLPAD_10;
if (sodium_hex2bin(key, crypto_shorthash_KEYBYTES, serverKey.data(), serverKey.size(), nullptr, &realBinSize, nullptr)) { 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()); printf("[%s] serverKey isn't valid hex: %s\n", __FUNCTION__, serverKey.data());
return false; return false;
} }
if (realBinSize != crypto_shorthash_KEYBYTES) { if (realBinSize != crypto_shorthash_KEYBYTES) {
printf("[%s] serverKey hasn't valid size, expecting: %u, get: %lu\n", printf("[%s] serverKey hasn't valid size, expecting: %u, get: %lu\n",
__FUNCTION__, crypto_shorthash_KEYBYTES, realBinSize); __FUNCTION__, crypto_shorthash_KEYBYTES, realBinSize);
return false; return false;
} }
g_ServerCryptoKey = new ObfusArray(realBinSize, key); g_ServerCryptoKey = new ObfusArray(realBinSize, key);
g_ServerKeySeed = new ObfusArray(9*8); g_ServerKeySeed = new ObfusArray(9*8);
Poco::Int64 i1 = randombytes_random(); Poco::Int64 i1 = randombytes_random();
Poco::Int64 i2 = randombytes_random(); Poco::Int64 i2 = randombytes_random();
g_ServerKeySeed->put(0, i1 | (i2 << 8)); g_ServerKeySeed->put(0, i1 | (i2 << 8));
//g_ServerAdminPublic = cfg.getString("crypto.server_admin_public"); //g_ServerAdminPublic = cfg.getString("crypto.server_admin_public");
DISASM_FALSERET; DISASM_FALSERET;
g_SessionTimeout = cfg.getInt("session.timeout", SESSION_TIMEOUT_DEFAULT); g_SessionTimeout = cfg.getInt("session.timeout", SESSION_TIMEOUT_DEFAULT);
g_serverPath = cfg.getString("loginServer.path", ""); g_serverPath = cfg.getString("loginServer.path", "");
replaceZeroIPWithLocalhostIP(g_serverPath); replaceZeroIPWithLocalhostIP(g_serverPath);
g_default_locale = LanguageManager::languageFromString(cfg.getString("loginServer.default_locale")); g_default_locale = LanguageManager::languageFromString(cfg.getString("loginServer.default_locale"));
g_serverPort = cfg.getInt("loginServer.port", 0); g_serverPort = cfg.getInt("loginServer.port", 0);
g_phpServerPort = cfg.getInt("phpServer.port", 0); g_phpServerPort = cfg.getInt("phpServer.port", 0);
// replace 0.0.0.0 with actual server ip // replace 0.0.0.0 with actual server ip
g_php_serverPath = cfg.getString("phpServer.url", ""); g_php_serverPath = cfg.getString("phpServer.url", "");
replaceZeroIPWithLocalhostIP(g_php_serverPath); replaceZeroIPWithLocalhostIP(g_php_serverPath);
g_php_serverHost = cfg.getString("phpServer.host", ""); g_php_serverHost = cfg.getString("phpServer.host", "");
replaceZeroIPWithLocalhostIP(g_php_serverHost); replaceZeroIPWithLocalhostIP(g_php_serverHost);
//g_ServerSetupType //g_ServerSetupType
auto serverSetupTypeString = cfg.getString("ServerSetupType", ""); auto serverSetupTypeString = cfg.getString("ServerSetupType", "");
g_ServerSetupType = getServerSetupTypeFromString(serverSetupTypeString); g_ServerSetupType = getServerSetupTypeFromString(serverSetupTypeString);
// app secret for encrypt user private keys // app secret for encrypt user private keys
// TODO: encrypt with server admin key // TODO: encrypt with server admin key
auto app_secret_string = cfg.getString("crypto.app_secret", ""); auto app_secret_string = cfg.getString("crypto.app_secret", "");
if ("" != app_secret_string) { if ("" != app_secret_string) {
g_CryptoAppSecret = DataTypeConverter::hexToBin(app_secret_string); g_CryptoAppSecret = DataTypeConverter::hexToBin(app_secret_string);
} }
//g_CryptoAppSecret //g_CryptoAppSecret
g_gRPCRelayServerFullURL = cfg.getString("grpc.server", ""); g_gRPCRelayServerFullURL = cfg.getString("grpc.server", "");
// unsecure flags // unsecure flags
//g_AllowUnsecureFlags //g_AllowUnsecureFlags
if (cfg.getInt("unsecure.allow_passwort_via_json_request", 0) == 1) { if (cfg.getInt("unsecure.allow_passwort_via_json_request", 0) == 1) {
g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_PASSWORD_REQUESTS); g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_PASSWORD_REQUESTS);
} }
if (cfg.getInt("unsecure.allow_auto_sign_transactions", 0) == 1) { if (cfg.getInt("unsecure.allow_auto_sign_transactions", 0) == 1) {
g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_AUTO_SIGN_TRANSACTIONS); g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_AUTO_SIGN_TRANSACTIONS);
} }
if (cfg.getInt("unsecure.allow_cors_all", 0) == 1) { if (cfg.getInt("unsecure.allow_cors_all", 0) == 1) {
g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_CORS_ALL); g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_CORS_ALL);
} }
if (cfg.getInt("unsecure.allow_all_passwords", 0) == 1) { if (cfg.getInt("unsecure.allow_all_passwords", 0) == 1) {
g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_ALLOW_ALL_PASSWORDS); g_AllowUnsecureFlags = (AllowUnsecure)(g_AllowUnsecureFlags | UNSECURE_ALLOW_ALL_PASSWORDS);
} }
return true; return true;
} }
bool initEMailAccount(const Poco::Util::LayeredConfiguration& cfg) bool initEMailAccount(const Poco::Util::LayeredConfiguration& cfg)
{ {
g_disableEmail = cfg.getBool("email.disable", false); g_disableEmail = cfg.getBool("email.disable", false);
if (g_disableEmail) { if (g_disableEmail) {
printf("Email is disabled!\n"); printf("Email is disabled!\n");
} }
else { else {
g_EmailAccount.sender = cfg.getString("email.sender"); g_EmailAccount.sender = cfg.getString("email.sender");
g_EmailAccount.username = cfg.getString("email.username"); g_EmailAccount.username = cfg.getString("email.username");
g_EmailAccount.password = cfg.getString("email.password"); g_EmailAccount.password = cfg.getString("email.password");
g_EmailAccount.url = cfg.getString("email.smtp.url"); g_EmailAccount.url = cfg.getString("email.smtp.url");
g_EmailAccount.port = cfg.getInt("email.smtp.port"); g_EmailAccount.port = cfg.getInt("email.smtp.port");
} }
DISASM_FALSERET; DISASM_FALSERET;
//g_ServerKeySeed->put(3, DRRandom::r64()); //g_ServerKeySeed->put(3, DRRandom::r64());
return true; return true;
} }
bool initSSLClientContext() bool initSSLClientContext()
{ {
SharedPtr<InvalidCertificateHandler> pCert = new RejectCertificateHandler(false); // reject invalid certificates SharedPtr<InvalidCertificateHandler> pCert = new RejectCertificateHandler(false); // reject invalid certificates
/* /*
Context(Usage usage, Context(Usage usage,
const std::string& certificateNameOrPath, const std::string& certificateNameOrPath,
VerificationMode verMode = VERIFY_RELAXED, VerificationMode verMode = VERIFY_RELAXED,
int options = OPT_DEFAULTS, int options = OPT_DEFAULTS,
const std::string& certificateStoreName = CERT_STORE_MY); const std::string& certificateStoreName = CERT_STORE_MY);
*/ */
try { try {
#ifdef POCO_NETSSL_WIN #ifdef POCO_NETSSL_WIN
g_SSL_CLient_Context = new Context(Context::CLIENT_USE, "cacert.pem", Context::VERIFY_RELAXED, Context::OPT_DEFAULTS); g_SSL_CLient_Context = new Context(Context::CLIENT_USE, "cacert.pem", Context::VERIFY_RELAXED, Context::OPT_DEFAULTS);
#else #else
g_SSL_CLient_Context = new Context(Context::CLIENT_USE, "", "", Poco::Path::config() + "grd_login/cacert.pem", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); g_SSL_CLient_Context = new Context(Context::CLIENT_USE, "", "", Poco::Path::config() + "grd_login/cacert.pem", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
#endif #endif
} catch(Poco::Exception& ex) { } catch(Poco::Exception& ex) {
printf("[ServerConfig::initSSLClientContext] error init ssl context, maybe no cacert.pem found?\nPlease make sure you have cacert.pem (CA/root certificates) next to binary from https://curl.haxx.se/docs/caextract.html\n"); printf("[ServerConfig::initSSLClientContext] error init ssl context, maybe no cacert.pem found?\nPlease make sure you have cacert.pem (CA/root certificates) next to binary from https://curl.haxx.se/docs/caextract.html\n");
return false; return false;
} }
DISASM_FALSERET; DISASM_FALSERET;
SSLManager::instance().initializeClient(0, pCert, g_SSL_CLient_Context); SSLManager::instance().initializeClient(0, pCert, g_SSL_CLient_Context);
g_ServerKeySeed->put(5, DRRandom::r64()); g_ServerKeySeed->put(5, DRRandom::r64());
return true; return true;
} }
void unload() { void unload() {
if (g_ServerCryptoKey) { if (g_ServerCryptoKey) {
delete g_ServerCryptoKey; delete g_ServerCryptoKey;
} }
if (g_ServerKeySeed) { if (g_ServerKeySeed) {
delete g_ServerKeySeed; delete g_ServerKeySeed;
} }
if (g_CPUScheduler) { if (g_CPUScheduler) {
delete g_CPUScheduler; delete g_CPUScheduler;
} }
if (g_CryptoCPUScheduler) { if (g_CryptoCPUScheduler) {
delete g_CryptoCPUScheduler; delete g_CryptoCPUScheduler;
} }
if (g_CryptoAppSecret) { if (g_CryptoAppSecret) {
MemoryManager::getInstance()->releaseMemory(g_CryptoAppSecret); MemoryManager::getInstance()->releaseMemory(g_CryptoAppSecret);
g_CryptoAppSecret = nullptr; g_CryptoAppSecret = nullptr;
} }
} }
void writeToFile(std::istream& datas, std::string fileName) void writeToFile(std::istream& datas, std::string fileName)
{ {
static Poco::Mutex mutex; static Poco::Mutex mutex;
mutex.lock(); mutex.lock();
Poco::FileOutputStream file(fileName, std::ios::out | std::ios::app); Poco::FileOutputStream file(fileName, std::ios::out | std::ios::app);
if (!file.good()) { if (!file.good()) {
printf("[ServerConfig::writeToFile] error creating file with name: %s\n", fileName.data()); printf("[ServerConfig::writeToFile] error creating file with name: %s\n", fileName.data());
mutex.unlock(); mutex.unlock();
return; return;
} }
Poco::LocalDateTime now; Poco::LocalDateTime now;
std::string dateTimeStr = Poco::DateTimeFormatter::format(now, Poco::DateTimeFormat::ISO8601_FORMAT); std::string dateTimeStr = Poco::DateTimeFormatter::format(now, Poco::DateTimeFormat::ISO8601_FORMAT);
file << dateTimeStr << std::endl; file << dateTimeStr << std::endl;
for (std::string line; std::getline(datas, line); ) { for (std::string line; std::getline(datas, line); ) {
file << line << std::endl; file << line << std::endl;
} }
file << std::endl; file << std::endl;
file.close(); file.close();
mutex.unlock(); mutex.unlock();
} }
} }

View File

@ -1,90 +1,90 @@
#ifndef __GRADIDO_LOGIN_SERVER_SERVER_CONFIG__ #ifndef __GRADIDO_LOGIN_SERVER_SERVER_CONFIG__
#define __GRADIDO_LOGIN_SERVER_SERVER_CONFIG__ #define __GRADIDO_LOGIN_SERVER_SERVER_CONFIG__
#include "Crypto/mnemonic.h" #include "Crypto/mnemonic.h"
#include "Crypto/Obfus_array.h" #include "Crypto/Obfus_array.h"
#include "Poco/Util/LayeredConfiguration.h" #include "Poco/Util/LayeredConfiguration.h"
#include "Poco/Net/Context.h" #include "Poco/Net/Context.h"
#include "Poco/Types.h" #include "Poco/Types.h"
#include "Poco/Util/Timer.h" #include "Poco/Util/Timer.h"
#include "tasks/CPUSheduler.h" #include "tasks/CPUSheduler.h"
#include "SingletonManager/LanguageManager.h" #include "SingletonManager/LanguageManager.h"
#include "SingletonManager/MemoryManager.h" #include "SingletonManager/MemoryManager.h"
#define DISABLE_EMAIL #define DISABLE_EMAIL
namespace ServerConfig { namespace ServerConfig {
enum Mnemonic_Types { enum Mnemonic_Types {
MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER, MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER,
MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES, MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES,
MNEMONIC_BIP0039_SORTED_ORDER, MNEMONIC_BIP0039_SORTED_ORDER,
MNEMONIC_MAX MNEMONIC_MAX
}; };
// depracted, moved to email manager // depracted, moved to email manager
struct EmailAccount { struct EmailAccount {
std::string sender; std::string sender;
std::string admin_receiver; std::string admin_receiver;
std::string username; std::string username;
std::string password; std::string password;
std::string url; std::string url;
int port; int port;
}; };
enum ServerSetupType { enum ServerSetupType {
SERVER_TYPE_TEST, SERVER_TYPE_TEST,
SERVER_TYPE_STAGING, SERVER_TYPE_STAGING,
SERVER_TYPE_PRODUCTION SERVER_TYPE_PRODUCTION
}; };
// used with bit-operators, so only use numbers with control exactly one bit (1,2,4,8,16...) // used with bit-operators, so only use numbers with control exactly one bit (1,2,4,8,16...)
enum AllowUnsecure { enum AllowUnsecure {
NOT_UNSECURE = 0, NOT_UNSECURE = 0,
UNSECURE_PASSWORD_REQUESTS = 1, UNSECURE_PASSWORD_REQUESTS = 1,
UNSECURE_AUTO_SIGN_TRANSACTIONS = 2, UNSECURE_AUTO_SIGN_TRANSACTIONS = 2,
UNSECURE_CORS_ALL = 4, UNSECURE_CORS_ALL = 4,
UNSECURE_ALLOW_ALL_PASSWORDS = 8 UNSECURE_ALLOW_ALL_PASSWORDS = 8
}; };
extern Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX]; extern Mnemonic g_Mnemonic_WordLists[MNEMONIC_MAX];
extern ObfusArray* g_ServerCryptoKey; extern ObfusArray* g_ServerCryptoKey;
extern ObfusArray* g_ServerKeySeed; extern ObfusArray* g_ServerKeySeed;
//extern unsigned char g_ServerAdminPublic[]; //extern unsigned char g_ServerAdminPublic[];
extern UniLib::controller::CPUSheduler* g_CPUScheduler; extern UniLib::controller::CPUSheduler* g_CPUScheduler;
extern UniLib::controller::CPUSheduler* g_CryptoCPUScheduler; extern UniLib::controller::CPUSheduler* g_CryptoCPUScheduler;
extern Poco::Net::Context::Ptr g_SSL_CLient_Context; extern Poco::Net::Context::Ptr g_SSL_CLient_Context;
extern Poco::Util::Timer g_CronJobsTimer; extern Poco::Util::Timer g_CronJobsTimer;
extern EmailAccount g_EmailAccount; extern EmailAccount g_EmailAccount;
extern int g_SessionTimeout; extern int g_SessionTimeout;
extern std::string g_serverPath; extern std::string g_serverPath;
extern int g_serverPort; extern int g_serverPort;
extern Languages g_default_locale; extern Languages g_default_locale;
extern std::string g_php_serverPath; extern std::string g_php_serverPath;
extern std::string g_php_serverHost; extern std::string g_php_serverHost;
extern int g_phpServerPort; extern int g_phpServerPort;
extern Poco::Mutex g_TimeMutex; extern Poco::Mutex g_TimeMutex;
extern int g_FakeLoginSleepTime; extern int g_FakeLoginSleepTime;
extern std::string g_versionString; extern std::string g_versionString;
extern bool g_disableEmail; extern bool g_disableEmail;
extern ServerSetupType g_ServerSetupType; extern ServerSetupType g_ServerSetupType;
extern std::string g_gRPCRelayServerFullURL; extern std::string g_gRPCRelayServerFullURL;
extern MemoryBin* g_CryptoAppSecret; extern MemoryBin* g_CryptoAppSecret;
extern AllowUnsecure g_AllowUnsecureFlags; extern AllowUnsecure g_AllowUnsecureFlags;
bool loadMnemonicWordLists(); bool loadMnemonicWordLists();
bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg); bool initServerCrypto(const Poco::Util::LayeredConfiguration& cfg);
bool initEMailAccount(const Poco::Util::LayeredConfiguration& cfg); bool initEMailAccount(const Poco::Util::LayeredConfiguration& cfg);
bool initSSLClientContext(); bool initSSLClientContext();
void writeToFile(std::istream& datas, std::string fileName); void writeToFile(std::istream& datas, std::string fileName);
void unload(); void unload();
}; };
#endif //__GRADIDO_LOGIN_SERVER_SERVER_CONFIG__ #endif //__GRADIDO_LOGIN_SERVER_SERVER_CONFIG__

File diff suppressed because it is too large Load Diff

View File

@ -1,63 +1,63 @@
/*! /*!
* *
* \author: einhornimmond * \author: einhornimmond
* *
* \date: 07.03.19 * \date: 07.03.19
* *
* \brief: error data * \brief: error data
*/ */
#ifndef DR_LUA_WEB_MODULE_ERROR_ERROR_H #ifndef DR_LUA_WEB_MODULE_ERROR_ERROR_H
#define DR_LUA_WEB_MODULE_ERROR_ERROR_H #define DR_LUA_WEB_MODULE_ERROR_ERROR_H
#include <string> #include <string>
#include <sstream> #include <sstream>
class Error class Error
{ {
public: public:
Error(const char* functionName, const char* message); Error(const char* functionName, const char* message);
~Error(); ~Error();
const char* getFunctionName() { return mFunctionName.data(); } const char* getFunctionName() { return mFunctionName.data(); }
const char* getMessage() { return mMessage.data(); } const char* getMessage() { return mMessage.data(); }
virtual std::string getString(bool withNewline = true); virtual std::string getString(bool withNewline = true);
virtual std::string getHtmlString(); virtual std::string getHtmlString();
protected: protected:
std::string mFunctionName; std::string mFunctionName;
std::string mMessage; std::string mMessage;
}; };
class ParamError : public Error class ParamError : public Error
{ {
public: public:
ParamError(const char* functionName, const char* message, const char* param) ParamError(const char* functionName, const char* message, const char* param)
: Error(functionName, message), mParam(param) {} : Error(functionName, message), mParam(param) {}
ParamError(const char* functionName, const char* message, const std::string& param) ParamError(const char* functionName, const char* message, const std::string& param)
: Error(functionName, message), mParam(param) {} : Error(functionName, message), mParam(param) {}
ParamError(const char* functioName, const char* message, int param) ParamError(const char* functioName, const char* message, int param)
: Error(functioName, message) { : Error(functioName, message) {
std::stringstream ss; std::stringstream ss;
ss << param; ss << param;
mParam = ss.str(); mParam = ss.str();
} }
virtual std::string getString(bool withNewline = true); virtual std::string getString(bool withNewline = true);
virtual std::string getHtmlString(); virtual std::string getHtmlString();
protected: protected:
std::string mParam; std::string mParam;
}; };
class IErrorCollection class IErrorCollection
{ {
public: public:
virtual void addError(Error*, bool log = true) = 0; virtual void addError(Error*, bool log = true) = 0;
}; };
#endif // DR_LUA_WEB_MODULE_ERROR_ERROR_H #endif // DR_LUA_WEB_MODULE_ERROR_ERROR_H

View File

@ -1,201 +1,201 @@
#include "ErrorList.h" #include "ErrorList.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
//#include "Poco/Net/MailMessage.h" //#include "Poco/Net/MailMessage.h"
#include "Poco/Net/MediaType.h" #include "Poco/Net/MediaType.h"
#include "../SingletonManager/EmailManager.h" #include "../SingletonManager/EmailManager.h"
SendErrorMessage::~SendErrorMessage() SendErrorMessage::~SendErrorMessage()
{ {
if (mMessage) { if (mMessage) {
delete mMessage; delete mMessage;
mMessage = nullptr; mMessage = nullptr;
} }
} }
int SendErrorMessage::run() int SendErrorMessage::run()
{ {
if (ServerConfig::g_disableEmail) return 0; if (ServerConfig::g_disableEmail) return 0;
auto mailClientSession = new Poco::Net::SecureSMTPClientSession(ServerConfig::g_EmailAccount.url, ServerConfig::g_EmailAccount.port); auto mailClientSession = new Poco::Net::SecureSMTPClientSession(ServerConfig::g_EmailAccount.url, ServerConfig::g_EmailAccount.port);
mailClientSession->login(); mailClientSession->login();
mailClientSession->startTLS(ServerConfig::g_SSL_CLient_Context); mailClientSession->startTLS(ServerConfig::g_SSL_CLient_Context);
mailClientSession->login(Poco::Net::SMTPClientSession::AUTH_LOGIN, ServerConfig::g_EmailAccount.username, ServerConfig::g_EmailAccount.password); mailClientSession->login(Poco::Net::SMTPClientSession::AUTH_LOGIN, ServerConfig::g_EmailAccount.username, ServerConfig::g_EmailAccount.password);
try { try {
mMessage->setSender(ServerConfig::g_EmailAccount.sender); mMessage->setSender(ServerConfig::g_EmailAccount.sender);
mailClientSession->sendMessage(*mMessage); mailClientSession->sendMessage(*mMessage);
mailClientSession->close(); mailClientSession->close();
} }
catch (Poco::Exception& exc) { catch (Poco::Exception& exc) {
printf("[SendErrorMessage::%s] error sending error message to admin: %s\n", printf("[SendErrorMessage::%s] error sending error message to admin: %s\n",
__FUNCTION__, exc.displayText().data()); __FUNCTION__, exc.displayText().data());
return -1; return -1;
} }
return 0; return 0;
} }
// ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------
ErrorList::ErrorList() ErrorList::ErrorList()
: mLogging(Poco::Logger::get("errorLog")) : mLogging(Poco::Logger::get("errorLog"))
{ {
} }
ErrorList::~ErrorList() ErrorList::~ErrorList()
{ {
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
delete mErrorStack.top(); delete mErrorStack.top();
mErrorStack.pop(); mErrorStack.pop();
} }
} }
void ErrorList::addError(Error* error, bool log/* = true */) void ErrorList::addError(Error* error, bool log/* = true */)
{ {
if (log) { if (log) {
std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S"); std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S");
mLogging.error("%s [ErrorList::addError] %s", dateTimeString, error->getString(false)); mLogging.error("%s [ErrorList::addError] %s", dateTimeString, error->getString(false));
} }
mErrorStack.push(error); mErrorStack.push(error);
} }
Error* ErrorList::getLastError() Error* ErrorList::getLastError()
{ {
if (mErrorStack.size() == 0) { if (mErrorStack.size() == 0) {
return nullptr; return nullptr;
} }
Error* error = mErrorStack.top(); Error* error = mErrorStack.top();
if (error) { if (error) {
mErrorStack.pop(); mErrorStack.pop();
} }
return error; return error;
} }
void ErrorList::clearErrors() void ErrorList::clearErrors()
{ {
while (mErrorStack.size()) { while (mErrorStack.size()) {
auto error = mErrorStack.top(); auto error = mErrorStack.top();
if (error) { if (error) {
delete error; delete error;
} }
mErrorStack.pop(); mErrorStack.pop();
} }
} }
int ErrorList::getErrors(ErrorList* send) int ErrorList::getErrors(ErrorList* send)
{ {
Error* error = nullptr; Error* error = nullptr;
int iCount = 0; int iCount = 0;
while (error = send->getLastError()) { while (error = send->getLastError()) {
addError(error, false); addError(error, false);
iCount++; iCount++;
} }
return iCount; return iCount;
} }
void ErrorList::printErrors() void ErrorList::printErrors()
{ {
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
auto error = mErrorStack.top(); auto error = mErrorStack.top();
mErrorStack.pop(); mErrorStack.pop();
printf(error->getString().data()); printf(error->getString().data());
delete error; delete error;
} }
} }
std::vector<std::string> ErrorList::getErrorsArray() std::vector<std::string> ErrorList::getErrorsArray()
{ {
std::vector<std::string> result; std::vector<std::string> result;
result.reserve(mErrorStack.size()); result.reserve(mErrorStack.size());
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
auto error = mErrorStack.top(); auto error = mErrorStack.top();
mErrorStack.pop(); mErrorStack.pop();
//result->add(error->getString()); //result->add(error->getString());
result.push_back(error->getString()); result.push_back(error->getString());
delete error; delete error;
} }
return result; return result;
} }
std::string ErrorList::getErrorsHtml() std::string ErrorList::getErrorsHtml()
{ {
std::string res; std::string res;
res = "<ul class='grd-no-style'>"; res = "<ul class='grd-no-style'>";
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
auto error = mErrorStack.top(); auto error = mErrorStack.top();
mErrorStack.pop(); mErrorStack.pop();
res += "<li class='grd-error'>"; res += "<li class='grd-error'>";
res += error->getHtmlString(); res += error->getHtmlString();
res += "</li>"; res += "</li>";
delete error; delete error;
} }
res += "</ul>"; res += "</ul>";
return res; return res;
} }
std::string ErrorList::getErrorsHtmlNewFormat() std::string ErrorList::getErrorsHtmlNewFormat()
{ {
std::string html; std::string html;
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
auto error = std::unique_ptr<Error>(mErrorStack.top()); auto error = std::unique_ptr<Error>(mErrorStack.top());
mErrorStack.pop(); mErrorStack.pop();
html += "<div class=\"alert alert-error\" role=\"alert\">"; html += "<div class=\"alert alert-error\" role=\"alert\">";
html += "<i class=\"material-icons-outlined\">report_problem</i>"; html += "<i class=\"material-icons-outlined\">report_problem</i>";
html += "<span>"; html += "<span>";
html += error->getHtmlString(); html += error->getHtmlString();
html += "</span>"; html += "</span>";
html += "</div>"; html += "</div>";
} }
return html; return html;
} }
/* /*
<div class="alert alert-error" role="alert"> <div class="alert alert-error" role="alert">
<i class="material-icons-outlined">report_problem</i> <i class="material-icons-outlined">report_problem</i>
<span>Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?</span> <span>Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?</span>
</div> </div>
*/ */
void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/) void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/)
{ {
auto em = EmailManager::getInstance(); auto em = EmailManager::getInstance();
/*auto message = new Poco::Net::MailMessage(); /*auto message = new Poco::Net::MailMessage();
message->setSender("gradido_loginServer@gradido.net"); message->setSender("gradido_loginServer@gradido.net");
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***")); message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
message->setSubject("Error from Gradido Login Server"); message->setSubject("Error from Gradido Login Server");
*/ */
std::string content; std::string content;
while (mErrorStack.size() > 0) { while (mErrorStack.size() > 0) {
auto error = mErrorStack.top(); auto error = mErrorStack.top();
mErrorStack.pop(); mErrorStack.pop();
content += error->getString(); content += error->getString();
delete error; delete error;
} }
auto email = new model::Email(content, model::EMAIL_ERROR); auto email = new model::Email(content, model::EMAIL_ERROR);
//message->addContent(new Poco::Net::StringPartSource(content)); //message->addContent(new Poco::Net::StringPartSource(content));
if (rawHtml != "") { if (rawHtml != "") {
Poco::Net::MediaType mt("text", "html"); Poco::Net::MediaType mt("text", "html");
mt.setParameter("charset", "utf-8"); mt.setParameter("charset", "utf-8");
email->addContent(new Poco::Net::StringPartSource(rawHtml, mt.toString())); email->addContent(new Poco::Net::StringPartSource(rawHtml, mt.toString()));
} }
em->addEmail(email); em->addEmail(email);
//UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler)); //UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
//sendErrorMessageTask->scheduleTask(sendErrorMessageTask); //sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
} }

View File

@ -1,76 +1,76 @@
/*! /*!
* *
* \author: einhornimmond * \author: einhornimmond
* *
* \date: 07.03.19 * \date: 07.03.19
* *
* \brief: error * \brief: error
*/ */
#ifndef DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H #ifndef DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H
#define DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H #define DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H
#include "Error.h" #include "Error.h"
#include <stack> #include <stack>
#include "../tasks/CPUTask.h" #include "../tasks/CPUTask.h"
#include "Poco/Net/SecureSMTPClientSession.h" #include "Poco/Net/SecureSMTPClientSession.h"
#include "Poco/Net/StringPartSource.h" #include "Poco/Net/StringPartSource.h"
#include "Poco/Logger.h" #include "Poco/Logger.h"
#include "Poco/JSON/Array.h" #include "Poco/JSON/Array.h"
class ErrorList : public IErrorCollection class ErrorList : public IErrorCollection
{ {
public: public:
ErrorList(); ErrorList();
~ErrorList(); ~ErrorList();
// push error, error will be deleted in deconstructor // push error, error will be deleted in deconstructor
virtual void addError(Error* error, bool log = true); virtual void addError(Error* error, bool log = true);
// return error on top of stack, please delete after using // return error on top of stack, please delete after using
Error* getLastError(); Error* getLastError();
inline size_t errorCount() { return mErrorStack.size(); } inline size_t errorCount() { return mErrorStack.size(); }
// delete all errors // delete all errors
void clearErrors(); void clearErrors();
static int moveErrors(ErrorList* recv, ErrorList* send) { static int moveErrors(ErrorList* recv, ErrorList* send) {
return recv->getErrors(send); return recv->getErrors(send);
} }
int getErrors(ErrorList* send); int getErrors(ErrorList* send);
void printErrors(); void printErrors();
std::string getErrorsHtml(); std::string getErrorsHtml();
std::string getErrorsHtmlNewFormat(); std::string getErrorsHtmlNewFormat();
std::vector<std::string> getErrorsArray(); std::vector<std::string> getErrorsArray();
void sendErrorsAsEmail(std::string rawHtml = ""); void sendErrorsAsEmail(std::string rawHtml = "");
protected: protected:
std::stack<Error*> mErrorStack; std::stack<Error*> mErrorStack;
// poco logging // poco logging
Poco::Logger& mLogging; Poco::Logger& mLogging;
}; };
class SendErrorMessage : public UniLib::controller::CPUTask class SendErrorMessage : public UniLib::controller::CPUTask
{ {
public: public:
SendErrorMessage(Poco::Net::MailMessage* message, UniLib::controller::CPUSheduler* scheduler) SendErrorMessage(Poco::Net::MailMessage* message, UniLib::controller::CPUSheduler* scheduler)
: UniLib::controller::CPUTask(scheduler), mMessage(message) {} : UniLib::controller::CPUTask(scheduler), mMessage(message) {}
~SendErrorMessage(); ~SendErrorMessage();
virtual int run(); virtual int run();
const char* getResourceType() const { return "SendErrorMessage"; }; const char* getResourceType() const { return "SendErrorMessage"; };
protected: protected:
Poco::Net::MailMessage* mMessage; Poco::Net::MailMessage* mMessage;
}; };
#endif // DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H #endif // DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H

View File

@ -1,57 +1,57 @@
#include "Gradido_LoginServer.h" #include "Gradido_LoginServer.h"
#include <sodium.h> #include <sodium.h>
#include "proto/gradido/TransactionBody.pb.h" #include "proto/gradido/TransactionBody.pb.h"
#include "model/User.h" #include "model/User.h"
#include "model/Session.h" #include "model/Session.h"
#include "lib/Profiler.h" #include "lib/Profiler.h"
#include "ServerConfig.h" #include "ServerConfig.h"
#include "ImportantTests.h" #include "ImportantTests.h"
#include "model/table/User.h" #include "model/table/User.h"
#include "model/table/EmailOptIn.h" #include "model/table/EmailOptIn.h"
#include "Poco/DateTimeParser.h" #include "Poco/DateTimeParser.h"
#ifndef _TEST_BUILD #ifndef _TEST_BUILD
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
GOOGLE_PROTOBUF_VERIFY_VERSION; GOOGLE_PROTOBUF_VERIFY_VERSION;
if (sodium_init() < 0) { if (sodium_init() < 0) {
/* panic! the library couldn't be initialized, it is not safe to use */ /* panic! the library couldn't be initialized, it is not safe to use */
printf("error initializing sodium, early exit\n"); printf("error initializing sodium, early exit\n");
return -1; return -1;
} }
std::string dateTimeString = __DATE__; std::string dateTimeString = __DATE__;
//printf("Building date time string: %s\n", dateTimeString.data()); //printf("Building date time string: %s\n", dateTimeString.data());
std::string formatString("%b %d %Y"); std::string formatString("%b %d %Y");
int timeZone = 0; int timeZone = 0;
Poco::DateTime buildDateTime = Poco::DateTimeParser::parse(formatString, dateTimeString, timeZone); Poco::DateTime buildDateTime = Poco::DateTimeParser::parse(formatString, dateTimeString, timeZone);
ServerConfig::g_versionString = Poco::DateTimeFormatter::format(buildDateTime, "0.%y.%m.%d"); ServerConfig::g_versionString = Poco::DateTimeFormatter::format(buildDateTime, "0.%y.%m.%d");
//ServerConfig::g_versionString = "0.20.KW13.02"; //ServerConfig::g_versionString = "0.20.KW13.02";
printf("Version: %s\n", ServerConfig::g_versionString.data()); printf("Version: %s\n", ServerConfig::g_versionString.data());
printf("User size: %d Bytes, Session size: %d Bytes\n", sizeof(User), sizeof(Session)); printf("User size: %d Bytes, Session size: %d Bytes\n", sizeof(User), sizeof(Session));
printf("model sizes: User: %d Bytes, EmailOptIn: %d Bytes\n", sizeof(model::table::User), sizeof(model::table::EmailOptIn)); printf("model sizes: User: %d Bytes, EmailOptIn: %d Bytes\n", sizeof(model::table::User), sizeof(model::table::EmailOptIn));
// load word lists // load word lists
if (!ServerConfig::loadMnemonicWordLists()) { if (!ServerConfig::loadMnemonicWordLists()) {
//printf("[Gradido_LoginServer::%s] error loading mnemonic Word List\n", __FUNCTION__); //printf("[Gradido_LoginServer::%s] error loading mnemonic Word List\n", __FUNCTION__);
printf("[Gradido_LoginServer::main] error loading mnemonic Word List"); printf("[Gradido_LoginServer::main] error loading mnemonic Word List");
return -2; return -2;
} }
if (!ImportantTests::passphraseGenerationAndTransformation()) { if (!ImportantTests::passphraseGenerationAndTransformation()) {
printf("test passphrase generation and transformation failed\n"); printf("test passphrase generation and transformation failed\n");
return -3; return -3;
} }
Gradido_LoginServer app; Gradido_LoginServer app;
app.setUnixOptions(true); app.setUnixOptions(true);
return app.run(argc, argv); return app.run(argc, argv);
} }
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,282 +1,282 @@
/*! /*!
* *
* \author: einhornimmond * \author: einhornimmond
* *
* \date: 02.03.19 * \date: 02.03.19
* *
* \brief: store session data * \brief: store session data
*/ */
#ifndef DR_LUA_WEB_MODULE_SESSION_SESSION_H #ifndef DR_LUA_WEB_MODULE_SESSION_SESSION_H
#define DR_LUA_WEB_MODULE_SESSION_SESSION_H #define DR_LUA_WEB_MODULE_SESSION_SESSION_H
#include "../lib/ErrorList.h" #include "../lib/ErrorList.h"
#include "User.h" #include "User.h"
#include "../controller/User.h" #include "../controller/User.h"
#include "../lib/MultithreadContainer.h" #include "../lib/MultithreadContainer.h"
#include "../tasks/ProcessingTransaction.h" #include "../tasks/ProcessingTransaction.h"
#include "../SingletonManager/LanguageManager.h" #include "../SingletonManager/LanguageManager.h"
#include "../controller/EmailVerificationCode.h" #include "../controller/EmailVerificationCode.h"
#include "Poco/Thread.h" #include "Poco/Thread.h"
#include "Poco/Types.h" #include "Poco/Types.h"
#include "Poco/DateTime.h" #include "Poco/DateTime.h"
#include "Poco/Net/IPAddress.h" #include "Poco/Net/IPAddress.h"
#include "Poco/Net/HTTPCookie.h" #include "Poco/Net/HTTPCookie.h"
#include <mutex> #include <mutex>
class WriteEmailVerification; class WriteEmailVerification;
enum SessionStates { enum SessionStates {
SESSION_STATE_EMPTY, SESSION_STATE_EMPTY,
SESSION_STATE_CRYPTO_KEY_GENERATED, SESSION_STATE_CRYPTO_KEY_GENERATED,
SESSION_STATE_USER_WRITTEN, SESSION_STATE_USER_WRITTEN,
SESSION_STATE_EMAIL_VERIFICATION_WRITTEN, SESSION_STATE_EMAIL_VERIFICATION_WRITTEN,
SESSION_STATE_EMAIL_VERIFICATION_SEND, SESSION_STATE_EMAIL_VERIFICATION_SEND,
SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED, SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED,
SESSION_STATE_PASSPHRASE_GENERATED, SESSION_STATE_PASSPHRASE_GENERATED,
SESSION_STATE_PASSPHRASE_SHOWN, SESSION_STATE_PASSPHRASE_SHOWN,
SESSION_STATE_PASSPHRASE_WRITTEN, SESSION_STATE_PASSPHRASE_WRITTEN,
SESSION_STATE_KEY_PAIR_GENERATED, SESSION_STATE_KEY_PAIR_GENERATED,
SESSION_STATE_KEY_PAIR_WRITTEN, SESSION_STATE_KEY_PAIR_WRITTEN,
SESSION_STATE_RESET_PASSWORD_REQUEST, SESSION_STATE_RESET_PASSWORD_REQUEST,
SESSION_STATE_RESET_PASSWORD_SUCCEED, SESSION_STATE_RESET_PASSWORD_SUCCEED,
SESSION_STATE_COUNT SESSION_STATE_COUNT
}; };
class SessionManager; class SessionManager;
class UpdateUserPasswordPage; class UpdateUserPasswordPage;
class PassphrasePage; class PassphrasePage;
class RepairDefectPassphrase; class RepairDefectPassphrase;
class Session : public ErrorList, public UniLib::lib::MultithreadContainer class Session : public ErrorList, public UniLib::lib::MultithreadContainer
{ {
friend WriteEmailVerification; friend WriteEmailVerification;
friend SessionManager; friend SessionManager;
friend UpdateUserPasswordPage; friend UpdateUserPasswordPage;
friend PassphrasePage; friend PassphrasePage;
friend RepairDefectPassphrase; friend RepairDefectPassphrase;
public: public:
Session(int handle); Session(int handle);
~Session(); ~Session();
// get new model objects // get new model objects
Poco::AutoPtr<controller::EmailVerificationCode> getEmailVerificationCodeObject(); Poco::AutoPtr<controller::EmailVerificationCode> getEmailVerificationCodeObject();
// set new model objects // set new model objects
inline void setUser(Poco::AutoPtr<controller::User> user) { mNewUser = user; } inline void setUser(Poco::AutoPtr<controller::User> user) { mNewUser = user; }
inline Poco::AutoPtr<controller::User> getNewUser() { return mNewUser; } inline Poco::AutoPtr<controller::User> getNewUser() { return mNewUser; }
// ---------------- User functions ---------------------------- // ---------------- User functions ----------------------------
// TODO: register state: written into db, mails sended, update state only if new state is higher as old state // TODO: register state: written into db, mails sended, update state only if new state is higher as old state
// create User send e-mail activation link // create User send e-mail activation link
bool createUser(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password); bool createUser(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password);
//! \brief new register function, without showing user pubkeys, using controller/user //! \brief new register function, without showing user pubkeys, using controller/user
bool createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password); bool createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password);
// adminRegister without passwort // adminRegister without passwort
bool adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email); bool adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email);
// TODO: check if email exist and if not, fake waiting on password hashing with profiled times of real password hashing // TODO: check if email exist and if not, fake waiting on password hashing with profiled times of real password hashing
UserStates loadUser(const std::string& email, const std::string& password); UserStates loadUser(const std::string& email, const std::string& password);
bool ifUserExist(const std::string& email); bool ifUserExist(const std::string& email);
inline void setUser(Poco::AutoPtr<User> user) { mSessionUser = user; } inline void setUser(Poco::AutoPtr<User> user) { mSessionUser = user; }
bool deleteUser(); bool deleteUser();
Poco::AutoPtr<User> getUser() { Poco::AutoPtr<User> getUser() {
return mSessionUser; return mSessionUser;
} }
// ------------------------- Email Verification Code functions ------------------------------- // ------------------------- Email Verification Code functions -------------------------------
bool loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode); bool loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode);
//! \return 1 = konto already exist //! \return 1 = konto already exist
//! -1 = invalid code //! -1 = invalid code
//! -2 = critical error //! -2 = critical error
//! 0 = ok //! 0 = ok
int updateEmailVerification(Poco::UInt64 emailVerificationCode); int updateEmailVerification(Poco::UInt64 emailVerificationCode);
// called from page with same name // called from page with same name
//! \return 1 = reset password email already send //! \return 1 = reset password email already send
//! \return 2 = reset password email already shortly before //! \return 2 = reset password email already shortly before
//! \return 0 = ok //! \return 0 = ok
int sendResetPasswordEmail(Poco::AutoPtr<controller::User> user, bool passphraseMemorized); int sendResetPasswordEmail(Poco::AutoPtr<controller::User> user, bool passphraseMemorized);
// //
//! \return 0 = not the same //! \return 0 = not the same
//! \return 1 = same //! \return 1 = same
//! \return -1 = error //! \return -1 = error
//! \return -2 = critical error //! \return -2 = critical error
int comparePassphraseWithSavedKeys(const std::string& inputPassphrase, Mnemonic* wordSource); int comparePassphraseWithSavedKeys(const std::string& inputPassphrase, Mnemonic* wordSource);
Poco::Net::HTTPCookie getLoginCookie(); Poco::Net::HTTPCookie getLoginCookie();
inline int getHandle() { return mHandleId; } inline int getHandle() { return mHandleId; }
// ------------------------ Passphrase functions ---------------------------- // ------------------------ Passphrase functions ----------------------------
inline void setPassphrase(Poco::AutoPtr<Passphrase> passphrase) { mNewPassphrase = passphrase; } inline void setPassphrase(Poco::AutoPtr<Passphrase> passphrase) { mNewPassphrase = passphrase; }
inline Poco::AutoPtr<Passphrase> getPassphrase() { return mNewPassphrase; } inline Poco::AutoPtr<Passphrase> getPassphrase() { return mNewPassphrase; }
inline void setPassphrase(const std::string& passphrase) { mPassphrase = passphrase; } inline void setPassphrase(const std::string& passphrase) { mPassphrase = passphrase; }
inline const std::string& getOldPassphrase() { return mPassphrase; } inline const std::string& getOldPassphrase() { return mPassphrase; }
bool generatePassphrase(); bool generatePassphrase();
bool generateKeys(bool savePrivkey, bool savePassphrase); bool generateKeys(bool savePrivkey, bool savePassphrase);
inline void setClientIp(Poco::Net::IPAddress ip) { mClientLoginIP = ip; } inline void setClientIp(Poco::Net::IPAddress ip) { mClientLoginIP = ip; }
inline Poco::Net::IPAddress getClientIp() { return mClientLoginIP; } inline Poco::Net::IPAddress getClientIp() { return mClientLoginIP; }
inline bool isIPValid(Poco::Net::IPAddress ip) { return mClientLoginIP == ip; } inline bool isIPValid(Poco::Net::IPAddress ip) { return mClientLoginIP == ip; }
bool isPwdValid(const std::string& pwd); bool isPwdValid(const std::string& pwd);
void reset(); void reset();
void updateState(SessionStates newState); void updateState(SessionStates newState);
const char* getSessionStateString(); const char* getSessionStateString();
inline SessionStates getSessionState() { SessionStates s; lock("Session::getSessionState"); s = mState; unlock(); return s; } inline SessionStates getSessionState() { SessionStates s; lock("Session::getSessionState"); s = mState; unlock(); return s; }
inline Poco::UInt64 getEmailVerificationCode() { inline Poco::UInt64 getEmailVerificationCode() {
std::shared_lock<std::shared_mutex> _lock(mSharedMutex); std::shared_lock<std::shared_mutex> _lock(mSharedMutex);
if (mEmailVerificationCodeObject.isNull()) return 0; return mEmailVerificationCodeObject->getModel()->getCode(); if (mEmailVerificationCodeObject.isNull()) return 0; return mEmailVerificationCodeObject->getModel()->getCode();
} }
inline void setEmailVerificationCodeObject(Poco::AutoPtr<controller::EmailVerificationCode> emailVerficationObject) { inline void setEmailVerificationCodeObject(Poco::AutoPtr<controller::EmailVerificationCode> emailVerficationObject) {
std::unique_lock<std::shared_mutex> _lock(mSharedMutex); std::unique_lock<std::shared_mutex> _lock(mSharedMutex);
mEmailVerificationCodeObject = emailVerficationObject; mEmailVerificationCodeObject = emailVerficationObject;
} }
inline model::table::EmailOptInType getEmailVerificationType() { inline model::table::EmailOptInType getEmailVerificationType() {
std::shared_lock<std::shared_mutex> _lock(mSharedMutex); std::shared_lock<std::shared_mutex> _lock(mSharedMutex);
if (mEmailVerificationCodeObject.isNull()) { if (mEmailVerificationCodeObject.isNull()) {
return model::table::EMAIL_OPT_IN_EMPTY; return model::table::EMAIL_OPT_IN_EMPTY;
} }
return mEmailVerificationCodeObject->getModel()->getType(); return mEmailVerificationCodeObject->getModel()->getType();
} }
//! \return -1 if session is locked //! \return -1 if session is locked
//! \return 1 if session is active //! \return 1 if session is active
//! \return 0 //! \return 0
int isActive(); int isActive();
//! \return false if session is locked //! \return false if session is locked
bool setActive(bool active); bool setActive(bool active);
bool isDeadLocked(); bool isDeadLocked();
inline Poco::DateTime getLastActivity() { return mLastActivity; } inline Poco::DateTime getLastActivity() { return mLastActivity; }
// ------------------------ transactions functions ---------------------------- // ------------------------ transactions functions ----------------------------
//! \return true if succeed //! \return true if succeed
bool startProcessingTransaction(const std::string& proto_message_base64, bool autoSign = false); bool startProcessingTransaction(const std::string& proto_message_base64, bool autoSign = false);
//! \param working if set will filled with transaction running //! \param working if set will filled with transaction running
Poco::AutoPtr<ProcessingTransaction> getNextReadyTransaction(size_t* working = nullptr); Poco::AutoPtr<ProcessingTransaction> getNextReadyTransaction(size_t* working = nullptr);
bool finalizeTransaction(bool sign, bool reject); bool finalizeTransaction(bool sign, bool reject);
size_t getProcessingTransactionCount(); size_t getProcessingTransactionCount();
inline LanguageCatalog* getLanguageCatalog() { return mLanguageCatalog.isNull() ? nullptr : mLanguageCatalog; } inline LanguageCatalog* getLanguageCatalog() { return mLanguageCatalog.isNull() ? nullptr : mLanguageCatalog; }
void setLanguage(Languages lang); void setLanguage(Languages lang);
inline void setLanguageCatalog(Poco::AutoPtr<LanguageCatalog> languageCatalog) { mLanguageCatalog = languageCatalog; } inline void setLanguageCatalog(Poco::AutoPtr<LanguageCatalog> languageCatalog) { mLanguageCatalog = languageCatalog; }
Languages getLanguage(); Languages getLanguage();
inline const char* gettext(const char* text) { if (mLanguageCatalog.isNull()) return text; return mLanguageCatalog->gettext(text); } inline const char* gettext(const char* text) { if (mLanguageCatalog.isNull()) return text; return mLanguageCatalog->gettext(text); }
// last referer // last referer
inline void setLastReferer(const std::string& lastReferer) { mLastExternReferer = lastReferer; } inline void setLastReferer(const std::string& lastReferer) { mLastExternReferer = lastReferer; }
inline const std::string& getLastReferer() const { return mLastExternReferer; } inline const std::string& getLastReferer() const { return mLastExternReferer; }
protected: protected:
void updateTimeout(); void updateTimeout();
inline void setHandle(int newHandle) { mHandleId = newHandle; } inline void setHandle(int newHandle) { mHandleId = newHandle; }
void detectSessionState(); void detectSessionState();
static const char* translateSessionStateToString(SessionStates state); static const char* translateSessionStateToString(SessionStates state);
inline const std::string& getPassphrase() const { return mPassphrase; } inline const std::string& getPassphrase() const { return mPassphrase; }
private: private:
int mHandleId; int mHandleId;
Poco::AutoPtr<User> mSessionUser; Poco::AutoPtr<User> mSessionUser;
Poco::AutoPtr<controller::User> mNewUser; Poco::AutoPtr<controller::User> mNewUser;
std::string mPassphrase; std::string mPassphrase;
Poco::AutoPtr<Passphrase> mNewPassphrase; Poco::AutoPtr<Passphrase> mNewPassphrase;
Poco::DateTime mLastActivity; Poco::DateTime mLastActivity;
Poco::Net::IPAddress mClientLoginIP; Poco::Net::IPAddress mClientLoginIP;
std::string mLastExternReferer; std::string mLastExternReferer;
Poco::AutoPtr<controller::EmailVerificationCode> mEmailVerificationCodeObject; Poco::AutoPtr<controller::EmailVerificationCode> mEmailVerificationCodeObject;
std::shared_mutex mSharedMutex; std::shared_mutex mSharedMutex;
SessionStates mState; SessionStates mState;
bool mActive; bool mActive;
std::list<Poco::AutoPtr<ProcessingTransaction>> mProcessingTransactions; std::list<Poco::AutoPtr<ProcessingTransaction>> mProcessingTransactions;
Poco::AutoPtr<ProcessingTransaction> mCurrentActiveProcessingTransaction; Poco::AutoPtr<ProcessingTransaction> mCurrentActiveProcessingTransaction;
Poco::AutoPtr<LanguageCatalog> mLanguageCatalog; Poco::AutoPtr<LanguageCatalog> mLanguageCatalog;
}; };
class WriteEmailVerification : public UniLib::controller::CPUTask class WriteEmailVerification : public UniLib::controller::CPUTask
{ {
public: public:
WriteEmailVerification(Poco::AutoPtr<User> user, Poco::AutoPtr<controller::EmailVerificationCode> emailVerificationCode, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount = 0) WriteEmailVerification(Poco::AutoPtr<User> user, Poco::AutoPtr<controller::EmailVerificationCode> emailVerificationCode, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount = 0)
: UniLib::controller::CPUTask(cpuScheduler, taskDependenceCount), mUser(user), mEmailVerificationCode(emailVerificationCode) { : UniLib::controller::CPUTask(cpuScheduler, taskDependenceCount), mUser(user), mEmailVerificationCode(emailVerificationCode) {
#ifdef _UNI_LIB_DEBUG #ifdef _UNI_LIB_DEBUG
setName(user->getEmail()); setName(user->getEmail());
#endif #endif
} }
virtual const char* getResourceType() const { return "WriteEmailVerification"; }; virtual const char* getResourceType() const { return "WriteEmailVerification"; };
virtual int run(); virtual int run();
private: private:
Poco::AutoPtr<User> mUser; Poco::AutoPtr<User> mUser;
Poco::AutoPtr<controller::EmailVerificationCode> mEmailVerificationCode; Poco::AutoPtr<controller::EmailVerificationCode> mEmailVerificationCode;
}; };
class WritePassphraseIntoDB : public UniLib::controller::CPUTask class WritePassphraseIntoDB : public UniLib::controller::CPUTask
{ {
public: public:
WritePassphraseIntoDB(int userId, const std::string& passphrase) WritePassphraseIntoDB(int userId, const std::string& passphrase)
: mUserId(userId), mPassphrase(passphrase) { : mUserId(userId), mPassphrase(passphrase) {
#ifdef _UNI_LIB_DEBUG #ifdef _UNI_LIB_DEBUG
setName(std::to_string(userId).data()); setName(std::to_string(userId).data());
#endif #endif
} }
virtual int run(); virtual int run();
virtual const char* getResourceType() const { return "WritePassphraseIntoDB"; }; virtual const char* getResourceType() const { return "WritePassphraseIntoDB"; };
protected: protected:
int mUserId; int mUserId;
std::string mPassphrase; std::string mPassphrase;
}; };
class SessionStateUpdateCommand : public UniLib::controller::Command class SessionStateUpdateCommand : public UniLib::controller::Command
{ {
public: public:
SessionStateUpdateCommand(SessionStates state, Session* session) SessionStateUpdateCommand(SessionStates state, Session* session)
: mState(state), mSession(session) {} : mState(state), mSession(session) {}
virtual int taskFinished(UniLib::controller::Task* task) { virtual int taskFinished(UniLib::controller::Task* task) {
mSession->updateState(mState); mSession->updateState(mState);
return 0; return 0;
} }
protected: protected:
SessionStates mState; SessionStates mState;
Session* mSession; Session* mSession;
}; };
#endif // DR_LUA_WEB_MODULE_SESSION_SESSION_H #endif // DR_LUA_WEB_MODULE_SESSION_SESSION_H

View File

@ -1,72 +1,72 @@
#include "TransactionCreation.h" #include "TransactionCreation.h"
#include "Poco/DateTimeFormatter.h" #include "Poco/DateTimeFormatter.h"
#include <sodium.h> #include <sodium.h>
TransactionCreation::TransactionCreation(const std::string& memo, const model::messages::gradido::TransactionCreation& protoCreation) TransactionCreation::TransactionCreation(const std::string& memo, const model::messages::gradido::TransactionCreation& protoCreation)
: TransactionBase(memo), mProtoCreation(protoCreation), mReceiverUser(nullptr) : TransactionBase(memo), mProtoCreation(protoCreation), mReceiverUser(nullptr)
{ {
memset(mReceiverPublicHex, 0, 65); memset(mReceiverPublicHex, 0, 65);
} }
TransactionCreation::~TransactionCreation() TransactionCreation::~TransactionCreation()
{ {
if (mReceiverUser) { if (mReceiverUser) {
delete mReceiverUser; delete mReceiverUser;
mReceiverUser = nullptr; mReceiverUser = nullptr;
} }
} }
int TransactionCreation::prepare() int TransactionCreation::prepare()
{ {
const static char functionName[] = { "TransactionCreation::prepare" }; const static char functionName[] = { "TransactionCreation::prepare" };
if (!mProtoCreation.has_receiveramount()) { if (!mProtoCreation.has_receiveramount()) {
addError(new Error(functionName, "hasn't receiver amount")); addError(new Error(functionName, "hasn't receiver amount"));
return -1; return -1;
} }
auto receiverAmount = mProtoCreation.receiveramount(); auto receiverAmount = mProtoCreation.receiveramount();
if (receiverAmount.amount() <= 0) { if (receiverAmount.amount() <= 0) {
addError(new Error(functionName, "amount must be > 0")); addError(new Error(functionName, "amount must be > 0"));
return -4; return -4;
} }
if (receiverAmount.amount() > 10000000) { if (receiverAmount.amount() > 10000000) {
addError(new Error(functionName, "amount must be <= 1000 GDD")); addError(new Error(functionName, "amount must be <= 1000 GDD"));
return -5; return -5;
} }
auto receiverPublic = receiverAmount.ed25519_receiver_pubkey(); auto receiverPublic = receiverAmount.ed25519_receiver_pubkey();
if (receiverPublic.size() != 32) { if (receiverPublic.size() != 32) {
addError(new Error(functionName, "receiver public invalid (size not 32)")); addError(new Error(functionName, "receiver public invalid (size not 32)"));
return -2; return -2;
} }
mReceiverUser = new User((const unsigned char*)receiverPublic.data()); mReceiverUser = new User((const unsigned char*)receiverPublic.data());
getErrors(mReceiverUser); getErrors(mReceiverUser);
if (mReceiverUser->getUserState() == USER_EMPTY) { if (mReceiverUser->getUserState() == USER_EMPTY) {
sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size()); sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size());
delete mReceiverUser; delete mReceiverUser;
mReceiverUser = nullptr; mReceiverUser = nullptr;
} }
else { else {
memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64); memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64);
// uncomment because not correctly working // uncomment because not correctly working
/*if (!mReceiverUser->validateIdentHash(mProtoCreation.ident_hash())) { /*if (!mReceiverUser->validateIdentHash(mProtoCreation.ident_hash())) {
addError(new Error(functionName, "ident hash isn't the same")); addError(new Error(functionName, "ident hash isn't the same"));
addError(new ParamError(functionName, "hash calculated from email: ", mReceiverUser->getEmail())); addError(new ParamError(functionName, "hash calculated from email: ", mReceiverUser->getEmail()));
addError(new ParamError(functionName, "hash: ", std::to_string(mProtoCreation.ident_hash()))); addError(new ParamError(functionName, "hash: ", std::to_string(mProtoCreation.ident_hash())));
return -3; return -3;
}*/ }*/
} }
// //
return 0; return 0;
} }
std::string TransactionCreation::getTargetDateString() std::string TransactionCreation::getTargetDateString()
{ {
// proto format is seconds, poco timestamp format is microseconds // proto format is seconds, poco timestamp format is microseconds
Poco::Timestamp pocoStamp(mProtoCreation.target_date().seconds() * 1000*1000); Poco::Timestamp pocoStamp(mProtoCreation.target_date().seconds() * 1000*1000);
//Poco::DateTime(pocoStamp); //Poco::DateTime(pocoStamp);
return Poco::DateTimeFormatter::format(pocoStamp, "%d. %b %y"); return Poco::DateTimeFormatter::format(pocoStamp, "%d. %b %y");
} }

View File

@ -1,172 +1,172 @@
#include "TransactionTransfer.h" #include "TransactionTransfer.h"
const std::string TransactionTransfer::mInvalidIndexMessage("invalid index"); const std::string TransactionTransfer::mInvalidIndexMessage("invalid index");
TransactionTransfer::KontoTableEntry::KontoTableEntry(model::table::User* user, google::protobuf::int64 amount, bool negativeAmount/* = false*/) TransactionTransfer::KontoTableEntry::KontoTableEntry(model::table::User* user, google::protobuf::int64 amount, bool negativeAmount/* = false*/)
{ {
//<span class="content-cell">Normaler&nbsp;User&nbsp;&lt;info@software-labor.de&gt;</span> //<span class="content-cell">Normaler&nbsp;User&nbsp;&lt;info@software-labor.de&gt;</span>
if (!user) return; if (!user) return;
composeAmountCellString(amount, negativeAmount); composeAmountCellString(amount, negativeAmount);
/*kontoNameCell = "<td>"; /*kontoNameCell = "<td>";
kontoNameCell += user->getFirstName(); kontoNameCell += user->getFirstName();
kontoNameCell += "&nbsp;"; kontoNameCell += "&nbsp;";
kontoNameCell += user->getLastName(); kontoNameCell += user->getLastName();
kontoNameCell += "&nbsp;&lt;"; kontoNameCell += "&nbsp;&lt;";
kontoNameCell += user->getEmail(); kontoNameCell += user->getEmail();
kontoNameCell += "&gt;</td>";*/ kontoNameCell += "&gt;</td>";*/
kontoNameCell = "<span class=\"content-cell\">"; kontoNameCell = "<span class=\"content-cell\">";
kontoNameCell += user->getNameWithEmailHtml(); kontoNameCell += user->getNameWithEmailHtml();
kontoNameCell += "</span>"; kontoNameCell += "</span>";
} }
TransactionTransfer::KontoTableEntry::KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount/* = false*/) TransactionTransfer::KontoTableEntry::KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount/* = false*/)
{ {
composeAmountCellString(amount, negativeAmount); composeAmountCellString(amount, negativeAmount);
//kontoNameCell = "<td class=\"small\">0x" + pubkeyHex + "</td>"; //kontoNameCell = "<td class=\"small\">0x" + pubkeyHex + "</td>";
kontoNameCell = "<span class = \"content-cell\">" + pubkeyHex + "</span>"; kontoNameCell = "<span class = \"content-cell\">" + pubkeyHex + "</span>";
} }
void TransactionTransfer::KontoTableEntry::composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount) void TransactionTransfer::KontoTableEntry::composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount)
{ {
//<span class="content-cell alert-color">-10 GDD</span> //<span class="content-cell alert-color">-10 GDD</span>
//<span class="content-cell success-color">10 GDD</span> //<span class="content-cell success-color">10 GDD</span>
amountCell = "<span class=\"content-cell "; amountCell = "<span class=\"content-cell ";
if (negativeAmount) { if (negativeAmount) {
amountCell += "alert-color\">-"; amountCell += "alert-color\">-";
} }
else { else {
amountCell += "success-color\">"; amountCell += "success-color\">";
} }
amountCell += amountToString(amount); amountCell += amountToString(amount);
//amountCell += " GDD</td>"; //amountCell += " GDD</td>";
amountCell += " GDD</span>"; amountCell += " GDD</span>";
} }
// ******************************************************************************************************************************** // ********************************************************************************************************************************
TransactionTransfer::TransactionTransfer(const std::string& memo, const model::messages::gradido::Transfer& protoTransfer) TransactionTransfer::TransactionTransfer(const std::string& memo, const model::messages::gradido::Transfer& protoTransfer)
: TransactionBase(memo), mProtoTransfer(protoTransfer) : TransactionBase(memo), mProtoTransfer(protoTransfer)
{ {
} }
TransactionTransfer::~TransactionTransfer() TransactionTransfer::~TransactionTransfer()
{ {
mKontoTable.clear(); mKontoTable.clear();
} }
int TransactionTransfer::prepare() int TransactionTransfer::prepare()
{ {
lock(); lock();
const static char functionName[] = { "TransactionTransfer::prepare" }; const static char functionName[] = { "TransactionTransfer::prepare" };
if (mProtoTransfer.senderamounts_size() == 0) { if (mProtoTransfer.senderamounts_size() == 0) {
addError(new Error(functionName, "hasn't sender amount(s)")); addError(new Error(functionName, "hasn't sender amount(s)"));
unlock(); unlock();
return -1; return -1;
} }
if (mProtoTransfer.receiveramounts_size() == 0) { if (mProtoTransfer.receiveramounts_size() == 0) {
addError(new Error(functionName, "hasn't receiver amount(s)")); addError(new Error(functionName, "hasn't receiver amount(s)"));
unlock(); unlock();
return -2; return -2;
} }
mKontoTable.reserve(mProtoTransfer.senderamounts_size() + mProtoTransfer.receiveramounts_size()); mKontoTable.reserve(mProtoTransfer.senderamounts_size() + mProtoTransfer.receiveramounts_size());
//auto receiverAmount = mProtoTransfer.receiveramount(); //auto receiverAmount = mProtoTransfer.receiveramount();
//auto senderAmount //auto senderAmount
int senderSum = 0; int senderSum = 0;
int receiverSum = 0; int receiverSum = 0;
char pubkeyHexTemp[65]; char pubkeyHexTemp[65];
for (int i = 0; i < mProtoTransfer.senderamounts_size(); i++) { for (int i = 0; i < mProtoTransfer.senderamounts_size(); i++) {
auto senderAmount = mProtoTransfer.senderamounts(i); auto senderAmount = mProtoTransfer.senderamounts(i);
auto pubkey = senderAmount.ed25519_sender_pubkey(); auto pubkey = senderAmount.ed25519_sender_pubkey();
senderSum += senderAmount.amount(); senderSum += senderAmount.amount();
if (pubkey.size() != 32) { if (pubkey.size() != 32) {
addError(new ParamError(functionName, "invalid public key for sender ", i)); addError(new ParamError(functionName, "invalid public key for sender ", i));
unlock(); unlock();
return -3; return -3;
} }
//User user((const unsigned char*)pubkey.data()); //User user((const unsigned char*)pubkey.data());
auto user = controller::User::create(); auto user = controller::User::create();
if (!user->load((const unsigned char*)pubkey.data())) { if (!user->load((const unsigned char*)pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size()); sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, senderAmount.amount(), true)); mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, senderAmount.amount(), true));
} }
else { else {
mKontoTable.push_back(KontoTableEntry(user->getModel(), senderAmount.amount(), true)); mKontoTable.push_back(KontoTableEntry(user->getModel(), senderAmount.amount(), true));
} }
} }
for (int i = 0; i < mProtoTransfer.receiveramounts_size(); i++) { for (int i = 0; i < mProtoTransfer.receiveramounts_size(); i++) {
auto receiverAmount = mProtoTransfer.receiveramounts(i); auto receiverAmount = mProtoTransfer.receiveramounts(i);
auto pubkey = receiverAmount.ed25519_receiver_pubkey(); auto pubkey = receiverAmount.ed25519_receiver_pubkey();
receiverSum += receiverAmount.amount(); receiverSum += receiverAmount.amount();
if (receiverAmount.ed25519_receiver_pubkey().size() != 32) { if (receiverAmount.ed25519_receiver_pubkey().size() != 32) {
addError(new ParamError(functionName, "invalid public key for receiver ", i)); addError(new ParamError(functionName, "invalid public key for receiver ", i));
unlock(); unlock();
return -4; return -4;
} }
auto user = controller::User::create(); auto user = controller::User::create();
if (!user->load((const unsigned char*)pubkey.data())) { if (!user->load((const unsigned char*)pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size()); sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, receiverAmount.amount(), false)); mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, receiverAmount.amount(), false));
} }
else { else {
mKontoTable.push_back(KontoTableEntry(user->getModel(), receiverAmount.amount(), false)); mKontoTable.push_back(KontoTableEntry(user->getModel(), receiverAmount.amount(), false));
} }
} }
if (senderSum != receiverSum) { if (senderSum != receiverSum) {
addError(new Error(functionName, "sender amounts sum != receiver amounts sum")); addError(new Error(functionName, "sender amounts sum != receiver amounts sum"));
unlock(); unlock();
return -5; return -5;
} }
if (senderSum < 0) { if (senderSum < 0) {
addError(new Error(functionName, "negative amount not supported")); addError(new Error(functionName, "negative amount not supported"));
unlock(); unlock();
return -6; return -6;
} }
/* /*
mReceiverUser = new User(receiverPublic.data()); mReceiverUser = new User(receiverPublic.data());
getErrors(mReceiverUser); getErrors(mReceiverUser);
if (mReceiverUser->getUserState() == USER_EMPTY) { if (mReceiverUser->getUserState() == USER_EMPTY) {
sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size()); sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size());
delete mReceiverUser; delete mReceiverUser;
mReceiverUser = nullptr; mReceiverUser = nullptr;
} }
else { else {
memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64); memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64);
} }
//*/ //*/
unlock(); unlock();
return 0; return 0;
} }
const std::string& TransactionTransfer::getKontoNameCell(int index) const std::string& TransactionTransfer::getKontoNameCell(int index)
{ {
lock(); lock();
if (index >= mKontoTable.size()) { if (index >= mKontoTable.size()) {
unlock(); unlock();
return mInvalidIndexMessage; return mInvalidIndexMessage;
} }
unlock(); unlock();
return mKontoTable[index].kontoNameCell; return mKontoTable[index].kontoNameCell;
} }
const std::string& TransactionTransfer::getAmountCell(int index) const std::string& TransactionTransfer::getAmountCell(int index)
{ {
lock(); lock();
if (index >= mKontoTable.size()) { if (index >= mKontoTable.size()) {
unlock(); unlock();
return mInvalidIndexMessage; return mInvalidIndexMessage;
} }
unlock(); unlock();
return mKontoTable[index].amountCell; return mKontoTable[index].amountCell;
} }

View File

@ -1,4 +1,4 @@
#include "Email.h" #include "Email.h"
#include "../../SingletonManager/EmailManager.h" #include "../../SingletonManager/EmailManager.h"
#include "Poco/Net/MediaType.h" #include "Poco/Net/MediaType.h"

View File

@ -1,40 +1,40 @@
#include "AuthenticatedEncryptionCreateKeyTask.h" #include "AuthenticatedEncryptionCreateKeyTask.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
#include "../SingletonManager/SingletonTaskObserver.h" #include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/ErrorManager.h"
#include "../lib/Profiler.h" #include "../lib/Profiler.h"
AuthenticatedEncryptionCreateKeyTask::AuthenticatedEncryptionCreateKeyTask(Poco::AutoPtr<controller::User> user, const std::string& passwd) AuthenticatedEncryptionCreateKeyTask::AuthenticatedEncryptionCreateKeyTask(Poco::AutoPtr<controller::User> user, const std::string& passwd)
: UniLib::controller::CPUTask(ServerConfig::g_CryptoCPUScheduler), mUser(user), mPassword(passwd) : UniLib::controller::CPUTask(ServerConfig::g_CryptoCPUScheduler), mUser(user), mPassword(passwd)
{ {
assert(!mUser.isNull()); assert(!mUser.isNull());
SingletonTaskObserver::getInstance()->addTask(mUser->getModel()->getEmail(), TASK_OBSERVER_PASSWORD_CREATION); SingletonTaskObserver::getInstance()->addTask(mUser->getModel()->getEmail(), TASK_OBSERVER_PASSWORD_CREATION);
} }
AuthenticatedEncryptionCreateKeyTask::~AuthenticatedEncryptionCreateKeyTask() AuthenticatedEncryptionCreateKeyTask::~AuthenticatedEncryptionCreateKeyTask()
{ {
SingletonTaskObserver::getInstance()->removeTask(mUser->getModel()->getEmail(), TASK_OBSERVER_PASSWORD_CREATION); SingletonTaskObserver::getInstance()->removeTask(mUser->getModel()->getEmail(), TASK_OBSERVER_PASSWORD_CREATION);
} }
int AuthenticatedEncryptionCreateKeyTask::run() int AuthenticatedEncryptionCreateKeyTask::run()
{ {
auto em = ErrorManager::getInstance(); auto em = ErrorManager::getInstance();
const static char* function_name = "AuthenticatedEncryptionCreateKeyTask::run"; const static char* function_name = "AuthenticatedEncryptionCreateKeyTask::run";
auto authenticated_encryption = new AuthenticatedEncryption; auto authenticated_encryption = new AuthenticatedEncryption;
Profiler timeUsed; Profiler timeUsed;
if (AuthenticatedEncryption::AUTH_ENCRYPT_OK != authenticated_encryption->createKey(mUser->getModel()->getEmail(), mPassword)) { if (AuthenticatedEncryption::AUTH_ENCRYPT_OK != authenticated_encryption->createKey(mUser->getModel()->getEmail(), mPassword)) {
em->addError(new Error(function_name, "error creating key")); em->addError(new Error(function_name, "error creating key"));
em->addError(new ParamError(function_name, "for email", mUser->getModel()->getEmail())); em->addError(new ParamError(function_name, "for email", mUser->getModel()->getEmail()));
em->addError(new ParamError(function_name, "strerror: ", strerror(errno))); em->addError(new ParamError(function_name, "strerror: ", strerror(errno)));
em->sendErrorsAsEmail(); em->sendErrorsAsEmail();
return -1; return -1;
} }
//printf("create password time: %s\n", timeUsed.string().data()); //printf("create password time: %s\n", timeUsed.string().data());
timeUsed.reset(); timeUsed.reset();
mUser->setNewPassword(authenticated_encryption); mUser->setNewPassword(authenticated_encryption);
//printf("set password time: %s\n", timeUsed.string().data()); //printf("set password time: %s\n", timeUsed.string().data());
return 0; return 0;
} }

View File

@ -1,4 +1,4 @@
#include "ProcessingTransaction.h" #include "ProcessingTransaction.h"
#include <sodium.h> #include <sodium.h>
#include "../model/TransactionCreation.h" #include "../model/TransactionCreation.h"

View File

@ -1,284 +1,284 @@
#include "SigningTransaction.h" #include "SigningTransaction.h"
#include <google/protobuf/text_format.h> #include <google/protobuf/text_format.h>
#include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/ErrorManager.h"
#include "../SingletonManager/MemoryManager.h" #include "../SingletonManager/MemoryManager.h"
#include "../SingletonManager/SingletonTaskObserver.h" #include "../SingletonManager/SingletonTaskObserver.h"
#include "../lib/Profiler.h" #include "../lib/Profiler.h"
#include "../proto/gradido/Transaction.pb.h" #include "../proto/gradido/Transaction.pb.h"
#include "sodium.h" #include "sodium.h"
#include "../ServerConfig.h" #include "../ServerConfig.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "Poco/StreamCopier.h" #include "Poco/StreamCopier.h"
#include "Poco/Net/HTTPSClientSession.h" #include "Poco/Net/HTTPSClientSession.h"
#include "Poco/Net/HTTPRequest.h" #include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h" #include "Poco/Net/HTTPResponse.h"
SigningTransaction::SigningTransaction( SigningTransaction::SigningTransaction(
Poco::AutoPtr<ProcessingTransaction> processingeTransaction, Poco::AutoPtr<ProcessingTransaction> processingeTransaction,
Poco::AutoPtr<controller::User> newUser Poco::AutoPtr<controller::User> newUser
, bool sendErrorsToAdmin/* = true*/) , bool sendErrorsToAdmin/* = true*/)
: mProcessingeTransaction(processingeTransaction), mNewUser(newUser), mSendErrorsToAdminEmail(sendErrorsToAdmin) : mProcessingeTransaction(processingeTransaction), mNewUser(newUser), mSendErrorsToAdminEmail(sendErrorsToAdmin)
{ {
auto ob = SingletonTaskObserver::getInstance(); auto ob = SingletonTaskObserver::getInstance();
auto email = getUserEmail(); auto email = getUserEmail();
if (email != "") { if (email != "") {
ob->addTask(email, TASK_OBSERVER_SIGN_TRANSACTION); ob->addTask(email, TASK_OBSERVER_SIGN_TRANSACTION);
} }
} }
SigningTransaction::~SigningTransaction() SigningTransaction::~SigningTransaction()
{ {
auto ob = SingletonTaskObserver::getInstance(); auto ob = SingletonTaskObserver::getInstance();
auto email = getUserEmail(); auto email = getUserEmail();
if (email != "") { if (email != "") {
ob->removeTask(email, TASK_OBSERVER_SIGN_TRANSACTION); ob->removeTask(email, TASK_OBSERVER_SIGN_TRANSACTION);
} }
} }
std::string SigningTransaction::getUserEmail() std::string SigningTransaction::getUserEmail()
{ {
model::table::User* user_model = nullptr; model::table::User* user_model = nullptr;
if (!mNewUser.isNull()) { if (!mNewUser.isNull()) {
user_model = mNewUser->getModel(); user_model = mNewUser->getModel();
} }
if (user_model) { if (user_model) {
return user_model->getEmail(); return user_model->getEmail();
} }
return ""; return "";
} }
int SigningTransaction::run() { int SigningTransaction::run() {
auto mm = MemoryManager::getInstance(); auto mm = MemoryManager::getInstance();
Error* transactionError = new Error("SigningTransaction", mProcessingeTransaction->mProtoMessageBase64.data()); Error* transactionError = new Error("SigningTransaction", mProcessingeTransaction->mProtoMessageBase64.data());
addError(transactionError, false); addError(transactionError, false);
//= new Error("SigningTransaction start", mProcessingeTransaction->g) //= new Error("SigningTransaction start", mProcessingeTransaction->g)
//if (mUser.isNull() || !mUser->hasCryptoKey()) { //if (mUser.isNull() || !mUser->hasCryptoKey()) {
if(mNewUser.isNull() || !mNewUser->hasPassword()) { if(mNewUser.isNull() || !mNewUser->hasPassword()) {
addError(new Error("SigningTransaction", "user hasn't crypto key or is null")); addError(new Error("SigningTransaction", "user hasn't crypto key or is null"));
if(mSendErrorsToAdminEmail) sendErrorsAsEmail(); if(mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -1; return -1;
} }
//auto privKey = mUser->getPrivKey(); //auto privKey = mUser->getPrivKey();
//if (!mUser->hasPrivKey()) { //if (!mUser->hasPrivKey()) {
auto gradido_key_pair = mNewUser->getGradidoKeyPair(); auto gradido_key_pair = mNewUser->getGradidoKeyPair();
KeyPairEd25519* recovered_gradido_key_pair = nullptr; KeyPairEd25519* recovered_gradido_key_pair = nullptr;
if(!gradido_key_pair || !gradido_key_pair->hasPrivateKey()) { if(!gradido_key_pair || !gradido_key_pair->hasPrivateKey()) {
if (!mNewUser->tryLoadPassphraseUserBackup(&recovered_gradido_key_pair)) { if (!mNewUser->tryLoadPassphraseUserBackup(&recovered_gradido_key_pair)) {
if(mNewUser->setGradidoKeyPair(recovered_gradido_key_pair)) if(mNewUser->setGradidoKeyPair(recovered_gradido_key_pair))
{ {
mNewUser->getModel()->updatePrivkey(); mNewUser->getModel()->updatePrivkey();
} }
} }
else { else {
addError(new Error("SigningTransaction", "user cannot decrypt private key")); addError(new Error("SigningTransaction", "user cannot decrypt private key"));
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -2; return -2;
} }
} }
// get body bytes // get body bytes
model::messages::gradido::Transaction transaction; model::messages::gradido::Transaction transaction;
auto bodyBytes = transaction.mutable_bodybytes(); auto bodyBytes = transaction.mutable_bodybytes();
*bodyBytes = mProcessingeTransaction->getBodyBytes(); *bodyBytes = mProcessingeTransaction->getBodyBytes();
if (*bodyBytes == "") { if (*bodyBytes == "") {
getErrors(mProcessingeTransaction); getErrors(mProcessingeTransaction);
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -3; return -3;
} }
// sign // sign
//auto sign = mUser->sign((const unsigned char*)bodyBytes->data(), bodyBytes->size()); //auto sign = mUser->sign((const unsigned char*)bodyBytes->data(), bodyBytes->size());
MemoryBin* sign = nullptr; MemoryBin* sign = nullptr;
if (gradido_key_pair) { if (gradido_key_pair) {
sign = gradido_key_pair->sign(*bodyBytes); sign = gradido_key_pair->sign(*bodyBytes);
} }
else if (recovered_gradido_key_pair) { else if (recovered_gradido_key_pair) {
sign = recovered_gradido_key_pair->sign(*bodyBytes); sign = recovered_gradido_key_pair->sign(*bodyBytes);
} }
if (!sign) { if (!sign) {
ErrorManager::getInstance()->sendErrorsAsEmail(); ErrorManager::getInstance()->sendErrorsAsEmail();
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
mm->releaseMemory(sign); mm->releaseMemory(sign);
return -4; return -4;
} }
// pubkey for signature // pubkey for signature
/*auto pubkeyBin = mm->getFreeMemory(ed25519_pubkey_SIZE); /*auto pubkeyBin = mm->getFreeMemory(ed25519_pubkey_SIZE);
size_t realBin = 0; size_t realBin = 0;
if (sodium_hex2bin(*pubkeyBin, *pubkeyBin, pubkeyHex.data(), pubkeyHex.size(), nullptr, &realBin, nullptr)) { if (sodium_hex2bin(*pubkeyBin, *pubkeyBin, pubkeyHex.data(), pubkeyHex.size(), nullptr, &realBin, nullptr)) {
addError(new Error("SigningTransaction", "error in sodium_hex2bin")); addError(new Error("SigningTransaction", "error in sodium_hex2bin"));
sendErrorsAsEmail(); sendErrorsAsEmail();
mm->releaseMemory(pubkeyBin); mm->releaseMemory(pubkeyBin);
mm->releaseMemory(sign); mm->releaseMemory(sign);
return -5; return -5;
} }
*/ */
// add to message // add to message
auto sigMap = transaction.mutable_sigmap(); auto sigMap = transaction.mutable_sigmap();
auto sigPair = sigMap->add_sigpair(); auto sigPair = sigMap->add_sigpair();
auto pubkeyBytes = sigPair->mutable_pubkey(); auto pubkeyBytes = sigPair->mutable_pubkey();
auto pubkeyBin = mNewUser->getModel()->getPublicKey(); auto pubkeyBin = mNewUser->getModel()->getPublicKey();
*pubkeyBytes = std::string((const char*)pubkeyBin, crypto_sign_PUBLICKEYBYTES); *pubkeyBytes = std::string((const char*)pubkeyBin, crypto_sign_PUBLICKEYBYTES);
auto sigBytes = sigPair->mutable_ed25519(); auto sigBytes = sigPair->mutable_ed25519();
*sigBytes = std::string((char*)*sign, sign->size()); *sigBytes = std::string((char*)*sign, sign->size());
mm->releaseMemory(sign); mm->releaseMemory(sign);
/*std::string protoPrettyPrint; /*std::string protoPrettyPrint;
google::protobuf::TextFormat::PrintToString(transaction, &protoPrettyPrint); google::protobuf::TextFormat::PrintToString(transaction, &protoPrettyPrint);
printf("transaction pretty: %s\n", protoPrettyPrint.data()); printf("transaction pretty: %s\n", protoPrettyPrint.data());
model::messages::gradido::TransactionBody transactionBody; model::messages::gradido::TransactionBody transactionBody;
transactionBody.MergeFromString(transaction.bodybytes()); transactionBody.MergeFromString(transaction.bodybytes());
google::protobuf::TextFormat::PrintToString(transactionBody, &protoPrettyPrint); google::protobuf::TextFormat::PrintToString(transactionBody, &protoPrettyPrint);
printf("transaction body pretty: \n%s\n", protoPrettyPrint.data()); printf("transaction body pretty: \n%s\n", protoPrettyPrint.data());
*/ */
// finalize // finalize
//printf("sigpair size: %d\n", transaction.sigmap().sigpair_size()); //printf("sigpair size: %d\n", transaction.sigmap().sigpair_size());
std::string finalTransactionBin = transaction.SerializeAsString(); std::string finalTransactionBin = transaction.SerializeAsString();
if (finalTransactionBin == "") { if (finalTransactionBin == "") {
addError(new Error("SigningTransaction", "error serializing final transaction")); addError(new Error("SigningTransaction", "error serializing final transaction"));
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -6; return -6;
} }
// finale to base64 // finale to base64
auto finalBase64Size = sodium_base64_encoded_len(finalTransactionBin.size(), sodium_base64_VARIANT_URLSAFE_NO_PADDING); auto finalBase64Size = sodium_base64_encoded_len(finalTransactionBin.size(), sodium_base64_VARIANT_URLSAFE_NO_PADDING);
auto finalBase64Bin = mm->getFreeMemory(finalBase64Size); auto finalBase64Bin = mm->getFreeMemory(finalBase64Size);
if (!sodium_bin2base64(*finalBase64Bin, finalBase64Size, (const unsigned char*)finalTransactionBin.data(), finalTransactionBin.size(), sodium_base64_VARIANT_URLSAFE_NO_PADDING)) { if (!sodium_bin2base64(*finalBase64Bin, finalBase64Size, (const unsigned char*)finalTransactionBin.data(), finalTransactionBin.size(), sodium_base64_VARIANT_URLSAFE_NO_PADDING)) {
addError(new Error("SigningTransaction", "error convert final transaction to base64")); addError(new Error("SigningTransaction", "error convert final transaction to base64"));
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
mm->releaseMemory(finalBase64Bin); mm->releaseMemory(finalBase64Bin);
return -7; return -7;
} }
addError(new Error("Signing transaction final", *finalBase64Bin), false); addError(new Error("Signing transaction final", *finalBase64Bin), false);
// create json request // create json request
Poco::JSON::Object requestJson; Poco::JSON::Object requestJson;
requestJson.set("method", "putTransaction"); requestJson.set("method", "putTransaction");
requestJson.set("transaction", std::string((char*)*finalBase64Bin)); requestJson.set("transaction", std::string((char*)*finalBase64Bin));
//printf("\nbase64 transaction: \n%s\n\n", (char*)*finalBase64Bin); //printf("\nbase64 transaction: \n%s\n\n", (char*)*finalBase64Bin);
mm->releaseMemory(finalBase64Bin); mm->releaseMemory(finalBase64Bin);
//std::string request = requestJson.stringify(); //std::string request = requestJson.stringify();
// send post request via https // send post request via https
// 443 = HTTPS Default // 443 = HTTPS Default
// or http via port 80 if it is a test server // or http via port 80 if it is a test server
// TODO: adding port into ServerConfig // TODO: adding port into ServerConfig
bool choose_ssl = false; bool choose_ssl = false;
try { try {
Profiler phpRequestTime; Profiler phpRequestTime;
Poco::Net::HTTPClientSession* clientSession = nullptr; Poco::Net::HTTPClientSession* clientSession = nullptr;
if (ServerConfig::g_phpServerPort) { if (ServerConfig::g_phpServerPort) {
clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, ServerConfig::g_phpServerPort); clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, ServerConfig::g_phpServerPort);
choose_ssl = true; choose_ssl = true;
} }
else if (ServerConfig::SERVER_TYPE_PRODUCTION == ServerConfig::g_ServerSetupType || else if (ServerConfig::SERVER_TYPE_PRODUCTION == ServerConfig::g_ServerSetupType ||
ServerConfig::SERVER_TYPE_STAGING == ServerConfig::g_ServerSetupType) { ServerConfig::SERVER_TYPE_STAGING == ServerConfig::g_ServerSetupType) {
clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, 443); clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, 443);
choose_ssl = true; choose_ssl = true;
} }
else { else {
clientSession = new Poco::Net::HTTPClientSession(ServerConfig::g_php_serverHost, 80); clientSession = new Poco::Net::HTTPClientSession(ServerConfig::g_php_serverHost, 80);
choose_ssl = false; choose_ssl = false;
} }
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/JsonRequestHandler"); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/JsonRequestHandler");
request.setChunkedTransferEncoding(true); request.setChunkedTransferEncoding(true);
std::ostream& requestStream = clientSession->sendRequest(request); std::ostream& requestStream = clientSession->sendRequest(request);
requestJson.stringify(requestStream); requestJson.stringify(requestStream);
Poco::Net::HTTPResponse response; Poco::Net::HTTPResponse response;
std::istream& request_stream = clientSession->receiveResponse(response); std::istream& request_stream = clientSession->receiveResponse(response);
// debugging answer // debugging answer
std::stringstream responseStringStream; std::stringstream responseStringStream;
for (std::string line; std::getline(request_stream, line); ) { for (std::string line; std::getline(request_stream, line); ) {
responseStringStream << line << std::endl; responseStringStream << line << std::endl;
} }
Poco::Logger& speedLog= Poco::Logger::get("SpeedLog"); Poco::Logger& speedLog= Poco::Logger::get("SpeedLog");
speedLog.information("[putTransaction] php server time: %s", phpRequestTime.string()); speedLog.information("[putTransaction] php server time: %s", phpRequestTime.string());
// extract parameter from request // extract parameter from request
Poco::JSON::Parser jsonParser; Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJson; Poco::Dynamic::Var parsedJson;
try { try {
parsedJson = jsonParser.parse(responseStringStream.str()); parsedJson = jsonParser.parse(responseStringStream.str());
} }
catch (Poco::Exception& ex) { catch (Poco::Exception& ex) {
//printf("[JsonRequestHandler::handleRequest] Exception: %s\n", ex.displayText().data()); //printf("[JsonRequestHandler::handleRequest] Exception: %s\n", ex.displayText().data());
addError(new ParamError("SigningTransaction", "error parsing request answer", ex.displayText().data())); addError(new ParamError("SigningTransaction", "error parsing request answer", ex.displayText().data()));
std::string log_Path = "/var/log/grd_login/"; std::string log_Path = "/var/log/grd_login/";
//#ifdef _WIN32 //#ifdef _WIN32
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
log_Path = "./"; log_Path = "./";
#endif #endif
log_Path += "response.html"; log_Path += "response.html";
FILE* f = fopen(log_Path.data(), "wt"); FILE* f = fopen(log_Path.data(), "wt");
if (f) { if (f) {
std::string responseString = responseStringStream.str(); std::string responseString = responseStringStream.str();
fwrite(responseString.data(), 1, responseString.size(), f); fwrite(responseString.data(), 1, responseString.size(), f);
fclose(f); fclose(f);
} }
// */ // */
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(responseStringStream.str()); if (mSendErrorsToAdminEmail) sendErrorsAsEmail(responseStringStream.str());
return -9; return -9;
} }
//sendErrorsAsEmail("<html><head><title>Hallo</title></head><body><font color='red'>Rote Test </font></body>"); //sendErrorsAsEmail("<html><head><title>Hallo</title></head><body><font color='red'>Rote Test </font></body>");
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>(); Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
std::string stateString = ""; std::string stateString = "";
if (!object.isNull("state")) { if (!object.isNull("state")) {
auto state = object.get("state"); auto state = object.get("state");
stateString = state.convert<std::string>(); stateString = state.convert<std::string>();
} }
if (stateString != "success") { if (stateString != "success") {
addError(new Error("SigningTransaction", "php server don't return success")); addError(new Error("SigningTransaction", "php server don't return success"));
if (!object.isNull("msg")) { if (!object.isNull("msg")) {
addError(new ParamError("SigningTransaction", "msg:", object.get("msg").convert<std::string>().data())); addError(new ParamError("SigningTransaction", "msg:", object.get("msg").convert<std::string>().data()));
} }
if (!object.isNull("details")) { if (!object.isNull("details")) {
addError(new ParamError("SigningTransaction", "details:", object.get("details").convert<std::string>().data())); addError(new ParamError("SigningTransaction", "details:", object.get("details").convert<std::string>().data()));
} }
if (!object.isNull("user_error")) { if (!object.isNull("user_error")) {
addError(new ParamError("SigningTransaction", "user_error", object.get("user_error").convert<std::string>().data())); addError(new ParamError("SigningTransaction", "user_error", object.get("user_error").convert<std::string>().data()));
} }
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -10; return -10;
} }
delete clientSession; delete clientSession;
//printf("state: %s\n", stateString.data()); //printf("state: %s\n", stateString.data());
//int zahl = 1; //int zahl = 1;
} }
catch (Poco::Exception& e) { catch (Poco::Exception& e) {
addError(new ParamError("SigningTransaction", "connect error to php server", e.displayText().data())); addError(new ParamError("SigningTransaction", "connect error to php server", e.displayText().data()));
addError(new ParamError("SigningTransaction", "url", ServerConfig::g_php_serverHost.data())); addError(new ParamError("SigningTransaction", "url", ServerConfig::g_php_serverHost.data()));
addError(new ParamError("SigningTransaction", "choose_ssl", choose_ssl)); addError(new ParamError("SigningTransaction", "choose_ssl", choose_ssl));
if (mSendErrorsToAdminEmail) sendErrorsAsEmail(); if (mSendErrorsToAdminEmail) sendErrorsAsEmail();
return -8; return -8;
} }
return 0; return 0;
} }

View File

@ -1,46 +1,46 @@
#ifndef GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE #ifndef GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE
#define GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE #define GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE
#include "CPUTask.h" #include "CPUTask.h"
#include "../lib/ErrorList.h" #include "../lib/ErrorList.h"
#include "../model/TransactionBase.h" #include "../model/TransactionBase.h"
#include "../model/User.h" #include "../model/User.h"
#include "../controller/User.h" #include "../controller/User.h"
#include "../proto/gradido/Transaction.pb.h" #include "../proto/gradido/Transaction.pb.h"
#include "ProcessingTransaction.h" #include "ProcessingTransaction.h"
/* /*
* @author: Dario Rekowski * @author: Dario Rekowski
* *
* @date: 28.10.19 * @date: 28.10.19
* @desc: Task for signing Transactions * @desc: Task for signing Transactions
*/ */
class SigningTransaction : public UniLib::controller::CPUTask, public ErrorList class SigningTransaction : public UniLib::controller::CPUTask, public ErrorList
{ {
public: public:
SigningTransaction(Poco::AutoPtr<ProcessingTransaction> processingeTransaction, Poco::AutoPtr<controller::User> newUser, bool sendErrorsToAdmin = true); SigningTransaction(Poco::AutoPtr<ProcessingTransaction> processingeTransaction, Poco::AutoPtr<controller::User> newUser, bool sendErrorsToAdmin = true);
virtual ~SigningTransaction(); virtual ~SigningTransaction();
int run(); int run();
const char* getResourceType() const { return "SigningTransaction"; }; const char* getResourceType() const { return "SigningTransaction"; };
protected: protected:
Poco::AutoPtr<ProcessingTransaction> mProcessingeTransaction; Poco::AutoPtr<ProcessingTransaction> mProcessingeTransaction;
Poco::AutoPtr<controller::User> mNewUser; Poco::AutoPtr<controller::User> mNewUser;
bool mSendErrorsToAdminEmail; bool mSendErrorsToAdminEmail;
private: private:
std::string getUserEmail(); std::string getUserEmail();
}; };
#endif //GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE #endif //GRADIDO_LOGIN_SERVER_TASKS_SIGNING_TRANSACTION_INCLUDE

View File

@ -1,205 +1,205 @@
<%@ page class="LoginPage" %> <%@ page class="LoginPage" %>
<%@ page form="true" %> <%@ page form="true" %>
<%@ page baseClass="SessionHTTPRequestHandler" %> <%@ page baseClass="SessionHTTPRequestHandler" %>
<%@ page ctorArg="Session*" %> <%@ page ctorArg="Session*" %>
<%@ header include="SessionHTTPRequestHandler.h" %> <%@ header include="SessionHTTPRequestHandler.h" %>
<%@ page compressed="true" %> <%@ page compressed="true" %>
<%! <%!
#include "../gettext.h" #include "../gettext.h"
#include "Poco/Net/HTTPCookie.h" #include "Poco/Net/HTTPCookie.h"
#include "Poco/Net/HTTPServerParams.h" #include "Poco/Net/HTTPServerParams.h"
#include "Poco/Logger.h" #include "Poco/Logger.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/LanguageManager.h" #include "../SingletonManager/LanguageManager.h"
#include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/ErrorManager.h"
%> %>
<%% <%%
const char* pageName = "Login"; const char* pageName = "Login";
auto sm = SessionManager::getInstance(); auto sm = SessionManager::getInstance();
auto lm = LanguageManager::getInstance(); auto lm = LanguageManager::getInstance();
auto em = ErrorManager::getInstance(); auto em = ErrorManager::getInstance();
auto lang = chooseLanguage(request); auto lang = chooseLanguage(request);
//printf("choose language return: %d\n", lang); //printf("choose language return: %d\n", lang);
auto langCatalog = lm->getFreeCatalog(lang); auto langCatalog = lm->getFreeCatalog(lang);
std::string presetEmail(""); std::string presetEmail("");
if(mSession && mSession->getUser()) { if(mSession && mSession->getUser()) {
presetEmail = mSession->getUser()->getEmail(); presetEmail = mSession->getUser()->getEmail();
} }
if(!form.empty()) { if(!form.empty()) {
bool langUpdatedByBtn = false; bool langUpdatedByBtn = false;
auto langBtn = form.get("lang", ""); auto langBtn = form.get("lang", "");
if(langBtn != "") { if(langBtn != "") {
langUpdatedByBtn = true; langUpdatedByBtn = true;
} }
/* /*
auto langInput = form.get("lang", ""); auto langInput = form.get("lang", "");
auto updatedLang = LANG_NULL; auto updatedLang = LANG_NULL;
if(langBtn != "") { if(langBtn != "") {
updatedLang = chooseLanguage(request, langBtn); updatedLang = chooseLanguage(request, langBtn);
langUpdatedByBtn = true; langUpdatedByBtn = true;
} else if(langInput != "") { } else if(langInput != "") {
updatedLang = chooseLanguage(request, langInput); updatedLang = chooseLanguage(request, langInput);
} }
if(updatedLang != LANG_NULL && updatedLang != lang) { if(updatedLang != LANG_NULL && updatedLang != lang) {
lang = updatedLang; lang = updatedLang;
langCatalog = lm->getFreeCatalog(lang); langCatalog = lm->getFreeCatalog(lang);
} }
*/ */
auto email = form.get("login-email", ""); auto email = form.get("login-email", "");
auto password = form.get("login-password", ""); auto password = form.get("login-password", "");
if(email != "" && password != "") { if(email != "" && password != "") {
//auto session = sm->getSession(request); //auto session = sm->getSession(request);
//if(!mSession) mSession = sm->findByEmail(email); //if(!mSession) mSession = sm->findByEmail(email);
if(!mSession) { if(!mSession) {
mSession = sm->getNewSession(); mSession = sm->getNewSession();
mSession->setLanguageCatalog(langCatalog); mSession->setLanguageCatalog(langCatalog);
// get language // get language
// first check url, second check language header // first check url, second check language header
// for debugging client ip // for debugging client ip
auto client_host = request.clientAddress().host(); auto client_host = request.clientAddress().host();
//auto client_ip = request.clientAddress(); //auto client_ip = request.clientAddress();
// X-Real-IP forwarded ip from nginx config // X-Real-IP forwarded ip from nginx config
auto client_host_string = request.get("X-Real-IP", client_host.toString()); auto client_host_string = request.get("X-Real-IP", client_host.toString());
std::string clientIpString = "client ip: "; std::string clientIpString = "client ip: ";
client_host = Poco::Net::IPAddress(client_host_string); client_host = Poco::Net::IPAddress(client_host_string);
clientIpString += client_host_string; clientIpString += client_host_string;
Poco::Logger::get("requestLog").information(clientIpString); Poco::Logger::get("requestLog").information(clientIpString);
// debugging end // debugging end
mSession->setClientIp(client_host); mSession->setClientIp(client_host);
response.addCookie(mSession->getLoginCookie()); response.addCookie(mSession->getLoginCookie());
} else { } else {
langCatalog = mSession->getLanguageCatalog(); langCatalog = mSession->getLanguageCatalog();
} }
UserStates user_state; UserStates user_state;
try { try {
user_state = mSession->loadUser(email, password); user_state = mSession->loadUser(email, password);
} catch (Poco::Exception& ex) { } catch (Poco::Exception& ex) {
addError(new ParamError("login", "exception by calling loadUser: ", ex.displayText())); addError(new ParamError("login", "exception by calling loadUser: ", ex.displayText()));
sendErrorsAsEmail(); sendErrorsAsEmail();
addError(new Error("Error", "Intern Server error, please try again later")); addError(new Error("Error", "Intern Server error, please try again later"));
} }
auto user = mSession->getNewUser(); auto user = mSession->getNewUser();
if(user_state >= USER_LOADED_FROM_DB && !user.isNull() && !user->getModel()->getPublicKey()) { if(user_state >= USER_LOADED_FROM_DB && !user.isNull() && !user->getModel()->getPublicKey()) {
if(mSession->generateKeys(true, true)) { if(mSession->generateKeys(true, true)) {
user_state = USER_COMPLETE; user_state = USER_COMPLETE;
if(user->getModel()->isDisabled()) { if(user->getModel()->isDisabled()) {
user_state = USER_DISABLED; user_state = USER_DISABLED;
} }
} }
} else { } else {
//printf("pubkey exist: %p\n",user->getModel()->getPublicKey()); //printf("pubkey exist: %p\n",user->getModel()->getPublicKey());
} }
getErrors(mSession); getErrors(mSession);
auto uri_start = request.serverParams().getServerName(); auto uri_start = request.serverParams().getServerName();
auto lastExternReferer = mSession->getLastReferer(); auto lastExternReferer = mSession->getLastReferer();
printf("user_state: %d\n", user_state); printf("user_state: %d\n", user_state);
switch(user_state) { switch(user_state) {
case USER_EMPTY: case USER_EMPTY:
case USER_PASSWORD_INCORRECT: case USER_PASSWORD_INCORRECT:
addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!")), false); addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!")), false);
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
break; break;
case USER_PASSWORD_ENCRYPTION_IN_PROCESS: case USER_PASSWORD_ENCRYPTION_IN_PROCESS:
addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut.")), false); addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut.")), false);
break; break;
case USER_KEYS_DONT_MATCH: case USER_KEYS_DONT_MATCH:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it."))); addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it.")));
break; break;
case USER_DISABLED: case USER_DISABLED:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Benutzer ist deaktiviert, kein Login möglich!"))); addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Benutzer ist deaktiviert, kein Login möglich!")));
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
break; break;
case USER_NO_PRIVATE_KEY: case USER_NO_PRIVATE_KEY:
case USER_COMPLETE: case USER_COMPLETE:
case USER_EMAIL_NOT_ACTIVATED: case USER_EMAIL_NOT_ACTIVATED:
auto referer = request.find("Referer"); auto referer = request.find("Referer");
std::string refererString; std::string refererString;
if (referer != request.end()) { if (referer != request.end()) {
refererString = referer->second; refererString = referer->second;
} }
if(lastExternReferer != "") { if(lastExternReferer != "") {
//printf("redirect to: %s\n", lastExternReferer.data()); //printf("redirect to: %s\n", lastExternReferer.data());
response.redirect(lastExternReferer); response.redirect(lastExternReferer);
} else if(refererString != "" && } else if(refererString != "" &&
refererString.find("login") == std::string::npos && refererString.find("login") == std::string::npos &&
refererString.find("logout") == std::string::npos && refererString.find("logout") == std::string::npos &&
refererString.find("user_delete") == std::string::npos && refererString.find("user_delete") == std::string::npos &&
refererString != ServerConfig::g_serverPath + request.getURI()) { refererString != ServerConfig::g_serverPath + request.getURI()) {
std::string uri = request.getURI(); std::string uri = request.getURI();
printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data()); printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data());
response.redirect(refererString); response.redirect(refererString);
} else { } else {
//printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data()); //printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data());
response.redirect(ServerConfig::g_php_serverPath + "/"); response.redirect(ServerConfig::g_php_serverPath + "/");
} }
return; return;
} }
} else if(!langUpdatedByBtn) { } else if(!langUpdatedByBtn) {
addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("Username and password are needed!")), false); addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("Username and password are needed!")), false);
} }
} else { } else {
// on enter login page with empty form // on enter login page with empty form
//auto session = sm->getSession(request); //auto session = sm->getSession(request);
// remove old cookies and session if exist // remove old cookies and session if exist
if(mSession) { if(mSession) {
getErrors(mSession); getErrors(mSession);
sm->releaseSession(mSession); sm->releaseSession(mSession);
} }
sm->deleteLoginCookies(request, response); sm->deleteLoginCookies(request, response);
} }
%><%@ include file="header.cpsp" %> %><%@ include file="header.cpsp" %>
<%= getErrorsHtml() %> <%= getErrorsHtml() %>
<!--<input type="hidden" name="lang" value="<%= LanguageManager::keyForLanguage(lang) %>">--> <!--<input type="hidden" name="lang" value="<%= LanguageManager::keyForLanguage(lang) %>">-->
<div class="center-form-container"> <div class="center-form-container">
<%@ include file="flags.cpsp" %> <%@ include file="flags.cpsp" %>
<div class="center-form-form"> <div class="center-form-form">
<form action="<%= ServerConfig::g_serverPath %>/" method="POST"> <form action="<%= ServerConfig::g_serverPath %>/" method="POST">
<input class="form-control" type="text" name="login-email" placeholder="<%= langCatalog->gettext("E-Mail") %>" value="<%= presetEmail %>"/> <input class="form-control" type="text" name="login-email" placeholder="<%= langCatalog->gettext("E-Mail") %>" value="<%= presetEmail %>"/>
<input class="form-control" type="password" name="login-password" placeholder="<%= langCatalog->gettext("Password") %>" /> <input class="form-control" type="password" name="login-password" placeholder="<%= langCatalog->gettext("Password") %>" />
<button type="submit" name="submit" class="center-form-submit form-button"><%= langCatalog->gettext(" Login ") %></button> <button type="submit" name="submit" class="center-form-submit form-button"><%= langCatalog->gettext(" Login ") %></button>
</form> </form>
</div> </div>
<div class="center-form-bottom"> <div class="center-form-bottom">
<div class="signup-link"> <div class="signup-link">
<p><%= langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") %></p> <p><%= langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") %></p>
<a href="https://elopage.com/s/gradido/registration-de/payment?locale=de"> <a href="https://elopage.com/s/gradido/registration-de/payment?locale=de">
<%= langCatalog->gettext("Create New Account") %> <%= langCatalog->gettext("Create New Account") %>
</a> </a>
</div> </div>
<div class="reset-pwd-link"> <div class="reset-pwd-link">
<a href="<%= ServerConfig::g_serverPath %>/resetPassword"><%= langCatalog->gettext("Passwort vergessen") %></a> <a href="<%= ServerConfig::g_serverPath %>/resetPassword"><%= langCatalog->gettext("Passwort vergessen") %></a>
</div> </div>
</div> </div>
</div> </div>
<p>&nbsp;</p> <p>&nbsp;</p>
<div class="container"> <div class="container">
<a href="https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing" target="_blank">Zum Whitepaper</a> <a href="https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing" target="_blank">Zum Whitepaper</a>
<br> <br>
<br> <br>
<a href="https://docs.google.com/document/d/1kcX1guOi6tDgnFHD9tf7fB_MneKTx-0nHJxzdN8ygNs/edit?usp=sharing" target="_blank">To the Whitepaper</a> <a href="https://docs.google.com/document/d/1kcX1guOi6tDgnFHD9tf7fB_MneKTx-0nHJxzdN8ygNs/edit?usp=sharing" target="_blank">To the Whitepaper</a>
</div> </div>
<%@ include file="footer.cpsp" %> <%@ include file="footer.cpsp" %>