show and add node server and hedera accounts, model, controller and page

This commit is contained in:
Dario 2020-08-31 11:23:58 +02:00 committed by Ulf Gebhardt
parent 87431e8a70
commit 3d4f0d7b64
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
28 changed files with 1229 additions and 94 deletions

View File

@ -3,5 +3,6 @@ CREATE TABLE `crypto_keys` (
`private_key` varbinary(64) NOT NULL,
`public_key` binary(32) NOT NULL,
`crypto_key_type_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
PRIMARY KEY (`id`),
UNIQUE(`public_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -5,7 +5,7 @@ CREATE TABLE `hedera_accounts` (
`account_key_id` int unsigned NOT NULL,
`balance` bigint unsigned NOT NULL DEFAULT '0',
`network_type` int NOT NULL DEFAULT '0',
`updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `account_hedera_id` (`account_hedera_id`),
UNIQUE KEY `account_key_id` (`account_key_id`)

View File

@ -46,9 +46,10 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi
default:
throw std::exception("[KeyPairHedera] invalid private key");
}
crypto_sign_ed25519_sk_to_pk(mPublicKey, *mPrivateKey);
// check public
}
else if (publicKey) {
if (publicKey) {
switch (publicKey->size())
{
case 32: { // raw public key
@ -64,8 +65,13 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi
throw std::exception("[KeyPairHedera] invalid public key");
}
}
auto public_key_2 = mm->getFreeMemory(ed25519_pubkey_SIZE);
crypto_sign_ed25519_sk_to_pk(*public_key_2, *mPrivateKey);
if (sodium_memcmp(*public_key_2, mPublicKey, ed25519_pubkey_SIZE) != 0) {
throw "public keys not match";
}
mm->releaseMemory(public_key_2);
mm->releaseMemory(derPrefixPriv);
mm->releaseMemory(derPrefixPub);
}

View File

@ -70,6 +70,7 @@ protected:
KeyPairHedera();
void createKeyFromSeed(const MemoryBin* seed);
private:
// 64 Byte
//! \brief ed25519 libsodium private key

View File

@ -8,7 +8,7 @@
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
#include "../controller/Group.h"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#include "../ServerConfig.h"
@ -55,14 +55,14 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
//auto groups = controller::Group::load("gdd1");
//std::vector<Poco::SharedPtr<controller::Group>> groups;
#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#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.cpsp
// begin include header_large.cpsp
responseStream << "\n";
responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
@ -70,47 +70,48 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/main.css\">\n";
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
if(withMaterialIcons) { responseStream << "\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/materialdesignicons.min.css\">\n";
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
} responseStream << "\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << " <div class=\"layout\">\n";
responseStream << " <div class=\"center-form-single\">\n";
responseStream << " <div class=\"center-form-header\">\n";
responseStream << " <a href=\"";
#line 21 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"center-logo\">\n";
responseStream << " <picture>\n";
responseStream << " <source srcset=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
responseStream << " <source srcset=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" type=\"image/png\">\n";
responseStream << " <img src=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
responseStream << " </picture>\n";
responseStream << " </a>\n";
responseStream << " </div>";
// end include header.cpsp
responseStream << "\t\t<div class=\"sidebar1 nav-menu initial\">\n";
responseStream << "\t\t\t<div class=\"nav-vertical\">\n";
responseStream << "\t\t\t\t<ul>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/groups\"><span class=\"link-title\">Gruppen</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/nodes\"><span class=\"link-title\">Node Server</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/hedera_account\"><span class=\"link-title\">Hedera Accounts</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/topic\"><span class=\"link-title\">Hedera Topics</span></a></li>\n";
responseStream << "\t\t\t\t</ul>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t\t<div class=\"content\">";
// end include header_large.cpsp
responseStream << "\n";
#line 38 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( getErrorsHtml() );
@ -122,11 +123,11 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
responseStream << "\t\t</div>\t\n";
responseStream << "\t\t<div class=\"content-list-table\">\n";
responseStream << "\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell\">ID</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell\">Name</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell\">Alias</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell\">Url</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell\">";
responseStream << "\t\t\t\t<div class=\"cell header-cell c0\">ID</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c2\">Name</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c2\">Alias</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c3\">Url</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c5\">";
#line 50 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( gettext("Description") );
responseStream << "</div>\n";
@ -136,23 +137,23 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
for(auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel(); responseStream << "\n";
responseStream << "\t\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t\t<div class=\"cell\">";
responseStream << "\t\t\t\t\t<div class=\"cell c0\">";
#line 55 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( group_model->getID() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell\">";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( group_model->getName() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell\">";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 57 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( group_model->getAlias() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell\">";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 58 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( group_model->getUrl() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"celL\">";
responseStream << "\t\t\t\t\t<div class=\"cell c5\">";
#line 59 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
responseStream << ( group_model->getDescription());
responseStream << "</div>\n";

View File

@ -55,8 +55,8 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
int num = 0;
int networkType = 0;
MemoryBin* privateKey = nullptr;
MemoryBin* publicKey = nullptr;
MemoryBin* private_key = nullptr;
MemoryBin* public_key = nullptr;
// validate
if(!sm->isValid(shardNumString, VALIDATE_ONLY_INTEGER)) {
@ -100,22 +100,22 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
if(0 == errorCount()) {
auto hedera_id = controller::HederaId::create(shardNum, realmNum, num);
if(!hedera_id->getModel()->insertIntoDB(true)) {
addError(new Error("DB Error", "Error saving hedera id in DB"));
}
privateKey = DataTypeConverter::hexToBin(privateKeyString);
publicKey = DataTypeConverter::hexToBin(publicKeyString);
private_key = DataTypeConverter::hexToBin(privateKeyString);
public_key = DataTypeConverter::hexToBin(publicKeyString);
KeyPairHedera key_pair(privateKey, publicKey);
mm->releaseMemory(privateKey);
mm->releaseMemory(publicKey);
auto crypto_key = controller::CryptoKey::create(&key_pair, user);
KeyPairHedera key_pair(private_key, public_key);
auto crypto_key = controller::CryptoKey::load(key_pair.getPublicKey(), ed25519_pubkey_SIZE);
if(crypto_key.isNull()) {
crypto_key = controller::CryptoKey::create(&key_pair, user);
if(!crypto_key->getModel()->insertIntoDB(true)) {
addError(new Error("DB Error", "Error saving crypto key in DB"));
}
} else {
printf("crypto key found in db\n");
}
if(0 == errorCount()) {
auto hedera_account = controller::HederaAccount::create(
user->getModel()->getID(),
@ -128,10 +128,15 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
addError(new Error("DB Error", "Error saving hedera account into DB"));
}
}
mm->releaseMemory(private_key);
mm->releaseMemory(public_key);
}
}
// list accounts
auto hedera_accounts = controller::HederaAccount::load("user_id", user->getModel()->getID());
#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
@ -166,13 +171,74 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << " <div class=\"layout\">\n";
responseStream << "\t\t<div class=\"sidebar1 nav-menu initial\">\n";
responseStream << "\t\t\t<div class=\"nav-vertical\">\n";
responseStream << "\t\t\t\t<ul>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/groups\"><span class=\"link-title\">Gruppen</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/nodes\"><span class=\"link-title\">Node Server</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/hedera_account\"><span class=\"link-title\">Hedera Accounts</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/topic\"><span class=\"link-title\">Hedera Topics</span></a></li>\n";
responseStream << "\t\t\t\t</ul>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t\t<div class=\"content\">";
// end include header_large.cpsp
responseStream << "\n";
#line 116 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 121 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "<div class=\"center-form-container\">\n";
responseStream << "\t<div class=\"content-list\">\n";
responseStream << "\t\t<div class=\"content-list-title\">\n";
responseStream << "\t\t\t<h2>Deine Hedera Accounts</h2>\n";
responseStream << "\t\t</div>\t\n";
responseStream << "\t\t<div class=\"content-list-table\">\n";
responseStream << "\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c2\">Hedera Id</div>\t\t\t\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c3\">Balance</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c2\">Server Type</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c3\">Last Updated</div>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
for(auto it = hedera_accounts.begin(); it != hedera_accounts.end(); it++) {
auto hedera_account_model = (*it)->getModel();
responseStream << "\n";
responseStream << "\t\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 138 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( (*it)->getHederaId()->getModel()->toString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 139 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( hedera_account_model->getBalanceDouble() );
responseStream << " hbar</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 140 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( model::table::HederaAccount::hederaNetworkTypeToString(hedera_account_model->getNetworkType()) );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 141 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( hedera_account_model->getUpdatedString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 143 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
} responseStream << "\n";
responseStream << "\t\t</div>\n";
responseStream << "\t</div>\n";
responseStream << "\t<div class=\"center-form-title\">\n";
responseStream << "\t <h3>Einen neuen Account anlegen</h3>\n";
responseStream << "\t</div>\n";
@ -189,21 +255,21 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
responseStream << "\t\t\t<label class=\"form-label\" for=\"account-network-type\">Network Type</label>\n";
responseStream << "\t\t\t<select class=\"form-control\" name=\"account-network-type\" id=\"account-network-type\">\n";
responseStream << "\t\t\t";
#line 133 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 161 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
for(int i = 0; i < model::table::HEDERA_NET_COUNT; i++) { responseStream << "\n";
responseStream << "\t\t\t\t<option value=\"";
#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( i );
responseStream << "\">";
#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( model::table::HederaAccount::hederaNetworkTypeToString((model::table::HederaNetworkType)i) );
responseStream << "</option>\n";
responseStream << "\t\t\t";
#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</select>\n";
responseStream << "\t\t\t<input class=\"center-form-submit form-button\" type=\"submit\" name=\"submit\" value=\"";
#line 137 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
#line 165 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminHederaAccount.cpsp"
responseStream << ( gettext("Add Account") );
responseStream << "\">\n";
responseStream << "\t</form>\n";

View File

@ -0,0 +1,363 @@
#include "AdminNodeServerPage.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/DeflatingStream.h"
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
#include "../controller/NodeServer.h"
#include "../controller/Group.h"
#include "../SingletonManager/SessionManager.h"
#include "../lib/DataTypeConverter.h"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#include "../ServerConfig.h"
AdminNodeServerPage::AdminNodeServerPage(Session* arg):
SessionHTTPRequestHandler(arg)
{
}
void AdminNodeServerPage::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 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
const char* pageName = "Node Server";
auto sm = SessionManager::getInstance();
// add
if(!form.empty()) {
// collect
auto url = form.get("node-server-url", "");
auto portString = form.get("node-server-port", "");
auto nodeServerTypeString = form.get("node-server-type", "0");
auto shardNumString = form.get("account-shard-num", "0");
auto realmNumString = form.get("account-realm-num", "0");
auto numString = form.get("account-num", "0");
auto nodeServerGroupString = form.get("node-server-group", "");
int port = 0;
int shardNum = 0;
int realmNum = 0;
int num = 0;
model::table::NodeServerType nodeServerType = model::table::NODE_SERVER_NONE;
int group_id = 0;
// validate
if(!sm->isValid(url, VALIDATE_ONLY_URL)) {
addError(new ParamError("Node Server", "Url not valid, must start with http or https", url));
}
if(!sm->isValid(portString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Node Server", "Port isn't valid integer"));
} else {
if(DataTypeConverter::strToInt(portString, port) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int convert error", "Error converting port to int"));
}
}
if(!sm->isValid(nodeServerTypeString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Node Server Type", "not integer"));
} else {
int node_server_type_int = 0;
if(DataTypeConverter::strToInt(nodeServerTypeString, node_server_type_int) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting node server type to int"));
}
if(node_server_type_int < 0 || node_server_type_int >= (int)model::table::NODE_SERVER_TYPE_COUNT) {
addError(new Error("Node Server Type", "invalid value"));
} else {
nodeServerType = (model::table::NodeServerType)node_server_type_int;
}
}
if(model::table::NodeServerIsHederaNode(nodeServerType)) {
if(!sm->isValid(shardNumString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "shard num not integer"));
} else {
if(DataTypeConverter::strToInt(shardNumString, shardNum) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting shardNumString to int"));
}
}
if(!sm->isValid(realmNumString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "realm num not integer"));
} else {
if(DataTypeConverter::strToInt(realmNumString, realmNum) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting realmNumString to int"));
}
}
if(!sm->isValid(numString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "num not integer"));
} else {
if(DataTypeConverter::strToInt(numString, num) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting num to int"));
}
}
} else if(model::table::NodeServerHasGroup(nodeServerType)) {
if(!sm->isValid(nodeServerGroupString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Group id", "group_id not integer"));
} else {
if(DataTypeConverter::strToInt(nodeServerGroupString, group_id) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting group_id to int"));
}
}
}
if(0 == errorCount()) {
int hedera_id_int = 0;
if(NodeServerIsHederaNode(nodeServerType)) {
auto hedera_id = controller::HederaId::create(shardNum, realmNum, num);
hedera_id_int = hedera_id->getModel()->getID();
}
auto node_server = controller::NodeServer::create(
url, port, group_id, (model::table::NodeServerType)nodeServerType, hedera_id_int
);
if(!node_server->getModel()->insertIntoDB(false)) {
addError(new Error("DB Error", "Error saving Node Server in DB"));
}
}
}
auto groups = controller::Group::listAll();
std::map<int, int> group_indices;
int count = 0;
for(auto it = groups.begin(); it != groups.end(); it++) {
group_indices.insert(std::pair<int, int>((*it)->getModel()->getID(), count));
count++;
}
auto node_servers = controller::NodeServer::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 << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
responseStream << "<head>\n";
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/main.css\">\n";
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
if(withMaterialIcons) { responseStream << "\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/materialdesignicons.min.css\">\n";
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
} responseStream << "\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << " <div class=\"layout\">\n";
responseStream << "\t\t<div class=\"sidebar1 nav-menu initial\">\n";
responseStream << "\t\t\t<div class=\"nav-vertical\">\n";
responseStream << "\t\t\t\t<ul>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/groups\"><span class=\"link-title\">Gruppen</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/nodes\"><span class=\"link-title\">Node Server</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/hedera_account\"><span class=\"link-title\">Hedera Accounts</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/topic\"><span class=\"link-title\">Hedera Topics</span></a></li>\n";
responseStream << "\t\t\t\t</ul>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t\t<div class=\"content\">";
// end include header_large.cpsp
responseStream << "\n";
#line 126 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "<div class=\"center-form-container\">\n";
responseStream << "\t<div class=\"content-list\">\n";
responseStream << "\t\t<div class=\"content-list-title\">\n";
responseStream << "\t\t\t<h2>Alle Node Server</h2>\n";
responseStream << "\t\t</div>\t\n";
responseStream << "\t\t<div class=\"content-list-table\">\n";
responseStream << "\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c4\">Server Type</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c5\">Url:Port</div>\n";
responseStream << "\t\t\t\t<div class=\"cell header-cell c3\">Group / Hedera Id</div>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 138 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
for(auto it = node_servers.begin(); it != node_servers.end(); it++) {
auto node_server_model = (*it)->getModel();
responseStream << "\n";
responseStream << "\t\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t\t<div class=\"cell c4\">";
#line 142 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( model::table::NodeServer::nodeServerTypeToString(node_server_model->getNodeServerType()) );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c5\">";
#line 143 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( node_server_model->getUrlWithPort() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">\n";
responseStream << "\t\t\t\t\t\t";
#line 145 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
if(node_server_model->isHederaNode()) {
auto hedera_id_model = (*it)->getHederaId()->getModel(); responseStream << "\n";
responseStream << "\t\t\t\t\t\t\t";
#line 147 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( hedera_id_model->toString() );
responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 148 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} else if(node_server_model->hasGroup()){
auto groupIt = group_indices.find(node_server_model->getGroupId());
if(groupIt != group_indices.end()) {
auto group_model = groups[groupIt->second]->getModel(); responseStream << "\n";
responseStream << "\t\t\t\t\t\t\t\t<span title=\"";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( group_model->getDescription() );
responseStream << "\">";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( group_model->getName() );
responseStream << "</span>\n";
responseStream << "\t\t\t\t\t\t\t";
#line 153 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t\t\t\t\t";
#line 154 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( node_server_model->getGroupId() );
responseStream << "\n";
responseStream << "\t\t\t\t\t\t\t";
#line 155 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t\t";
#line 156 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t\t</div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 159 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} responseStream << "\n";
responseStream << "\t\t</div>\n";
responseStream << "\t</div>\n";
responseStream << "\t<div class=\"center-form-title\">\n";
responseStream << "\t <h3>Ein Node Server hinzufügen</h3>\n";
responseStream << "\t</div>\n";
responseStream << "\t<div class=\"center-form-form\">\n";
responseStream << "\t\t<form method=\"POST\">\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"node-server-url\">URL</label>\n";
responseStream << "\t\t\t<input required class=\"form-control\" id=\"node-server-url\" name=\"node-server-url\"/>\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"node-server-port\">Port</label>\n";
responseStream << "\t\t\t<input required class=\"form-control\" id=\"node-server-port\" name=\"node-server-port\" type=\"number\"/>\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"node-server-type\">Network Type</label>\n";
responseStream << "\t\t\t<select class=\"form-control\" name=\"node-server-type\" id=\"node-server-type\">\n";
responseStream << "\t\t\t";
#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
for(int i = 1; i < model::table::NODE_SERVER_TYPE_COUNT; i++) { responseStream << "\n";
responseStream << "\t\t\t\t<option value=\"";
#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( i );
responseStream << "\">";
#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( model::table::NodeServer::nodeServerTypeToString((model::table::NodeServerType)i) );
responseStream << "</option>\n";
responseStream << "\t\t\t";
#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</select>\n";
responseStream << "\t\t\t<fieldset>\n";
responseStream << "\t\t\t\t<legend>Nur für Hedera Nodes</legend>\n";
responseStream << "\t\t\t\t<label class=\"form-label\">Hedera Account ID</label>\n";
responseStream << "\t\t\t\t<input class=\"form-control\" id=\"account-shard-num\" placeholder=\"shard\" type=\"number\" name=\"account-shard-num\"/>\n";
responseStream << "\t\t\t\t<input class=\"form-control\" id=\"account-realm-num\" placeholder=\"realm\" type=\"number\" name=\"account-realm-num\"/>\n";
responseStream << "\t\t\t\t<input class=\"form-control\" id=\"account-num\" placeholder=\"num\" type=\"number\" name=\"account-num\"/>\n";
responseStream << "\t\t\t</fieldset>\n";
responseStream << "\t\t\t<fieldset>\n";
responseStream << "\t\t\t\t<legend>Nur für Gradido Nodes</legend>\n";
responseStream << "\t\t\t\t<label class=\"form-label\" for=\"node-server-group\">Gradido Gruppe</label>\n";
responseStream << "\t\t\t\t<select class=\"form-control\" name=\"node-server-group\">\n";
responseStream << "\t\t\t\t\t<option value=\"-1\">Keine Gruppe</option>\n";
responseStream << "\t\t\t\t\t";
#line 189 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
for(auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel(); responseStream << "\n";
responseStream << "\t\t\t\t\t\t<option title=\"";
#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( group_model->getDescription() );
responseStream << "\" value=\"";
#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( group_model->getID() );
responseStream << "\">";
#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( group_model->getName() );
responseStream << "</option>\n";
responseStream << "\t\t\t\t\t";
#line 192 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t\t</select>\n";
responseStream << "\t\t\t</fieldset>\n";
responseStream << "\t\t\t\n";
responseStream << "\t\t\t<input class=\"center-form-submit form-button\" type=\"submit\" name=\"submit\" value=\"";
#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminNodeServer.cpsp"
responseStream << ( gettext("Add Node") );
responseStream << "\">\n";
responseStream << "\t</form>\n";
responseStream << "</div>\n";
responseStream << "\n";
// begin include footer.cpsp
responseStream << " <div class=\"center-bottom\">\n";
responseStream << " <p>Copyright © Gradido 2020</p>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"bottomleft\">\n";
responseStream << " ";
#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( mTimeProfiler.string() );
responseStream << "\n";
responseStream << " </div>\n";
responseStream << " <div class=\"bottomright\">\n";
responseStream << " <p>Login Server in Entwicklung</p>\n";
responseStream << " <p>Alpha ";
#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << "</body>\n";
responseStream << "\n";
responseStream << "</html>";
// end include footer.cpsp
responseStream << "\n";
if (_compressResponse) _gzipStream.close();
}

View File

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

View File

@ -30,6 +30,7 @@
#include "AdminGroupsPage.h"
#include "AdminTopicPage.h"
#include "AdminHederaAccountPage.h"
#include "AdminNodeServerPage.h"
#include "DecodeTransactionPage.h"
#include "RepairDefectPassphrase.h"
@ -224,6 +225,11 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c
pageRequestHandler->setProfiler(timeUsed);
return pageRequestHandler;
}
if (url_first_part == "/nodes") {
auto pageRequestHandler = new AdminNodeServerPage(s);
pageRequestHandler->setProfiler(timeUsed);
return pageRequestHandler;
}
}
if(url_first_part == "/logout") {

View File

@ -74,6 +74,7 @@ Poco::Data::Session ConnectionManager::getConnection(ConnectionType type)
}
auto session = mSessionPools.getPool(mSessionPoolNames[type]).get();
//return mSessionPoolNames[type];
/*if (!session.isConnected()) {
printf("reconnect called\n");
@ -85,6 +86,7 @@ Poco::Data::Session ConnectionManager::getConnection(ConnectionType type)
sendErrorsAsEmail();
return mSessionPools.getPool(mSessionPoolNames[type]).get();
}
}*/
//std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S");
//printf("[getConnection] %s impl: %p\n", dateTimeString.data(), session.impl());

View File

@ -50,6 +50,8 @@ bool SessionManager::init()
case VALIDATE_HAS_NUMBER: mValidations[i] = new Poco::RegularExpression(".*[0-9].*"); break;
case VALIDATE_ONLY_INTEGER: mValidations[i] = new Poco::RegularExpression("^[0-9]*$"); break;
case VALIDATE_ONLY_HEX: mValidations[i] = new Poco::RegularExpression("^(0x)?[a-fA-F0-9]*$"); break;
//case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}$"); break;
case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\/?"); break;
case VALIDATE_HAS_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression(".*[@$!%*?&+-].*"); break;
case VALIDATE_HAS_UPPERCASE_LETTER:
mValidations[i] = new Poco::RegularExpression(".*[A-Z].*");

View File

@ -30,6 +30,7 @@ enum SessionValidationTypes {
VALIDATE_HAS_NUMBER,
VALIDATE_ONLY_INTEGER,
VALIDATE_ONLY_HEX,
VALIDATE_ONLY_URL,
VALIDATE_HAS_SPECIAL_CHARACTER,
VALIDATE_HAS_UPPERCASE_LETTER,
VALIDATE_HAS_LOWERCASE_LETTER,

View File

@ -1,5 +1,6 @@
#include "CryptoKey.h"
#include "../SingletonManager/ErrorManager.h"
namespace controller {
@ -39,6 +40,28 @@ namespace controller {
return nullptr;
}
Poco::AutoPtr<CryptoKey> CryptoKey::load(MemoryBin* publicKey)
{
return load(*publicKey, publicKey->size());
}
Poco::AutoPtr<CryptoKey> CryptoKey::load(const unsigned char* publicKey, size_t size)
{
assert(publicKey);
assert(size);
Poco::Data::BLOB public_key_blob(publicKey, size);
auto db = new model::table::CryptoKey();
auto count = db->loadFromDB<Poco::Data::BLOB>("public_key", public_key_blob);
if (!count) return nullptr;
if (1 == count) return new CryptoKey(db);
auto em = ErrorManager::getInstance();
em->addError(new Error("CryptoKey::load", "found more than one crypto key with same public key"));
em->sendErrorsAsEmail();
return nullptr;
}
}

View File

@ -20,6 +20,8 @@ namespace controller {
//! if returned ptr is NULL, dataset not found
static Poco::AutoPtr<CryptoKey> load(int id);
static Poco::AutoPtr<CryptoKey> load(MemoryBin* publicKey);
static Poco::AutoPtr<CryptoKey> load(const unsigned char* publicKey, size_t size);
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }

View File

@ -23,7 +23,7 @@ namespace controller {
std::vector<Poco::AutoPtr<Group>> Group::load(const std::string& alias)
{
auto db = new model::table::Group();
auto group_list = db->loadFromDB<std::string, model::table::GroupTuple>("alias", alias, 0);
auto group_list = db->loadFromDB<std::string, model::table::GroupTuple>("alias", alias, 1);
std::vector<Poco::AutoPtr<Group>> resultVector;
resultVector.reserve(group_list.size());

View File

@ -20,15 +20,19 @@ namespace controller {
return Poco::AutoPtr<HederaAccount>(group);
}
std::vector<Poco::AutoPtr<HederaAccount>> HederaAccount::load(const std::string& alias)
std::vector<Poco::AutoPtr<HederaAccount>> HederaAccount::load(const std::string& fieldName, int fieldValue)
{
auto db = new model::table::HederaAccount();
auto group_list = db->loadFromDB<std::string, model::table::HederaAccountTuple>("alias", alias, 0);
auto hedera_account_list = db->loadFromDB<int, model::table::HederaAccountTuple>(fieldName, fieldValue, 2);
std::vector<Poco::AutoPtr<HederaAccount>> resultVector;
resultVector.reserve(group_list.size());
for (auto it = group_list.begin(); it != group_list.end(); it++) {
resultVector.push_back(new HederaAccount(new model::table::HederaAccount(*it)));
resultVector.reserve(hedera_account_list.size());
for (auto it = hedera_account_list.begin(); it != hedera_account_list.end(); it++) {
//mHederaID
auto db = new model::table::HederaAccount(*it);
auto hedera_account = new HederaAccount(db);
hedera_account->mHederaID = HederaId::load(db->getAccountHederaId());
resultVector.push_back(hedera_account);
}
return resultVector;
}

View File

@ -1,6 +1,7 @@
#ifndef GRADIDO_LOGIN_SERVER_CONTROLLER_HEDERA_ACCOUNT_INCLUDE
#define GRADIDO_LOGIN_SERVER_CONTROLLER_HEDERA_ACCOUNT_INCLUDE
#include "../controller/HederaId.h"
#include "../model/table/HederaAccount.h"
#include "Poco/SharedPtr.h"
@ -11,21 +12,23 @@ namespace controller {
class HederaAccount : public TableControllerBase
{
public:
~HederaAccount();
static Poco::AutoPtr<HederaAccount> create(int user_id, int account_hedera_id, int account_key_id, Poco::UInt64 balance = 0, model::table::HederaNetworkType type = model::table::HEDERA_MAINNET);
static std::vector<Poco::AutoPtr<HederaAccount>> load(const std::string& alias);
static std::vector<Poco::AutoPtr<HederaAccount>> load(const std::string& fieldName, int fieldValue);
static std::vector<Poco::AutoPtr<HederaAccount>> listAll();
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
inline Poco::AutoPtr<model::table::HederaAccount> getModel() { return _getModel<model::table::HederaAccount>(); }
inline void setHederaId(Poco::AutoPtr<controller::HederaId> hederaId) { mHederaID = hederaId; }
inline Poco::AutoPtr<controller::HederaId> getHederaId() { return mHederaID; }
protected:
HederaAccount(model::table::HederaAccount* dbModel);
Poco::AutoPtr<controller::HederaId> mHederaID;
};
}

View File

@ -0,0 +1,145 @@
#include "NodeServer.h"
#include "../SingletonManager/ErrorManager.h"
#include "../SingletonManager/ConnectionManager.h"
namespace controller {
NodeServer::NodeServer(model::table::NodeServer* dbModel)
{
mDBModel = dbModel;
}
NodeServer::~NodeServer()
{
}
Poco::AutoPtr<NodeServer> NodeServer::create(const std::string& url, int port, int groupId, model::table::NodeServerType type, int nodeHederaId)
{
auto db = new model::table::NodeServer(url, port, groupId, type, nodeHederaId);
auto group = new NodeServer(db);
return Poco::AutoPtr<NodeServer>(group);
}
std::vector<Poco::AutoPtr<NodeServer>> NodeServer::load(model::table::NodeServerType type, int group_id/* = 0*/)
{
auto db = new model::table::NodeServer();
std::vector<model::table::NodeServerTuple> node_server_list;
if (type == model::table::NODE_SERVER_HEDERA_MAINNET_NODE || type == model::table::NODE_SERVER_HEDERA_TESTNET_NODE)
{
node_server_list = db->loadFromDB<model::table::NodeServerType, model::table::NodeServerTuple>("server_type", type, 4);
}
else if (type == model::table::NODE_SERVER_GRADIDO_NODE)
{
if (group_id)
{
node_server_list = db->loadFromDB<int, model::table::NodeServerTuple>(
{ "server_type", "group_id" },
{ type, group_id },
model::table::MYSQL_CONDITION_AND
);
}
else
{
node_server_list = db->loadFromDB<int, model::table::NodeServerTuple >("server_type", type, 4);
}
}
//auto node_server_list = db->loadFromDB<std::string, model::table::NodeServerTuple>("alias", alias, 0);
std::vector<Poco::AutoPtr<NodeServer>> resultVector;
resultVector.reserve(node_server_list.size());
for (auto it = node_server_list.begin(); it != node_server_list.end(); it++) {
resultVector.push_back(new NodeServer(new model::table::NodeServer(*it)));
}
return resultVector;
}
/*
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 1;
*/
NodeServerConnection NodeServer::pick(model::table::NodeServerType type, int group_id/* = 0*/)
{
auto cm = ConnectionManager::getInstance();
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
NodeServerConnection result;
int hedera_node_id = 0;
Poco::Data::Statement select(session);
select << "SELECT url, port";
if (model::table::NodeServerIsHederaNode(type)) {
select << ", node_hedera_id";
}
select << " from node_servers ORDER BY RAND() LIMIT 1"
, Poco::Data::Keywords::into(result.url)
, Poco::Data::Keywords::into(result.port);
if (model::table::NodeServerIsHederaNode(type)) {
select, Poco::Data::Keywords::into(hedera_node_id);
}
try {
if (1 == select.execute()) {
if (model::table::NodeServerIsHederaNode(type)) {
result.hederaId = controller::HederaId::load(hedera_node_id);
}
return result;
}
}
catch (Poco::Exception& ex) {
auto em = ErrorManager::getInstance();
const char* functionName = "NodeServer::pick";
em->addError(new ParamError(functionName, "mysql error by pick: ", ex.message()));
em->addError(new ParamError(functionName, "server type: ", model::table::NodeServer::nodeServerTypeToString(type)));
em->addError(new ParamError(functionName, "group id", group_id));
em->sendErrorsAsEmail();
}
return result;
}
std::vector<Poco::AutoPtr<NodeServer>> NodeServer::listAll()
{
auto cm = ConnectionManager::getInstance();
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement select(session);
std::vector<NodeServerFullTuple> rows;
// typedef Poco::Tuple<int, std::string, int, int, int, int, Poco::UInt64, Poco::UInt64, Poco::UInt64, Poco::DateTime> NodeServerFullTuple;
select << "SELECT n.id, n.url, n.port, n.group_id, n.server_type, n.node_hedera_id, h.shardNum, h.realmNum, h.num, n.last_live_sign "
<< "FROM node_servers as n "
<< "LEFT JOIN hedera_ids as h ON h.id = n.node_hedera_id"
, Poco::Data::Keywords::into(rows);
try {
select.executeAsync();
select.wait();
}
catch (Poco::Exception& ex) {
auto em = ErrorManager::getInstance();
const char* functionName = "NodeServer::listAll";
em->addError(new ParamError(functionName, "mysql error by list all: ", ex.message()));
em->sendErrorsAsEmail();
}
std::vector<Poco::AutoPtr<NodeServer>> results;
for (auto it = rows.begin(); it != rows.end(); it++) {
//NodeServer(const std::string& url, int port, int groupId, NodeServerType type, int nodeHederaId);
auto row = *it;
model::table::NodeServer* db = new model::table::NodeServer(
row.get<1>(), row.get<2>(), row.get<3>(), (model::table::NodeServerType)row.get<4>(), row.get<5>()
);
db->setLastLiveSign(row.get<9>());
db->setID(row.get<0>());
Poco::AutoPtr<NodeServer> node_server(new NodeServer(db));
node_server->setHederaId(controller::HederaId::create(
row.get<6>(), row.get<7>(), row.get<8>()
));
results.push_back(node_server);
}
return results;
}
}

View File

@ -0,0 +1,52 @@
#ifndef GRADIDO_LOGIN_SERVER_CONTROLLER_NODE_SERVER_INCLUDE
#define GRADIDO_LOGIN_SERVER_CONTROLLER_NODE_SERVER_INCLUDE
#include "../model/table/NodeServer.h"
#include "../controller/HederaId.h"
#include "Poco/SharedPtr.h"
#include "TableControllerBase.h"
namespace controller {
struct NodeServerConnection
{
NodeServerConnection(const std::string& _url, int _port) : url(_url), port(_port) {}
NodeServerConnection() :port(0) {};
bool isValid() { return url != "" && port; }
std::string url;
int port;
Poco::AutoPtr<controller::HederaId> hederaId;
};
typedef Poco::Tuple<int, std::string, int, int, int, int, Poco::UInt64, Poco::UInt64, Poco::UInt64, Poco::DateTime> NodeServerFullTuple;
class NodeServer : public TableControllerBase
{
public:
~NodeServer();
static Poco::AutoPtr<NodeServer> create(const std::string& url, int port, int groupId, model::table::NodeServerType type, int nodeHederaId);
static std::vector<Poco::AutoPtr<NodeServer>> load(model::table::NodeServerType type, int group_id = 0);
static std::vector<Poco::AutoPtr<NodeServer>> listAll();
// pick server randomly
NodeServerConnection pick(model::table::NodeServerType type, int group_id = 0);
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
inline Poco::AutoPtr<model::table::NodeServer> getModel() { return _getModel<model::table::NodeServer>(); }
inline void setHederaId(Poco::AutoPtr<controller::HederaId> hederaId) { mHederaID = hederaId; }
inline Poco::AutoPtr<controller::HederaId> getHederaId() { return mHederaID; }
protected:
NodeServer(model::table::NodeServer* dbModel);
Poco::AutoPtr<controller::HederaId> mHederaID;
};
}
#endif //GRADIDO_LOGIN_SERVER_CONTROLLER_NODE_SERVER_INCLUDE

View File

@ -29,6 +29,15 @@ namespace model {
static const char* hederaNetworkTypeToString(HederaNetworkType type);
inline int getAccountHederaId() { return mAccountHederaId; }
inline Poco::UInt64 getBalance() { return mBalance; }
inline double getBalanceDouble() { return (double)mBalance / 100000000.0; }
inline HederaNetworkType getNetworkType() { return (HederaNetworkType)mType; }
inline std::string getUpdatedString() { return Poco::DateTimeFormatter::format(mUpdated, "%f.%m.%Y %H:%M:%S"); }
protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);

View File

@ -24,12 +24,37 @@ namespace model {
std::string HederaId::toString()
{
std::stringstream ss;
ss << "Shard Num: " << std::to_string(mShardNum) << std::endl;
ss << "Realm Num: " << std::to_string(mRealmNum) << std::endl;
ss << "Num: " << std::to_string(mNum) << std::endl;
ss << std::to_string(mShardNum) << "." << std::to_string(mRealmNum) << "." << std::to_string(mNum) << std::endl;
return ss.str();
}
int HederaId::getID()
{
auto cm = ConnectionManager::getInstance();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
assert(mNum != 0|| mShardNum != 0 || mRealmNum != 0);
if (mID) return mID;
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement select(session);
select << "SELECT id FROM " << getTableName()
<< " where shardNum = ? AND realmNum = ? AND num = ?"
, into(mID), use(mShardNum), use(mRealmNum), use(mNum);
try {
if (1 == select.execute()) {
return mID;
}
}
catch (Poco::Exception& ex) {
addError(new ParamError("HederaId::getID", "mysql error try to find existing entry", ex.message()));
sendErrorsAsEmail();
}
insertIntoDB(true);
return mID;
}
Poco::Data::Statement HederaId::_loadFromDB(Poco::Data::Session session, const std::string& fieldName)
{

View File

@ -18,6 +18,9 @@ namespace model {
const char* getTableName() const { return "hedera_ids"; }
std::string toString();
//! \brief check if hedera id already in db, then return id, else insert in db and return
int getID();
protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);

View File

@ -48,17 +48,22 @@ namespace model {
size_t resultCount = 0;
try {
if (insert.execute() == 1) {
if (insert.execute(true) == 1) {
// load id from db
if (loadId) {
Poco::Data::Statement select = _loadIdFromDB(cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER));
Poco::Data::Statement select = _loadIdFromDB(session);
try {
return select.execute() == 1;
select.executeAsync();
return select.wait() == 1;
}
catch (Poco::Exception& ex) {
addError(new ParamError(getTableName(), "mysql error by select id", ex.displayText().data()));
addError(new ParamError(getTableName(), "data set: ", toString().data()));
}
select.reset(session);
select = _loadIdFromDB(session);
//Poco::Data::Statement select = _loadIdFromDB(session);
select.execute();
}
else {
return true;

View File

@ -0,0 +1,114 @@
#include "NodeServer.h"
using namespace Poco::Data::Keywords;
namespace model {
namespace table {
bool NodeServerIsHederaNode(NodeServerType type) {
return type == NODE_SERVER_HEDERA_MAINNET_NODE || type == NODE_SERVER_HEDERA_TESTNET_NODE;
}
bool NodeServerHasGroup(NodeServerType type) {
return type == NODE_SERVER_GRADIDO_NODE || type == NODE_SERVER_GRADIDO_COMMUNITY;
}
NodeServer::NodeServer()
: mPort(0), mGroupId(0), mServerType(0), mNodeHederaId(0)
{
}
NodeServer::NodeServer(const std::string& url, int port, int groupId, NodeServerType type, int nodeHederaId)
: mUrl(url), mPort(port), mGroupId(groupId), mServerType(type), mNodeHederaId(nodeHederaId)
{
}
NodeServer::NodeServer(const NodeServerTuple& tuple)
: ModelBase(tuple.get<0>()),
mUrl(tuple.get<1>()), mPort(tuple.get<2>()), mGroupId(tuple.get<3>()),
mServerType(tuple.get<4>()), mNodeHederaId(tuple.get<5>()), mLastLiveSign(tuple.get<6>())
{
}
NodeServer::~NodeServer()
{
}
std::string NodeServer::toString()
{
std::stringstream ss;
ss << "id: " << getID() << std::endl;
ss << mUrl << ":" << mPort << std::endl;
ss << "group id: " << mGroupId << std::endl;
ss << "server type: " << nodeServerTypeToString((NodeServerType)mServerType) << std::endl;
ss << "node hedera id: " << mNodeHederaId << std::endl;
ss << "last live sign: " << Poco::DateTimeFormatter::format(mLastLiveSign, "%f.%m.%Y %H:%M:%S") << std::endl;
return ss.str();
}
const char* NodeServer::nodeServerTypeToString(NodeServerType type)
{
switch (type) {
case NODE_SERVER_NONE: return "none";
case NODE_SERVER_GRADIDO_NODE: return "Gradido Node";
case NODE_SERVER_GRADIDO_COMMUNITY: return "Gradido Community";
case NODE_SERVER_HEDERA_MAINNET_NODE: return "Hedera Mainnet Node";
case NODE_SERVER_HEDERA_TESTNET_NODE: return "Hedera Testnet Node";
default: return "<unknown>";
}
}
Poco::Data::Statement NodeServer::_loadFromDB(Poco::Data::Session session, const std::string& fieldName)
{
Poco::Data::Statement select(session);
select << "SELECT id, url, port, group_id, server_type, node_hedera_id, last_live_sign FROM " << getTableName()
<< " where " << fieldName << " = ?"
, into(mID), into(mUrl), into(mPort), into(mGroupId), into(mServerType), into(mNodeHederaId), into(mLastLiveSign);
return select;
}
Poco::Data::Statement NodeServer::_loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName)
{
Poco::Data::Statement select(session);
// typedef Poco::Tuple<std::string, std::string, std::string, Poco::Nullable<Poco::Data::BLOB>, int> UserTuple;
select << "SELECT id, url, port, group_id, server_type, node_hedera_id, last_live_sign FROM " << getTableName()
<< " where " << fieldName << " LIKE ?";
return select;
}
Poco::Data::Statement NodeServer::_loadIdFromDB(Poco::Data::Session session)
{
Poco::Data::Statement select(session);
lock();
select << "SELECT id FROM " << getTableName()
<< " where url = ? AND port = ? "
, into(mID), use(mUrl), use(mPort);
unlock();
return select;
}
Poco::Data::Statement NodeServer::_insertIntoDB(Poco::Data::Session session)
{
Poco::Data::Statement insert(session);
lock();
insert << "INSERT INTO " << getTableName()
<< " (url, port, group_id, server_type, node_hedera_id) VALUES(?,?,?,?,?)"
, use(mUrl), use(mPort), use(mGroupId), use(mServerType), use(mNodeHederaId);
unlock();
return insert;
}
}
}

View File

@ -0,0 +1,71 @@
#ifndef GRADIDO_LOGIN_SERVER_MODEL_TABLE_NODE_SERVER_INCLUDE
#define GRADIDO_LOGIN_SERVER_MODEL_TABLE_NODE_SERVER_INCLUDE
#include "ModelBase.h"
#include "Poco/Tuple.h"
namespace model {
namespace table {
typedef Poco::Tuple<int, std::string, int, int, int, int, Poco::DateTime> NodeServerTuple;
enum NodeServerType {
NODE_SERVER_NONE,
NODE_SERVER_GRADIDO_NODE,
NODE_SERVER_GRADIDO_COMMUNITY,
NODE_SERVER_HEDERA_MAINNET_NODE,
NODE_SERVER_HEDERA_TESTNET_NODE,
NODE_SERVER_TYPE_COUNT
};
bool NodeServerIsHederaNode(NodeServerType type);
bool NodeServerHasGroup(NodeServerType type);
class NodeServer : public ModelBase
{
public:
NodeServer();
NodeServer(const std::string& url, int port, int groupId, NodeServerType type, int nodeHederaId);
NodeServer(const NodeServerTuple& tuple);
~NodeServer();
// generic db operations
const char* getTableName() const { return "node_servers"; }
std::string toString();
static const char* nodeServerTypeToString(NodeServerType type);
inline void setLastLiveSign(Poco::DateTime lastLiveSign) { std::unique_lock<std::shared_mutex> _lock(mSharedMutex); mLastLiveSign = lastLiveSign; }
inline std::string getUrl() const { return mUrl; }
inline int getPort() const { return mPort; }
inline std::string getUrlWithPort() const { return mUrl + ":" + std::to_string(mPort); }
inline int getGroupId() const { return mGroupId; }
inline NodeServerType getNodeServerType() const { return (NodeServerType)mServerType; }
inline bool isHederaNode() const { return NodeServerIsHederaNode((NodeServerType)mServerType);}
inline bool hasGroup() const {return NodeServerHasGroup((NodeServerType)mServerType);}
inline int getNodeHederaId() const { return mNodeHederaId; }
inline Poco::DateTime getLastLiveSign() const { std::shared_lock<std::shared_mutex> _lock(mSharedMutex); return mLastLiveSign; }
protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);
Poco::Data::Statement _insertIntoDB(Poco::Data::Session session);
std::string mUrl;
int mPort;
int mGroupId;
int mServerType;
int mNodeHederaId;
Poco::DateTime mLastLiveSign;
mutable std::shared_mutex mSharedMutex;
};
}
}
#endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_NODE_SERVER_INCLUDE

View File

@ -34,7 +34,7 @@
//auto groups = controller::Group::load("gdd1");
//std::vector<Poco::SharedPtr<controller::Group>> groups;
%><%@ include file="header.cpsp" %>
%><%@ include file="header_large.cpsp" %>
<%= getErrorsHtml() %>
<div class="center-form-container">
<div class="content-list">
@ -43,20 +43,20 @@
</div>
<div class="content-list-table">
<div class="row">
<div class="cell header-cell">ID</div>
<div class="cell header-cell">Name</div>
<div class="cell header-cell">Alias</div>
<div class="cell header-cell">Url</div>
<div class="cell header-cell"><%= gettext("Description") %></div>
<div class="cell header-cell c0">ID</div>
<div class="cell header-cell c2">Name</div>
<div class="cell header-cell c2">Alias</div>
<div class="cell header-cell c3">Url</div>
<div class="cell header-cell c5"><%= gettext("Description") %></div>
</div>
<% for(auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel(); %>
<div class="row">
<div class="cell"><%= group_model->getID() %></div>
<div class="cell"><%= group_model->getName() %></div>
<div class="cell"><%= group_model->getAlias() %></div>
<div class="cell"><%= group_model->getUrl() %></div>
<div class="celL"><%= group_model->getDescription()%></div>
<div class="cell c0"><%= group_model->getID() %></div>
<div class="cell c2"><%= group_model->getName() %></div>
<div class="cell c2"><%= group_model->getAlias() %></div>
<div class="cell c3"><%= group_model->getUrl() %></div>
<div class="cell c5"><%= group_model->getDescription()%></div>
</div>
<% } %>
</div>

View File

@ -0,0 +1,200 @@
<%@ page class="AdminNodeServerPage" %>
<%@ page form="true" %>
<%@ page compressed="true" %>
<%@ page baseClass="SessionHTTPRequestHandler" %>
<%@ page ctorArg="Session*" %>
<%@ header include="SessionHTTPRequestHandler.h" %>
<%!
#include "../controller/NodeServer.h"
#include "../controller/Group.h"
#include "../SingletonManager/SessionManager.h"
#include "../lib/DataTypeConverter.h"
%>
<%%
const char* pageName = "Node Server";
auto sm = SessionManager::getInstance();
// add
if(!form.empty()) {
// collect
auto url = form.get("node-server-url", "");
auto portString = form.get("node-server-port", "");
auto nodeServerTypeString = form.get("node-server-type", "0");
auto shardNumString = form.get("account-shard-num", "0");
auto realmNumString = form.get("account-realm-num", "0");
auto numString = form.get("account-num", "0");
auto nodeServerGroupString = form.get("node-server-group", "");
int port = 0;
int shardNum = 0;
int realmNum = 0;
int num = 0;
model::table::NodeServerType nodeServerType = model::table::NODE_SERVER_NONE;
int group_id = 0;
// validate
if(!sm->isValid(url, VALIDATE_ONLY_URL)) {
addError(new ParamError("Node Server", "Url not valid, must start with http or https", url));
}
if(!sm->isValid(portString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Node Server", "Port isn't valid integer"));
} else {
if(DataTypeConverter::strToInt(portString, port) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int convert error", "Error converting port to int"));
}
}
if(!sm->isValid(nodeServerTypeString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Node Server Type", "not integer"));
} else {
int node_server_type_int = 0;
if(DataTypeConverter::strToInt(nodeServerTypeString, node_server_type_int) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting node server type to int"));
}
if(node_server_type_int < 0 || node_server_type_int >= (int)model::table::NODE_SERVER_TYPE_COUNT) {
addError(new Error("Node Server Type", "invalid value"));
} else {
nodeServerType = (model::table::NodeServerType)node_server_type_int;
}
}
if(model::table::NodeServerIsHederaNode(nodeServerType)) {
if(!sm->isValid(shardNumString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "shard num not integer"));
} else {
if(DataTypeConverter::strToInt(shardNumString, shardNum) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting shardNumString to int"));
}
}
if(!sm->isValid(realmNumString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "realm num not integer"));
} else {
if(DataTypeConverter::strToInt(realmNumString, realmNum) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting realmNumString to int"));
}
}
if(!sm->isValid(numString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Account ID", "num not integer"));
} else {
if(DataTypeConverter::strToInt(numString, num) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting num to int"));
}
}
} else if(model::table::NodeServerHasGroup(nodeServerType)) {
if(!sm->isValid(nodeServerGroupString, VALIDATE_ONLY_INTEGER)) {
addError(new Error("Group id", "group_id not integer"));
} else {
if(DataTypeConverter::strToInt(nodeServerGroupString, group_id) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting group_id to int"));
}
}
}
if(0 == errorCount()) {
int hedera_id_int = 0;
if(NodeServerIsHederaNode(nodeServerType)) {
auto hedera_id = controller::HederaId::create(shardNum, realmNum, num);
hedera_id_int = hedera_id->getModel()->getID();
}
auto node_server = controller::NodeServer::create(
url, port, group_id, (model::table::NodeServerType)nodeServerType, hedera_id_int
);
if(!node_server->getModel()->insertIntoDB(false)) {
addError(new Error("DB Error", "Error saving Node Server in DB"));
}
}
}
auto groups = controller::Group::listAll();
std::map<int, int> group_indices;
int count = 0;
for(auto it = groups.begin(); it != groups.end(); it++) {
group_indices.insert(std::pair<int, int>((*it)->getModel()->getID(), count));
count++;
}
auto node_servers = controller::NodeServer::listAll();
%><%@ include file="header_large.cpsp" %>
<%= getErrorsHtml() %>
<div class="center-form-container">
<div class="content-list">
<div class="content-list-title">
<h2>Alle Node Server</h2>
</div>
<div class="content-list-table">
<div class="row">
<div class="cell header-cell c4">Server Type</div>
<div class="cell header-cell c5">Url:Port</div>
<div class="cell header-cell c3">Group / Hedera Id</div>
</div>
<% for(auto it = node_servers.begin(); it != node_servers.end(); it++) {
auto node_server_model = (*it)->getModel();
%>
<div class="row">
<div class="cell c4"><%= model::table::NodeServer::nodeServerTypeToString(node_server_model->getNodeServerType()) %></div>
<div class="cell c5"><%= node_server_model->getUrlWithPort() %></div>
<div class="cell c3">
<% if(node_server_model->isHederaNode()) {
auto hedera_id_model = (*it)->getHederaId()->getModel(); %>
<%= hedera_id_model->toString() %>
<% } else if(node_server_model->hasGroup()){
auto groupIt = group_indices.find(node_server_model->getGroupId());
if(groupIt != group_indices.end()) {
auto group_model = groups[groupIt->second]->getModel(); %>
<span title="<%= group_model->getDescription() %>"><%= group_model->getName() %></span>
<% } else { %>
<%= node_server_model->getGroupId() %>
<% } %>
<% } %>
</div>
</div>
<% } %>
</div>
</div>
<div class="center-form-title">
<h3>Ein Node Server hinzufügen</h3>
</div>
<div class="center-form-form">
<form method="POST">
<label class="form-label" for="node-server-url">URL</label>
<input required class="form-control" id="node-server-url" name="node-server-url"/>
<label class="form-label" for="node-server-port">Port</label>
<input required class="form-control" id="node-server-port" name="node-server-port" type="number"/>
<label class="form-label" for="node-server-type">Network Type</label>
<select class="form-control" name="node-server-type" id="node-server-type">
<% for(int i = 1; i < model::table::NODE_SERVER_TYPE_COUNT; i++) { %>
<option value="<%= i %>"><%= model::table::NodeServer::nodeServerTypeToString((model::table::NodeServerType)i) %></option>
<% } %>
</select>
<fieldset>
<legend>Nur für Hedera Nodes</legend>
<label class="form-label">Hedera Account ID</label>
<input class="form-control" id="account-shard-num" placeholder="shard" type="number" name="account-shard-num"/>
<input class="form-control" id="account-realm-num" placeholder="realm" type="number" name="account-realm-num"/>
<input class="form-control" id="account-num" placeholder="num" type="number" name="account-num"/>
</fieldset>
<fieldset>
<legend>Nur für Gradido Nodes</legend>
<label class="form-label" for="node-server-group">Gradido Gruppe</label>
<select class="form-control" name="node-server-group">
<option value="-1">Keine Gruppe</option>
<% for(auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel(); %>
<option title="<%= group_model->getDescription() %>" value="<%= group_model->getID() %>"><%= group_model->getName() %></option>
<% } %>
</select>
</fieldset>
<input class="center-form-submit form-button" type="submit" name="submit" value="<%= gettext("Add Node") %>">
</form>
</div>
<%@ include file="footer.cpsp" %>

View File

@ -16,4 +16,14 @@
</head>
<body>
<div class="layout">
<div class="sidebar1 nav-menu initial">
<div class="nav-vertical">
<ul>
<li><a href="<%= ServerConfig::g_serverPath %>/groups"><span class="link-title">Gruppen</span></a></li>
<li><a href="<%= ServerConfig::g_serverPath %>/nodes"><span class="link-title">Node Server</span></a></li>
<li><a href="<%= ServerConfig::g_serverPath %>/hedera_account"><span class="link-title">Hedera Accounts</span></a></li>
<li><a href="<%= ServerConfig::g_serverPath %>/topic"><span class="link-title">Hedera Topics</span></a></li>
</ul>
</div>
</div>
<div class="content">