From 5090e21d783496f96e9716832d3b90c3274b46a7 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 13 Jan 2021 13:31:24 +0100 Subject: [PATCH] add node server test page for pauls, add functions to support this --- .../HTTPInterface/AdminNodeServerTestPage.cpp | 371 ++++++++++++++++++ .../HTTPInterface/AdminNodeServerTestPage.h | 18 + .../PageRequestHandlerFactory.cpp | 4 + src/cpp/controller/NodeServer.cpp | 9 + src/cpp/controller/NodeServer.h | 1 + src/cpp/model/gradido/TransactionBase.h | 1 + src/cpsp/adminNodeServerTest.cpsp | 173 ++++++++ 7 files changed, 577 insertions(+) create mode 100644 src/cpp/HTTPInterface/AdminNodeServerTestPage.cpp create mode 100644 src/cpp/HTTPInterface/AdminNodeServerTestPage.h create mode 100644 src/cpsp/adminNodeServerTest.cpsp diff --git a/src/cpp/HTTPInterface/AdminNodeServerTestPage.cpp b/src/cpp/HTTPInterface/AdminNodeServerTestPage.cpp new file mode 100644 index 000000000..5390904e7 --- /dev/null +++ b/src/cpp/HTTPInterface/AdminNodeServerTestPage.cpp @@ -0,0 +1,371 @@ +#include "AdminNodeServerTestPage.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/Net/HTMLForm.h" +#include "Poco/DeflatingStream.h" + + +#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + + +#include "../controller/NodeServer.h" +#include "../controller/User.h" +#include "../controller/HederaTopic.h" +#include "../lib/DataTypeConverter.h" +#include "../lib/Profiler.h" +#include "../model/gradido/Transaction.h" + +#include "Poco/Thread.h" + +enum PageType +{ + PAGE_CHOOSE_TEST, + PAGE_RUN_4_SET_TEST +}; + +#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + +#include "../ServerConfig.h" + + +void AdminNodeServerTestPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + Poco::Net::HTMLForm form(request, request.stream()); +#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + + const char* pageName = "Node Server Test"; + PageType page = PAGE_CHOOSE_TEST; + Poco::AutoPtr node_server; + Poco::AutoPtr user; + Poco::AutoPtr hedera_topic; + int hedera_timeout = 15; + + + if(!form.empty()) + { + auto node_server_id_string = form.get("test-node-servers", ""); + if(node_server_id_string != "") { + int node_server_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(node_server_id_string, node_server_id )) { + node_server = controller::NodeServer::load(node_server_id); + } + } + auto topic_id_string = form.get("test-hedera-topic", ""); + if(topic_id_string != "") { + int topic_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(topic_id_string, topic_id)) { + hedera_topic = controller::HederaTopic::load(topic_id); + } + } + auto test_timeout_string = form.get("test-timeout", ""); + if(test_timeout_string != "") { + DataTypeConverter::strToInt(test_timeout_string, hedera_timeout); + } + auto submit = form.get("submit", ""); + if(submit == "Run 4-Test") { + page = PAGE_RUN_4_SET_TEST; + } + } + + auto node_servers = controller::NodeServer::load(model::table::NODE_SERVER_GRADIDO_NODE); + auto hedera_topics = controller::HederaTopic::listAll(); + +#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + + bool withMaterialIcons = false; + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << "\n"; + // begin include header_large.cpsp + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: "; +#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + responseStream << ( pageName ); + responseStream << "\n"; + responseStream << "\n"; +#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + if(withMaterialIcons) { responseStream << "\n"; + responseStream << "\n"; +#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + } responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t
    \n"; + responseStream << "\t\t\t\t\t"; +#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + if(!user.isNull()) { responseStream << "\n"; + responseStream << "\t\t\t\t\t\t
  • getGroupBaseUrl() ); + responseStream << "/\">Startseite
  • \n"; + responseStream << "\t\t\t\t\t"; +#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\t\t
  • Gruppen
  • \n"; + responseStream << "\t\t\t\t\t
  • Node Server
  • \n"; + responseStream << "\t\t\t\t\t
  • Hedera Accounts
  • \n"; + responseStream << "\t\t\t\t\t
  • Hedera Topics
  • \n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
"; + // end include header_large.cpsp + responseStream << "\n"; +#line 63 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( getErrorsHtml() ); + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "\t\n"; + responseStream << "\t
\n"; + responseStream << "\t \n"; + responseStream << "\t
\n"; + responseStream << "\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t

Test 4-Set (2 AddMember, Creation, Transfer)\n"; + responseStream << "\t\t

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

1. Create two new accounts and show user public keys for comparisation

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

2. Send a add-member transaction to hedera topic with one signature (first user)

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

3. Send a add-member transaction to hedera topic with two signatures (first user and second user)

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

4. Send a creation transaction to second user, signed by first user

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

5. Send a transfer transaction from second user to first user signed by second user

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

6. Wait x seconds to give hedera time to process transactions

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

7. Ask choosen node for transaction and print result

\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t"; +#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + if(node_servers.size() == 0) { responseStream << "\n"; + responseStream << "\t\t\t\t\tEdit Node-Servers\n"; + responseStream << "\t\t\t\t"; +#line 85 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t"; +#line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + if(hedera_topics.size() == 0) { responseStream << "\n"; + responseStream << "\t\t\t\t\tEdit Hedera-Topics\n"; + responseStream << "\t\t\t\t"; +#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t seconds \n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t
\n"; + responseStream << "\t"; +#line 114 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + if(PAGE_RUN_4_SET_TEST == page && !hedera_topic.isNull() && !node_server.isNull()) { responseStream << "\n"; + responseStream << "\t
    \n"; + responseStream << "\t\t
  • \n"; + responseStream << "\t\t\t

    1. Create two new accounts and show user public keys for comparisation:

    \n"; + responseStream << "\t\t\t"; +#line 118 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + + Profiler time2; + auto group_id = hedera_topic->getModel()->getGroupId(); + auto user_group = controller::Group::load(group_id); + auto mnemonic_type = ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER; + + std::string password1 = "hsaj(2askaslASlllak3wjjeudsaj"; + auto user_1 = controller::User::create("testEmail@google.de", "Max", "Mustermann", group_id); + auto passphrase_1 = Passphrase::generate(&ServerConfig::g_Mnemonic_WordLists[mnemonic_type]); + auto gradido_key_pair_1 = KeyPairEd25519::create(passphrase_1); + user_1->setGradidoKeyPair(gradido_key_pair_1); + user_1->login(password1); + + std::string password2 = "uweia8saiSale,dsasA"; + auto user_2 = controller::User::create("testEmail2@google.de", "MJax", "Mustrermann", group_id); + auto passphrase_2 = Passphrase::generate(&ServerConfig::g_Mnemonic_WordLists[mnemonic_type]); + auto gradido_key_pair_2 = KeyPairEd25519::create(passphrase_2); + user_2->setGradidoKeyPair(gradido_key_pair_2); + user_2->login(password2); + responseStream << "\t\t\t\n"; + responseStream << "\t\t\t

    User 1: "; +#line 138 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( user_1->getPublicHex() ); + responseStream << "

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

    User 2: "; +#line 139 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( user_2->getPublicHex() ); + responseStream << "

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

    Time: "; +#line 140 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( time2.string() ); + responseStream << "\n"; + responseStream << "\t\t

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

    2. Send a add-member transaction to hedera topic with one signature (first user)

    \n"; + responseStream << "\t\t\t"; +#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + + time2.reset(); + { + auto transaction1 = model::gradido::Transaction::createGroupMemberUpdate(user_1, user_group); + transaction1->getTransactionBody()->getGroupMemberUpdate()->setMinSignatureCount(1); + transaction1->sign(user_1); + } + responseStream << "\n"; + responseStream << "\t\t\t

    Time: "; +#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( time2.string() ); + responseStream << "\n"; + responseStream << "\t\t

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

    3. Send a add-member transaction to hedera topic with two signatures (first user and second user)

    \n"; + responseStream << "\t\t\t"; +#line 156 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + + time2.reset(); + { + auto transaction2 = model::gradido::Transaction::createGroupMemberUpdate(user_2, user_group); + transaction2->getTransactionBody()->getGroupMemberUpdate()->setMinSignatureCount(2); + transaction2->sign(user_2); + transaction2->sign(user_1); + } + + responseStream << "\n"; + responseStream << "\t\t\t

    Time: "; +#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + responseStream << ( time2.string() ); + responseStream << "\n"; + responseStream << "\t\t

  • \n"; + responseStream << "\t
\n"; + responseStream << "\t"; +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServerTest.cpsp" + } responseStream << "\n"; + responseStream << "\t\n"; + responseStream << "
\n"; + responseStream << "\n"; + // begin include footer.cpsp + responseStream << "
\n"; + responseStream << "

Copyright © Gradido 2020

\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << " "; +#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" + responseStream << ( mTimeProfiler.string() ); + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "

Login Server in Entwicklung

\n"; + responseStream << "

Alpha "; +#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" + responseStream << ( ServerConfig::g_versionString ); + responseStream << "

\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << ""; + // end include footer.cpsp + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/AdminNodeServerTestPage.h b/src/cpp/HTTPInterface/AdminNodeServerTestPage.h new file mode 100644 index 000000000..a1ff3ad1d --- /dev/null +++ b/src/cpp/HTTPInterface/AdminNodeServerTestPage.h @@ -0,0 +1,18 @@ +#ifndef AdminNodeServerTestPage_INCLUDED +#define AdminNodeServerTestPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +#include "PageRequestMessagedHandler.h" + + +class AdminNodeServerTestPage: public PageRequestMessagedHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // AdminNodeServerTestPage_INCLUDED diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index c7f260ad2..2032d3c18 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -32,6 +32,7 @@ #include "AdminTopicPage.h" #include "AdminHederaAccountPage.h" #include "AdminNodeServerPage.h" +#include "AdminNodeServerTestPage.h" #include "DecodeTransactionPage.h" #include "RepairDefectPassphrase.h" @@ -148,6 +149,9 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c if (url_first_part == "/passphrased_transaction") { return basicSetup(new PassphrasedTransaction, request, timeUsed); } + if (url_first_part == "/adminNodeServerTest") { + return basicSetup(new AdminNodeServerTestPage, request, timeUsed); + } if (s) { if (externReferer != "") { s->setLastReferer(externReferer); diff --git a/src/cpp/controller/NodeServer.cpp b/src/cpp/controller/NodeServer.cpp index 857520a9e..9ae570e66 100644 --- a/src/cpp/controller/NodeServer.cpp +++ b/src/cpp/controller/NodeServer.cpp @@ -54,6 +54,15 @@ namespace controller { return Poco::AutoPtr(group); } + Poco::AutoPtr NodeServer::load(int id) + { + auto db = new model::table::NodeServer(); + if (1 == db->loadFromDB("id", id)) { + return new NodeServer(db); + } + return nullptr; + } + std::vector> NodeServer::load(model::table::NodeServerType type, int group_id/* = 0*/) { auto db = new model::table::NodeServer(); diff --git a/src/cpp/controller/NodeServer.h b/src/cpp/controller/NodeServer.h index ecd7e11e1..d91cc3612 100644 --- a/src/cpp/controller/NodeServer.h +++ b/src/cpp/controller/NodeServer.h @@ -42,6 +42,7 @@ namespace controller { //! \param group_id is zero take everyone static std::vector> load(model::table::NodeServerType type, int group_id = 0); + static Poco::AutoPtr load(int id); static std::vector> listAll(); // pick server randomly static NodeServerConnection pick(ServerConfig::HederaNetworkType type, int group_id = 0); diff --git a/src/cpp/model/gradido/TransactionBase.h b/src/cpp/model/gradido/TransactionBase.h index eb67d8d55..bea79c971 100644 --- a/src/cpp/model/gradido/TransactionBase.h +++ b/src/cpp/model/gradido/TransactionBase.h @@ -55,6 +55,7 @@ namespace model { bool isPublicKeyForbidden(const unsigned char* pubkey); inline Poco::UInt32 getMinSignatureCount() { return mMinSignatureCount; } + void setMinSignatureCount(Poco::UInt32 minSignatureCount) { mMinSignatureCount = minSignatureCount; } // called after sending transaction over hedera and after they was accepted from gradido node (at least one) virtual void transactionAccepted(Poco::AutoPtr user) = 0; diff --git a/src/cpsp/adminNodeServerTest.cpsp b/src/cpsp/adminNodeServerTest.cpsp new file mode 100644 index 000000000..08325ae04 --- /dev/null +++ b/src/cpsp/adminNodeServerTest.cpsp @@ -0,0 +1,173 @@ +<%@ page class="AdminNodeServerTestPage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%@ page baseClass="PageRequestMessagedHandler" %> +<%@ header include="PageRequestMessagedHandler.h" %> +<%! + +#include "../controller/NodeServer.h" +#include "../controller/User.h" +#include "../controller/HederaTopic.h" +#include "../lib/DataTypeConverter.h" +#include "../lib/Profiler.h" +#include "../model/gradido/Transaction.h" + +#include "Poco/Thread.h" + +enum PageType +{ + PAGE_CHOOSE_TEST, + PAGE_RUN_4_SET_TEST +}; + +%> +<%% + const char* pageName = "Node Server Test"; + PageType page = PAGE_CHOOSE_TEST; + Poco::AutoPtr node_server; + Poco::AutoPtr user; + Poco::AutoPtr hedera_topic; + int hedera_timeout = 15; + + + if(!form.empty()) + { + auto node_server_id_string = form.get("test-node-servers", ""); + if(node_server_id_string != "") { + int node_server_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(node_server_id_string, node_server_id )) { + node_server = controller::NodeServer::load(node_server_id); + } + } + auto topic_id_string = form.get("test-hedera-topic", ""); + if(topic_id_string != "") { + int topic_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(topic_id_string, topic_id)) { + hedera_topic = controller::HederaTopic::load(topic_id); + } + } + auto test_timeout_string = form.get("test-timeout", ""); + if(test_timeout_string != "") { + DataTypeConverter::strToInt(test_timeout_string, hedera_timeout); + } + auto submit = form.get("submit", ""); + if(submit == "Run 4-Test") { + page = PAGE_RUN_4_SET_TEST; + } + } + + auto node_servers = controller::NodeServer::load(model::table::NODE_SERVER_GRADIDO_NODE); + auto hedera_topics = controller::HederaTopic::listAll(); + +%><%@ include file="header_large.cpsp" %> +<%= getErrorsHtml() %> +
+ +
+ +
+
+
+

Test 4-Set (2 AddMember, Creation, Transfer) +

+
+

1. Create two new accounts and show user public keys for comparisation

+

2. Send a add-member transaction to hedera topic with one signature (first user)

+

3. Send a add-member transaction to hedera topic with two signatures (first user and second user)

+

4. Send a creation transaction to second user, signed by first user

+

5. Send a transfer transaction from second user to first user signed by second user

+

6. Wait x seconds to give hedera time to process transactions

+

7. Ask choosen node for transaction and print result

+
+ + <% if(node_servers.size() == 0) { %> + Edit Node-Servers + <% } %> + + + <% if(hedera_topics.size() == 0) { %> + Edit Hedera-Topics + <% } %> + + + seconds + +
+
+
+ <% if(PAGE_RUN_4_SET_TEST == page && !hedera_topic.isNull() && !node_server.isNull()) { %> +
    +
  • +

    1. Create two new accounts and show user public keys for comparisation:

    + <% + Profiler time2; + auto group_id = hedera_topic->getModel()->getGroupId(); + auto user_group = controller::Group::load(group_id); + auto mnemonic_type = ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER; + + std::string password1 = "hsaj(2askaslASlllak3wjjeudsaj"; + auto user_1 = controller::User::create("testEmail@google.de", "Max", "Mustermann", group_id); + auto passphrase_1 = Passphrase::generate(&ServerConfig::g_Mnemonic_WordLists[mnemonic_type]); + auto gradido_key_pair_1 = KeyPairEd25519::create(passphrase_1); + user_1->setGradidoKeyPair(gradido_key_pair_1); + user_1->login(password1); + + std::string password2 = "uweia8saiSale,dsasA"; + auto user_2 = controller::User::create("testEmail2@google.de", "MJax", "Mustrermann", group_id); + auto passphrase_2 = Passphrase::generate(&ServerConfig::g_Mnemonic_WordLists[mnemonic_type]); + auto gradido_key_pair_2 = KeyPairEd25519::create(passphrase_2); + user_2->setGradidoKeyPair(gradido_key_pair_2); + user_2->login(password2); + %> +

    User 1: <%= user_1->getPublicHex() %>

    +

    User 2: <%= user_2->getPublicHex() %>

    +

    Time: <%= time2.string() %> +

  • +
  • +

    2. Send a add-member transaction to hedera topic with one signature (first user)

    + <% + time2.reset(); + { + auto transaction1 = model::gradido::Transaction::createGroupMemberUpdate(user_1, user_group); + transaction1->getTransactionBody()->getGroupMemberUpdate()->setMinSignatureCount(1); + transaction1->sign(user_1); + } + %> +

    Time: <%= time2.string() %> +

  • +
  • +

    3. Send a add-member transaction to hedera topic with two signatures (first user and second user)

    + <% + time2.reset(); + { + auto transaction2 = model::gradido::Transaction::createGroupMemberUpdate(user_2, user_group); + transaction2->getTransactionBody()->getGroupMemberUpdate()->setMinSignatureCount(2); + transaction2->sign(user_2); + transaction2->sign(user_1); + } + + %> +

    Time: <%= time2.string() %> +

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