read in login the real client ip X-Real-IP from nginx forwarded not from community server

This commit is contained in:
einhornimmond 2021-02-16 10:21:09 +01:00 committed by Ulf Gebhardt
parent 425a2beb9f
commit 512d307a19
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
6 changed files with 836 additions and 827 deletions

3
.gitmodules vendored
View File

@ -13,3 +13,6 @@
[submodule "dependencies/spirit-po"] [submodule "dependencies/spirit-po"]
path = dependencies/spirit-po path = dependencies/spirit-po
url = https://github.com/cbeck88/spirit-po.git url = https://github.com/cbeck88/spirit-po.git
[submodule "dependencies/protobuf"]
path = dependencies/protobuf
url = https://github.com/protocolbuffers/protobuf.git

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,68 +1,68 @@
# Build protoc # Build protoc
FROM gcc:7.5 as protoc_build FROM gcc:7.5 as protoc_build
RUN git clone --recurse-submodules https://github.com/protocolbuffers/protobuf.git RUN git clone --recurse-submodules https://github.com/protocolbuffers/protobuf.git
WORKDIR /protobuf WORKDIR /protobuf
RUN git checkout v3.9.1 RUN git checkout v3.9.1
RUN ./autogen.sh RUN ./autogen.sh
RUN ./configure --enable-static=yes RUN ./configure --enable-static=yes
RUN make -j$(grep processor /proc/cpuinfo | wc -l) RUN make -j$(grep processor /proc/cpuinfo | wc -l)
RUN make check RUN make check
CMD ["./protobuf"] CMD ["./protobuf"]
# Build # Build
From conanio/gcc7 as build From conanio/gcc7 as build
ENV DOCKER_WORKDIR="/code" ENV DOCKER_WORKDIR="/code"
USER root USER root
#RUN apt-get update && \ #RUN apt-get update && \
# apt-get install -y --no-install-recommends protobuf-compiler libprotobuf-dev && \ # apt-get install -y --no-install-recommends protobuf-compiler libprotobuf-dev && \
# apt-get autoclean && \ # apt-get autoclean && \
# apt-get autoremove && \ # apt-get autoremove && \
# apt-get clean && \ # apt-get clean && \
# rm -rf /var/lib/apt/lists/* # rm -rf /var/lib/apt/lists/*
#RUN grep processor /proc/cpuinfo | wc -l #RUN grep processor /proc/cpuinfo | wc -l
COPY --from=protoc_build /protobuf/src/.libs/protoc /usr/bin/ COPY --from=protoc_build /protobuf/src/.libs/protoc /usr/bin/
COPY --from=protoc_build /protobuf/src/.libs/libprotobuf.so.20.0.1 /usr/lib/libprotobuf.so.20 COPY --from=protoc_build /protobuf/src/.libs/libprotobuf.so.20.0.1 /usr/lib/libprotobuf.so.20
COPY --from=protoc_build /protobuf/src/.libs/libprotoc.so.20.0.1 /usr/lib/libprotoc.so.20 COPY --from=protoc_build /protobuf/src/.libs/libprotoc.so.20.0.1 /usr/lib/libprotoc.so.20
COPY --from=protoc_build /protobuf/src/google/protobuf/*.proto /usr/include/google/protobuf/ COPY --from=protoc_build /protobuf/src/google/protobuf/*.proto /usr/include/google/protobuf/
COPY --from=protoc_build /protobuf/src/google/protobuf/*.h /usr/include/google/protobuf/ COPY --from=protoc_build /protobuf/src/google/protobuf/*.h /usr/include/google/protobuf/
RUN mkdir -p ${DOCKER_WORKDIR} RUN mkdir -p ${DOCKER_WORKDIR}
WORKDIR ${DOCKER_WORKDIR} WORKDIR ${DOCKER_WORKDIR}
COPY . . COPY . .
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
RUN ls -la RUN ls -la
RUN cd dependencies/iroha-ed25519 && \ RUN cd dependencies/iroha-ed25519 && \
ls -la && \ ls -la && \
mkdir build && \ mkdir build && \
cd build && \ cd build && \
cmake .. -DEDIMPL=ref10 -DHASH=sha2_sphlib -DRANDOM=bcryptgen -DBUILD=STATIC && \ cmake .. -DEDIMPL=ref10 -DHASH=sha2_sphlib -DRANDOM=bcryptgen -DBUILD=STATIC && \
make -j$(grep processor /proc/cpuinfo | wc -l) make -j$(grep processor /proc/cpuinfo | wc -l)
RUN cd dependencies/mariadb-connector-c && \ RUN cd dependencies/mariadb-connector-c && \
mkdir build && \ mkdir build && \
cd build && \ cd build && \
cmake -DWITH_SSL=OFF .. cmake -DWITH_SSL=OFF ..
#RUN conan profile update settings.compiler.libcxx=libstdc++11 default #RUN conan profile update settings.compiler.libcxx=libstdc++11 default
RUN chmod +x compile_proto.sh RUN chmod +x compile_proto.sh
RUN chmod +x compile_pot.sh RUN chmod +x compile_pot.sh
RUN ls -la RUN ls -la
RUN ./compile_pot.sh RUN ./compile_pot.sh
RUN ./compile_proto.sh RUN ./compile_proto.sh
RUN mkdir build && \ RUN mkdir build && \
cd build && \ cd build && \
conan install .. --build=missing && \ conan install .. --build=missing && \
cmake .. && \ cmake .. && \
make -j$(grep processor /proc/cpuinfo | wc -l) make -j$(grep processor /proc/cpuinfo | wc -l)
# deploy # deploy
#From #From

View File

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