From 582aba5bcd482d3b5931e741a433f68a48b8011e Mon Sep 17 00:00:00 2001 From: Dario Date: Thu, 11 Jun 2020 17:56:20 +0200 Subject: [PATCH] remove not used class, add header and footer for christines design, start changing checkTransaction in new design --- src/cpp/MySQL/MysqlTable.cpp | 146 ------------------ src/cpp/MySQL/MysqlTable.h | 207 -------------------------- src/cpp/ServerConfig.cpp | 2 + src/cpp/ServerConfig.h | 1 + src/cpp/model/TransactionTransfer.cpp | 2 + src/cpp/model/TransactionTransfer.h | 4 +- src/cpp/model/table/ModelBase.h | 2 +- src/cpp/tasks/SigningTransaction.cpp | 5 +- src/cpp/tasks/WriteIntoDBTask.cpp | 46 ------ src/cpp/tasks/WriteIntoDBTask.h | 30 ---- src/cpsp/checkTransaction.cpsp | 81 +++++++++- src/cpsp/footer_chr.cpsp | 22 +++ src/cpsp/header_navi_chr.cpsp | 55 +++++++ 13 files changed, 168 insertions(+), 435 deletions(-) delete mode 100644 src/cpp/MySQL/MysqlTable.cpp delete mode 100644 src/cpp/MySQL/MysqlTable.h delete mode 100644 src/cpp/tasks/WriteIntoDBTask.cpp delete mode 100644 src/cpp/tasks/WriteIntoDBTask.h create mode 100644 src/cpsp/footer_chr.cpsp create mode 100644 src/cpsp/header_navi_chr.cpsp diff --git a/src/cpp/MySQL/MysqlTable.cpp b/src/cpp/MySQL/MysqlTable.cpp deleted file mode 100644 index 150c1c074..000000000 --- a/src/cpp/MySQL/MysqlTable.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "MysqlTable.h" -#include "Poco/Mutex.h" -#include - -#include "../ServerConfig.h" - -MysqlTable::MysqlTable(size_t fieldCount) - : mFieldCount(fieldCount), mHeader(nullptr) -{ - mHeader = new MysqlTableColumn[fieldCount]; -} - -MysqlTable::~MysqlTable() -{ - if (mHeader) { - delete[] mHeader; - mHeader = nullptr; - } - for (auto it = mRows.begin(); it != mRows.end(); it++) { - for (auto sub_it = (*it)->begin(); sub_it != (*it)->end(); sub_it++) { - delete *sub_it; - } - delete *it; - } - mRows.clear(); -} - -bool MysqlTable::setHeader(int index, const char* name, MysqlRowType type) -{ - if (index < 0 || index >= mFieldCount) { - return false; - } - if (!mHeader) { - return false; - } - - mHeader[index].name = name; - mHeader[index].type = type; - - return true; -} - -bool MysqlTable::addCellToCurrentRow(MysqlTableCell* cell) -{ - - if (!cell) { - addError(new Error(__FUNCTION__, "zero pointer")); - return false; - } - - if (mRows.size() == 0) { - addError(new Error(__FUNCTION__, "row container is empty")); - return false; - } - - auto last_row = mRows.back(); - auto fieldIndex = last_row->size(); - if (fieldIndex >= mFieldCount) { - addError(new Error(__FUNCTION__, "invalid Cell count")); - delete cell; - return false; - } - if (cell->getType() != MYSQL_ROW_NULL && cell->getType() != mHeader[fieldIndex].type) { - addError(new Error(__FUNCTION__, "field type mismatch")); - delete cell; - return false; - } - - last_row->push_back(cell); - - return true; -} -//using namespace Poco::Data::Keywords -// new Binding(t, name, AbstractBinding::PD_IN); -int MysqlTable::connectToStatement(Poco::Data::Statement* stmt, int rowIndex/* = 0*/) -{ - std::string strCopy; - for (auto itRow = mRows.begin(); itRow != mRows.end(); itRow++) { - if (0 == rowIndex) { - for (auto itCell = (*itRow)->begin(); itCell != (*itRow)->end(); itCell++) { - MysqlTableCell* cell = (*itCell); - switch ((*itCell)->getType()) { - case MYSQL_ROW_STRING: - strCopy = (const char*)(*cell); - stmt->bind(strCopy); - break; - case MYSQL_ROW_INT: stmt->bind((Poco::Int32)(*cell)); break; - case MYSQL_ROW_LONG: stmt->bind((Poco::Int64)(*cell)); break; - case MYSQL_ROW_BINARY: - // Poco::Data::BLOB data(std::vector({ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' })); - Poco::Data::BLOB data((unsigned char*)(*cell), cell->size()); - stmt->bind(data); - break; - } - } - break; - } - rowIndex--; - } - return 0; -} - -size_t MysqlTable::getFieldTypeSize(MysqlRowType type) -{ - switch (type) { - case MYSQL_ROW_DECIMAL: return sizeof(double); - case MYSQL_ROW_INT: return sizeof(long); - case MYSQL_ROW_LONG: return sizeof(long long); - case MYSQL_ROW_STRING: return sizeof(std::string); - } - return 0; -} - -time_t MysqlTable::parseFromMysqlDateTime(const char* mysql_date_time) -{ - - struct tm * parsedTime; - // used because localtime return an internal pointer, not thread safe - Poco::Mutex& timeMutex = ServerConfig::g_TimeMutex; - - int year, month, day, hour, minute, second; - // ex: 2009-10-29 - if (sscanf(mysql_date_time, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second) != EOF) { - time_t rawTime; - time(&rawTime); - - // static, used for every thread - timeMutex.lock(); - parsedTime = localtime(&rawTime); - - // tm_year is years since 1900 - parsedTime->tm_year = year - 1900; - // tm_months is months since january - parsedTime->tm_mon = month - 1; - parsedTime->tm_mday = day; - parsedTime->tm_hour = hour; - parsedTime->tm_min = minute; - parsedTime->tm_sec = second; - - rawTime = mktime(parsedTime); - timeMutex.unlock(); - - return rawTime; - } - return 0; -} diff --git a/src/cpp/MySQL/MysqlTable.h b/src/cpp/MySQL/MysqlTable.h deleted file mode 100644 index 763e4dae4..000000000 --- a/src/cpp/MySQL/MysqlTable.h +++ /dev/null @@ -1,207 +0,0 @@ - -/*! -* -* \author: einhornimmond -* -* \date: 04.04.19 -* -* \brief: Config Basic Structure -*/ - -#ifndef DR_LUA_WEB_MODULE_STRUCTURES_MYSQL_QUERY_RESULT__H -#define DR_LUA_WEB_MODULE_STRUCTURES_MYSQL_QUERY_RESULT__H - -#include -#include -#include "../lib/ErrorList.h" -#include "mysql.h" - -#include "Poco/Data/Session.h" - - -enum MysqlRowType { - MYSQL_ROW_STRING, - MYSQL_ROW_INT, // 32 Bit - MYSQL_ROW_LONG, // 64 Bit - MYSQL_ROW_DECIMAL, // double - MYSQL_ROW_TIMESTAMP, - MYSQL_ROW_DATETIME, - MYSQL_ROW_BINARY, - MYSQL_ROW_NULL, - MYSQL_ROW_TYPE_COUNT, - MYSQL_ROW_TYPE_NONE -}; - -struct MysqlTableColumn -{ - MysqlTableColumn() - : type(MYSQL_ROW_NULL), name("null") {} - MysqlRowType type; - std::string name; -}; - -class MysqlTableCell -{ -public: - MysqlTableCell(MysqlRowType type = MYSQL_ROW_NULL) : mType(type) {} - - inline bool isString() const { return mType == MYSQL_ROW_STRING; } - inline bool isInt() const { return mType == MYSQL_ROW_INT; } - inline bool isLong() const { return mType == MYSQL_ROW_LONG; } - inline bool isDateTime() const { return mType == MYSQL_ROW_DATETIME; } - inline bool isNull() const { return mType == MYSQL_ROW_NULL; } - inline bool isDecimal() const { return mType == MYSQL_ROW_DECIMAL; } - inline bool isBinary() const { return mType == MYSQL_ROW_BINARY; } - inline MysqlRowType getType() const { return mType; } - - virtual operator const char*() const { return ""; } - virtual operator Poco::Int32() const { return 0; } - virtual operator Poco::Int64() const { return 0; } - virtual operator unsigned char*() const { return nullptr; } - virtual size_t size() { return 0; } - -protected: - MysqlRowType mType; -}; - -class MysqlTableCellString : public MysqlTableCell -{ -public: - MysqlTableCellString(const char* content) : MysqlTableCell(MYSQL_ROW_STRING), mContent(content) {} - MysqlTableCellString(const char* content, size_t count) : MysqlTableCell(MYSQL_ROW_STRING), mContent(content, count) {} - - - virtual operator const char*() const { return mContent.data(); } - virtual size_t size() { return mContent.size(); } -protected: - std::string mContent; -}; - -class MysqlTableCellInt : public MysqlTableCell -{ -public: - MysqlTableCellInt(Poco::Int32 value) : MysqlTableCell(MYSQL_ROW_INT), mContent(value) {} - - virtual operator Poco::Int32() const { return mContent; } -protected: - Poco::Int32 mContent; -}; - -class MysqlTableCellLong : public MysqlTableCell -{ -public: - MysqlTableCellLong(const Poco::Int64& value) : MysqlTableCell(MYSQL_ROW_LONG), mContent(value) {} - - virtual operator Poco::Int64() const { return mContent; } - -protected: - Poco::Int64 mContent; -}; - -class MysqlTableCellTimestamp : public MysqlTableCell -{ -public: - MysqlTableCellTimestamp(const time_t& timestamp) : MysqlTableCell(MYSQL_ROW_TIMESTAMP), mTimestamp(timestamp) {} - -protected: - time_t mTimestamp; -}; - -class MysqlTableCellDateTime : public MysqlTableCell -{ -public: - MysqlTableCellDateTime(const MYSQL_TIME& mysql_time) : MysqlTableCell(MYSQL_ROW_DATETIME), mMysqlTime(mysql_time) {} - -protected: - MYSQL_TIME mMysqlTime; -}; - -class MysqlTableCellDecimal : public MysqlTableCell -{ -public: - MysqlTableCellDecimal(const double& value) : MysqlTableCell(MYSQL_ROW_DECIMAL), mDecimal(value) {} - -protected: - double mDecimal; -}; - -class MysqlTableCellBinary : public MysqlTableCell -{ -public: - MysqlTableCellBinary(const unsigned char* data, size_t _size) :MysqlTableCell(MYSQL_ROW_BINARY), m_data(nullptr), m_size(_size) { - m_data = (unsigned char*)malloc(m_size); - memcpy(m_data, data, m_size); - } - ~MysqlTableCellBinary() { - if (m_data) free(m_data); - m_data = nullptr; - m_size = 0; - } - - virtual operator unsigned char*() const { return m_data; } - virtual size_t size() { return m_size; } -protected: - unsigned char* m_data; - size_t m_size; - -}; - -class MysqlTable : public ErrorList -{ -public: - MysqlTable(size_t fieldCount); - ~MysqlTable(); - - bool setHeader(int index, const char* name, MysqlRowType type); - inline MysqlRowType getHeaderType(int index) { - if (index > 0 && index < mFieldCount) { - return mHeader[index].type; - } - addError(new ParamError(__FUNCTION__, "invalid field index:", index)); - return MYSQL_ROW_TYPE_NONE; - } - inline const char* getHeaderName(int index) { - if (index > 0 && index < mFieldCount) { - return mHeader[index].name.data(); - } - addError(new ParamError(__FUNCTION__, "invalid field index:", index)); - return nullptr; - } - inline bool addCellToCurrentRow(Poco::Int32 value) { return addCellToCurrentRow(new MysqlTableCellInt(value)); } - inline bool addCellToCurrentRow(const Poco::Int64& value) { return addCellToCurrentRow(new MysqlTableCellLong(value)); } - inline bool addCellToCurrentRow(const char* string) { return addCellToCurrentRow(new MysqlTableCellString(string)); } - inline bool addCellToCurrentRow(const double& value) { return addCellToCurrentRow(new MysqlTableCellDecimal(value)); } - inline bool addCellToCurrentRow(const unsigned char* bytes, size_t size) { return addCellToCurrentRow(new MysqlTableCellBinary(bytes, size)); } - inline bool addCellToCurrentRowTime(const time_t& time) { return addCellToCurrentRow(new MysqlTableCellTimestamp(time)); } - inline bool addCellToCurrentRow() { return addCellToCurrentRow(new MysqlTableCell); } - - //bool copyColumnValues() - - //! \brief free memory after not longer using it - bool addCellToCurrentRow(MysqlTableCell* cell); - inline void addRow() { mRows.push_back(new std::list); } - inline size_t getRowCount() const { return mRows.size(); } - inline size_t getFieldCount() const { return mFieldCount; } - inline MysqlRowType getRowType(int fieldIndex) const { - if (fieldIndex >= mFieldCount || fieldIndex < 0) return MYSQL_ROW_TYPE_NONE; - return mHeader[fieldIndex].type; - } - - inline void setTableName(const char* tableName) { mTableName = tableName; } - inline const char* getTableName() { return mTableName.data(); } - - int connectToStatement(Poco::Data::Statement* stmt, int rowIndex = 0); - - static size_t getFieldTypeSize(MysqlRowType type); - - static time_t parseFromMysqlDateTime(const char* mysql_date_time); - -protected: - size_t mFieldCount; - MysqlTableColumn* mHeader; - std::list*> mRows; - std::string mTableName; -}; - - -#endif //DR_LUA_WEB_MODULE_STRUCTURES_MYSQL_QUERY_RESULT__H \ No newline at end of file diff --git a/src/cpp/ServerConfig.cpp b/src/cpp/ServerConfig.cpp index ddd80f1ab..4382ce528 100644 --- a/src/cpp/ServerConfig.cpp +++ b/src/cpp/ServerConfig.cpp @@ -43,6 +43,7 @@ namespace ServerConfig { EmailAccount g_EmailAccount; int g_SessionTimeout = SESSION_TIMEOUT_DEFAULT; std::string g_serverPath; + int g_serverPort = 0; Languages g_default_locale; std::string g_php_serverPath; std::string g_php_serverHost; @@ -209,6 +210,7 @@ namespace ServerConfig { g_serverPath = cfg.getString("loginServer.path", ""); replaceZeroIPWithLocalhostIP(g_serverPath); g_default_locale = LanguageManager::languageFromString(cfg.getString("loginServer.default_locale")); + g_serverPort = cfg.getInt("loginServer.port", 0); // replace 0.0.0.0 with actual server ip g_php_serverPath = cfg.getString("phpServer.url", ""); diff --git a/src/cpp/ServerConfig.h b/src/cpp/ServerConfig.h index 07632b183..02d01ad34 100644 --- a/src/cpp/ServerConfig.h +++ b/src/cpp/ServerConfig.h @@ -51,6 +51,7 @@ namespace ServerConfig { extern EmailAccount g_EmailAccount; extern int g_SessionTimeout; extern std::string g_serverPath; + extern int g_serverPort; extern Languages g_default_locale; extern std::string g_php_serverPath; extern std::string g_php_serverHost; diff --git a/src/cpp/model/TransactionTransfer.cpp b/src/cpp/model/TransactionTransfer.cpp index 7ace47627..f788eb814 100644 --- a/src/cpp/model/TransactionTransfer.cpp +++ b/src/cpp/model/TransactionTransfer.cpp @@ -143,6 +143,7 @@ const std::string& TransactionTransfer::getKontoNameCell(int index) return mKontoTable[index].kontoNameCell; } + const std::string& TransactionTransfer::getAmountCell(int index) { lock(); @@ -154,3 +155,4 @@ const std::string& TransactionTransfer::getAmountCell(int index) return mKontoTable[index].amountCell; } + diff --git a/src/cpp/model/TransactionTransfer.h b/src/cpp/model/TransactionTransfer.h index dc94e8c5b..1a6fadaac 100644 --- a/src/cpp/model/TransactionTransfer.h +++ b/src/cpp/model/TransactionTransfer.h @@ -30,7 +30,9 @@ public: protected: const static std::string mInvalidIndexMessage; - struct KontoTableEntry { + + struct KontoTableEntry + { public: KontoTableEntry(User* user, google::protobuf::int64 amount, bool negativeAmount = false); KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount = false); diff --git a/src/cpp/model/table/ModelBase.h b/src/cpp/model/table/ModelBase.h index 11f272166..95b756882 100644 --- a/src/cpp/model/table/ModelBase.h +++ b/src/cpp/model/table/ModelBase.h @@ -7,7 +7,7 @@ #include "../../lib/MultithreadContainer.h" #include "../../tasks/CPUTask.h" -#include "../../MySQL/MysqlTable.h" +//#include "../../MySQL/MysqlTable.h" #include "../../ServerConfig.h" diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 53c808582..73113655f 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -147,7 +147,10 @@ int SigningTransaction::run() { try { Profiler phpRequestTime; Poco::Net::HTTPClientSession* clientSession = nullptr; - if (ServerConfig::SERVER_TYPE_PRODUCTION == ServerConfig::g_ServerSetupType || + if (ServerConfig::g_serverPort) { + clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, ServerConfig::g_serverPort); + } + else if (ServerConfig::SERVER_TYPE_PRODUCTION == ServerConfig::g_ServerSetupType || ServerConfig::SERVER_TYPE_STAGING == ServerConfig::g_ServerSetupType) { clientSession = new Poco::Net::HTTPSClientSession(ServerConfig::g_php_serverHost, 443); } diff --git a/src/cpp/tasks/WriteIntoDBTask.cpp b/src/cpp/tasks/WriteIntoDBTask.cpp deleted file mode 100644 index ae6d92828..000000000 --- a/src/cpp/tasks/WriteIntoDBTask.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "WriteIntoDBTask.h" - -WriteIntoDBTask::WriteIntoDBTask(ConnectionType type, std::vector multipleData, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount/* = 0*/) - : UniLib::controller::CPUTask(cpuScheduler, taskDependenceCount), mConnectionType(type), mDataToInsert(multipleData) -{ - -} - -WriteIntoDBTask::~WriteIntoDBTask() -{ - for (auto it = mDataToInsert.begin(); it != mDataToInsert.end(); it++) { - delete *it; - } - mDataToInsert.clear(); -} - -int WriteIntoDBTask::run() -{ - auto cm = ConnectionManager::getInstance(); - auto session = cm->getConnection(mConnectionType); - - for (auto it = mDataToInsert.begin(); it != mDataToInsert.end(); it++) { - auto tableName = (*it)->getTableName(); - Poco::Data::Statement insert(session); - /*insert << "INSERT INTO Person VALUES(?, ?, ?)", - use(person.name), - use(person.address), - use(person.age);*/ - insert << "INSERT INTO " << tableName << " ("; - for (int iField = 0; iField < (*it)->getFieldCount(); iField++) { - if (iField > 0) insert << ","; - insert << (*it)->getHeaderName(iField); - } - insert << ") VALUES("; - for (int iCell = 0; iCell < (*it)->getFieldCount(); iCell++) { - if (iCell > 0) insert << ","; - insert << "?"; - } - insert << ")"; - (*it)->connectToStatement(&insert); - insert.execute(); - - } - - return 0; -} \ No newline at end of file diff --git a/src/cpp/tasks/WriteIntoDBTask.h b/src/cpp/tasks/WriteIntoDBTask.h deleted file mode 100644 index cafa84570..000000000 --- a/src/cpp/tasks/WriteIntoDBTask.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef GRADIDO_LOGIN_SERVER_TASKS_WRITE_INTO_DB_TASK_INCLUDE -#define GRADIDO_LOGIN_SERVER_TASKS_WRITE_INTO_DB_TASK_INCLUDE - -#include "CPUTask.h" -#include "../SingletonManager/ConnectionManager.h" -#include "../MySQL/MysqlTable.h" - -#include "Poco/Tuple.h" - -class WriteIntoDBTask : public UniLib::controller::CPUTask -{ -public: - //! \param multipleData clear table in deconstruction, call delete for every entry - WriteIntoDBTask(ConnectionType type, std::vector multipleData, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount = 0); - virtual ~WriteIntoDBTask(); - - virtual int run(); - - virtual const char* getResourceType() const { return "WriteIntoDBTask"; }; - -protected: - -private: - ConnectionType mConnectionType; - std::vector mDataToInsert; - -}; - - -#endif //GRADIDO_LOGIN_SERVER_TASKS_WRITE_INTO_DB_TASK_INCLUDE \ No newline at end of file diff --git a/src/cpsp/checkTransaction.cpsp b/src/cpsp/checkTransaction.cpsp index 2bdd29f09..97215942a 100644 --- a/src/cpsp/checkTransaction.cpsp +++ b/src/cpsp/checkTransaction.cpsp @@ -82,7 +82,82 @@ enum PageState { -%><%@ include file="header_navi.cpsp" %> +%><%@ include file="header_navi_chr.cpsp" %> +
+ + <% if(sumTransactions > 0 && sumTransactions - notReadyTransactions != 1) { %> + <% if(notReadyTransactions > 0) { %> + <%= sumTransactions - notReadyTransactions %> <%= gettext("von") %> <%= sumTransactions %> <%= gettext("Transaktionen sind bereit zum bestätigen") %> + <% } else { %> + <%= sumTransactions %> <%= gettext("Transaktionen warten darauf bestätigt zu werden.") %> + <% } %> + <% } %> + <% if(state == PAGE_NO_TRANSACTIONS) { %> + <% if(sumTransactions == 0) { %> + <%= gettext("Es gibt zurzeit keine Transaktionen zum bestätigen") %> + <% } else { %> + <%= gettext("Transaktion(en) werden noch vorbereitet, bitte lade die Seite in wenigen Augenblicken erneut.") %> + <% } %> + <% } %> + +
+
+
+

<%= gettext("Transaktion Unterzeichnen") %>

+ <% if(state == PAGE_TRANSACTION_TRANSFER) { + auto transferTransaction = processingTransaction->getTransferTransaction(); + memo = transferTransaction->getMemo(); + %> +
+

<%= gettext("Überweisung") %>

+
+
+ <%= gettext("Konto") %> + <%= gettext("Gradido") %> +
+ <% for(int i = 0; i < transferTransaction->getKontoTableSize(); i++) { %> + <%= transferTransaction->getKontoNameCellChr(i) %> + <%= transferTransaction->getAmountCellChr(i) %> + <% } %> +
+ Normaler User <info@software-labor.de> + -10 GDD +
+
+ dario frodo <dariofrodo@gmx.de> + 10 GDD +
+
+
+
+ Aktives Konto +
+
+ Normaler User <info@software-labor.de> +
+
+
+
+ Verwendungszweck +
+
+   +
+
+
+ + +
+
+
+
+
<% if(sumTransactions > 0 && sumTransactions - notReadyTransactions != 1) { %> @@ -125,7 +200,7 @@ enum PageState { <%= transferTransaction->getKontoNameCell(i) %> <%= transferTransaction->getAmountCell(i) %> - <% } %> + <% } %>
@@ -194,4 +269,4 @@ enum PageState { -<% } %><%@ include file="footer_ripple.cpsp" %> \ No newline at end of file +<% } %><%@ include file="footer_chr.cpsp" %> \ No newline at end of file diff --git a/src/cpsp/footer_chr.cpsp b/src/cpsp/footer_chr.cpsp new file mode 100644 index 000000000..dddfac465 --- /dev/null +++ b/src/cpsp/footer_chr.cpsp @@ -0,0 +1,22 @@ + + + + +
+ <%= mTimeProfiler.string() %> +
+
+

Community Server in Entwicklung

+

Alpha <%= ServerConfig::g_versionString %>

+
+ + + + \ No newline at end of file diff --git a/src/cpsp/header_navi_chr.cpsp b/src/cpsp/header_navi_chr.cpsp new file mode 100644 index 000000000..f72bd1332 --- /dev/null +++ b/src/cpsp/header_navi_chr.cpsp @@ -0,0 +1,55 @@ + + + + + + + Gradido Login Server: <%= pageName %> + + + + + + + +