mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
show and add node server and hedera accounts, model, controller and page
This commit is contained in:
parent
87431e8a70
commit
3d4f0d7b64
@ -3,5 +3,6 @@ CREATE TABLE `crypto_keys` (
|
|||||||
`private_key` varbinary(64) NOT NULL,
|
`private_key` varbinary(64) NOT NULL,
|
||||||
`public_key` binary(32) NOT NULL,
|
`public_key` binary(32) NOT NULL,
|
||||||
`crypto_key_type_id` int NOT NULL DEFAULT '0',
|
`crypto_key_type_id` int NOT NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE(`public_key`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ CREATE TABLE `hedera_accounts` (
|
|||||||
`account_key_id` int unsigned NOT NULL,
|
`account_key_id` int unsigned NOT NULL,
|
||||||
`balance` bigint unsigned NOT NULL DEFAULT '0',
|
`balance` bigint unsigned NOT NULL DEFAULT '0',
|
||||||
`network_type` int 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`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `account_hedera_id` (`account_hedera_id`),
|
UNIQUE KEY `account_hedera_id` (`account_hedera_id`),
|
||||||
UNIQUE KEY `account_key_id` (`account_key_id`)
|
UNIQUE KEY `account_key_id` (`account_key_id`)
|
||||||
|
|||||||
@ -46,9 +46,10 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi
|
|||||||
default:
|
default:
|
||||||
throw std::exception("[KeyPairHedera] invalid private key");
|
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())
|
switch (publicKey->size())
|
||||||
{
|
{
|
||||||
case 32: { // raw public key
|
case 32: { // raw public key
|
||||||
@ -64,8 +65,13 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi
|
|||||||
throw std::exception("[KeyPairHedera] invalid public key");
|
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(derPrefixPriv);
|
||||||
mm->releaseMemory(derPrefixPub);
|
mm->releaseMemory(derPrefixPub);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -70,6 +70,7 @@ protected:
|
|||||||
KeyPairHedera();
|
KeyPairHedera();
|
||||||
void createKeyFromSeed(const MemoryBin* seed);
|
void createKeyFromSeed(const MemoryBin* seed);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// 64 Byte
|
// 64 Byte
|
||||||
//! \brief ed25519 libsodium private key
|
//! \brief ed25519 libsodium private key
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
|
|
||||||
#include "../controller/Group.h"
|
#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"
|
#include "../ServerConfig.h"
|
||||||
|
|
||||||
@ -55,14 +55,14 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
|
|||||||
//auto groups = controller::Group::load("gdd1");
|
//auto groups = controller::Group::load("gdd1");
|
||||||
//std::vector<Poco::SharedPtr<controller::Group>> groups;
|
//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;
|
bool withMaterialIcons = false;
|
||||||
std::ostream& _responseStream = response.send();
|
std::ostream& _responseStream = response.send();
|
||||||
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
|
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
|
||||||
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
|
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
|
||||||
responseStream << "\n";
|
responseStream << "\n";
|
||||||
// begin include header.cpsp
|
// begin include header_large.cpsp
|
||||||
responseStream << "\n";
|
responseStream << "\n";
|
||||||
responseStream << "<!DOCTYPE html>\n";
|
responseStream << "<!DOCTYPE html>\n";
|
||||||
responseStream << "<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 charset=\"UTF-8\">\n";
|
||||||
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
|
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
|
||||||
responseStream << "<title>Gradido Login Server: ";
|
responseStream << "<title>Gradido Login Server: ";
|
||||||
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( pageName );
|
responseStream << ( pageName );
|
||||||
responseStream << "</title>\n";
|
responseStream << "</title>\n";
|
||||||
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
|
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
|
||||||
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
responseStream << ( ServerConfig::g_php_serverPath );
|
||||||
responseStream << "css/main.css\">\n";
|
responseStream << "css/main.css\">\n";
|
||||||
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
if(withMaterialIcons) { responseStream << "\n";
|
if(withMaterialIcons) { responseStream << "\n";
|
||||||
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
|
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
|
||||||
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
responseStream << ( ServerConfig::g_php_serverPath );
|
||||||
responseStream << "css/materialdesignicons.min.css\">\n";
|
responseStream << "css/materialdesignicons.min.css\">\n";
|
||||||
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
} responseStream << "\n";
|
} responseStream << "\n";
|
||||||
responseStream << "</head>\n";
|
responseStream << "</head>\n";
|
||||||
responseStream << "<body>\n";
|
responseStream << "<body>\n";
|
||||||
responseStream << " <div class=\"layout\">\n";
|
responseStream << " <div class=\"layout\">\n";
|
||||||
responseStream << " <div class=\"center-form-single\">\n";
|
responseStream << "\t\t<div class=\"sidebar1 nav-menu initial\">\n";
|
||||||
responseStream << " <div class=\"center-form-header\">\n";
|
responseStream << "\t\t\t<div class=\"nav-vertical\">\n";
|
||||||
responseStream << " <a href=\"";
|
responseStream << "\t\t\t\t<ul>\n";
|
||||||
#line 21 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
responseStream << "\t\t\t\t\t<li><a href=\"";
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << "\" class=\"center-logo\">\n";
|
responseStream << ( ServerConfig::g_serverPath );
|
||||||
responseStream << " <picture>\n";
|
responseStream << "/groups\"><span class=\"link-title\">Gruppen</span></a></li>\n";
|
||||||
responseStream << " <source srcset=\"";
|
responseStream << "\t\t\t\t\t<li><a href=\"";
|
||||||
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
responseStream << ( ServerConfig::g_serverPath );
|
||||||
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
|
responseStream << "/nodes\"><span class=\"link-title\">Node Server</span></a></li>\n";
|
||||||
responseStream << " <source srcset=\"";
|
responseStream << "\t\t\t\t\t<li><a href=\"";
|
||||||
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
responseStream << ( ServerConfig::g_serverPath );
|
||||||
responseStream << "img/logo_schrift.png\" type=\"image/png\">\n";
|
responseStream << "/hedera_account\"><span class=\"link-title\">Hedera Accounts</span></a></li>\n";
|
||||||
responseStream << " <img src=\"";
|
responseStream << "\t\t\t\t\t<li><a href=\"";
|
||||||
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
|
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
|
||||||
responseStream << ( ServerConfig::g_php_serverPath );
|
responseStream << ( ServerConfig::g_serverPath );
|
||||||
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
|
responseStream << "/topic\"><span class=\"link-title\">Hedera Topics</span></a></li>\n";
|
||||||
responseStream << " </picture>\n";
|
responseStream << "\t\t\t\t</ul>\n";
|
||||||
responseStream << " </a>\n";
|
responseStream << "\t\t\t</div>\n";
|
||||||
responseStream << " </div>";
|
responseStream << "\t\t</div>\n";
|
||||||
// end include header.cpsp
|
responseStream << "\t\t<div class=\"content\">";
|
||||||
|
// end include header_large.cpsp
|
||||||
responseStream << "\n";
|
responseStream << "\n";
|
||||||
#line 38 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
#line 38 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( getErrorsHtml() );
|
responseStream << ( getErrorsHtml() );
|
||||||
@ -122,11 +123,11 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
|
|||||||
responseStream << "\t\t</div>\t\n";
|
responseStream << "\t\t</div>\t\n";
|
||||||
responseStream << "\t\t<div class=\"content-list-table\">\n";
|
responseStream << "\t\t<div class=\"content-list-table\">\n";
|
||||||
responseStream << "\t\t\t<div class=\"row\">\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 c0\">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 c2\">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 c2\">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 c3\">Url</div>\n";
|
||||||
responseStream << "\t\t\t\t<div class=\"cell header-cell\">";
|
responseStream << "\t\t\t\t<div class=\"cell header-cell c5\">";
|
||||||
#line 50 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
#line 50 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( gettext("Description") );
|
responseStream << ( gettext("Description") );
|
||||||
responseStream << "</div>\n";
|
responseStream << "</div>\n";
|
||||||
@ -136,23 +137,23 @@ void AdminGroupsPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:
|
|||||||
for(auto it = groups.begin(); it != groups.end(); it++) {
|
for(auto it = groups.begin(); it != groups.end(); it++) {
|
||||||
auto group_model = (*it)->getModel(); responseStream << "\n";
|
auto group_model = (*it)->getModel(); responseStream << "\n";
|
||||||
responseStream << "\t\t\t\t<div class=\"row\">\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"
|
#line 55 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( group_model->getID() );
|
responseStream << ( group_model->getID() );
|
||||||
responseStream << "</div>\n";
|
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"
|
#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( group_model->getName() );
|
responseStream << ( group_model->getName() );
|
||||||
responseStream << "</div>\n";
|
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"
|
#line 57 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( group_model->getAlias() );
|
responseStream << ( group_model->getAlias() );
|
||||||
responseStream << "</div>\n";
|
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"
|
#line 58 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( group_model->getUrl() );
|
responseStream << ( group_model->getUrl() );
|
||||||
responseStream << "</div>\n";
|
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"
|
#line 59 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminGroups.cpsp"
|
||||||
responseStream << ( group_model->getDescription());
|
responseStream << ( group_model->getDescription());
|
||||||
responseStream << "</div>\n";
|
responseStream << "</div>\n";
|
||||||
|
|||||||
@ -55,8 +55,8 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
|
|||||||
int num = 0;
|
int num = 0;
|
||||||
int networkType = 0;
|
int networkType = 0;
|
||||||
|
|
||||||
MemoryBin* privateKey = nullptr;
|
MemoryBin* private_key = nullptr;
|
||||||
MemoryBin* publicKey = nullptr;
|
MemoryBin* public_key = nullptr;
|
||||||
|
|
||||||
// validate
|
// validate
|
||||||
if(!sm->isValid(shardNumString, VALIDATE_ONLY_INTEGER)) {
|
if(!sm->isValid(shardNumString, VALIDATE_ONLY_INTEGER)) {
|
||||||
@ -100,22 +100,22 @@ void AdminHederaAccountPage::handleRequest(Poco::Net::HTTPServerRequest& request
|
|||||||
if(0 == errorCount()) {
|
if(0 == errorCount()) {
|
||||||
|
|
||||||
auto hedera_id = controller::HederaId::create(shardNum, realmNum, num);
|
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);
|
private_key = DataTypeConverter::hexToBin(privateKeyString);
|
||||||
publicKey = DataTypeConverter::hexToBin(publicKeyString);
|
public_key = DataTypeConverter::hexToBin(publicKeyString);
|
||||||
|
|
||||||
|
|
||||||
KeyPairHedera key_pair(privateKey, publicKey);
|
KeyPairHedera key_pair(private_key, public_key);
|
||||||
mm->releaseMemory(privateKey);
|
auto crypto_key = controller::CryptoKey::load(key_pair.getPublicKey(), ed25519_pubkey_SIZE);
|
||||||
mm->releaseMemory(publicKey);
|
|
||||||
auto crypto_key = controller::CryptoKey::create(&key_pair, user);
|
if(crypto_key.isNull()) {
|
||||||
|
crypto_key = controller::CryptoKey::create(&key_pair, user);
|
||||||
if(!crypto_key->getModel()->insertIntoDB(true)) {
|
if(!crypto_key->getModel()->insertIntoDB(true)) {
|
||||||
addError(new Error("DB Error", "Error saving crypto key in DB"));
|
addError(new Error("DB Error", "Error saving crypto key in DB"));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
printf("crypto key found in db\n");
|
||||||
|
}
|
||||||
if(0 == errorCount()) {
|
if(0 == errorCount()) {
|
||||||
auto hedera_account = controller::HederaAccount::create(
|
auto hedera_account = controller::HederaAccount::create(
|
||||||
user->getModel()->getID(),
|
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"));
|
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"
|
#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 << "</head>\n";
|
||||||
responseStream << "<body>\n";
|
responseStream << "<body>\n";
|
||||||
responseStream << " <div class=\"layout\">\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\">";
|
responseStream << "\t\t<div class=\"content\">";
|
||||||
// end include header_large.cpsp
|
// end include header_large.cpsp
|
||||||
responseStream << "\n";
|
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 << ( getErrorsHtml() );
|
||||||
responseStream << "\n";
|
responseStream << "\n";
|
||||||
responseStream << "<div class=\"center-form-container\">\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<div class=\"center-form-title\">\n";
|
||||||
responseStream << "\t <h3>Einen neuen Account anlegen</h3>\n";
|
responseStream << "\t <h3>Einen neuen Account anlegen</h3>\n";
|
||||||
responseStream << "\t</div>\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<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<select class=\"form-control\" name=\"account-network-type\" id=\"account-network-type\">\n";
|
||||||
responseStream << "\t\t\t";
|
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";
|
for(int i = 0; i < model::table::HEDERA_NET_COUNT; i++) { responseStream << "\n";
|
||||||
responseStream << "\t\t\t\t<option value=\"";
|
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 << ( i );
|
||||||
responseStream << "\">";
|
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 << ( model::table::HederaAccount::hederaNetworkTypeToString((model::table::HederaNetworkType)i) );
|
||||||
responseStream << "</option>\n";
|
responseStream << "</option>\n";
|
||||||
responseStream << "\t\t\t";
|
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 << "\n";
|
||||||
responseStream << "\t\t\t</select>\n";
|
responseStream << "\t\t\t</select>\n";
|
||||||
responseStream << "\t\t\t<input class=\"center-form-submit form-button\" type=\"submit\" name=\"submit\" value=\"";
|
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 << ( gettext("Add Account") );
|
||||||
responseStream << "\">\n";
|
responseStream << "\">\n";
|
||||||
responseStream << "\t</form>\n";
|
responseStream << "\t</form>\n";
|
||||||
|
|||||||
363
src/cpp/HTTPInterface/AdminNodeServerPage.cpp
Normal file
363
src/cpp/HTTPInterface/AdminNodeServerPage.cpp
Normal 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();
|
||||||
|
}
|
||||||
20
src/cpp/HTTPInterface/AdminNodeServerPage.h
Normal file
20
src/cpp/HTTPInterface/AdminNodeServerPage.h
Normal 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
|
||||||
@ -30,6 +30,7 @@
|
|||||||
#include "AdminGroupsPage.h"
|
#include "AdminGroupsPage.h"
|
||||||
#include "AdminTopicPage.h"
|
#include "AdminTopicPage.h"
|
||||||
#include "AdminHederaAccountPage.h"
|
#include "AdminHederaAccountPage.h"
|
||||||
|
#include "AdminNodeServerPage.h"
|
||||||
|
|
||||||
#include "DecodeTransactionPage.h"
|
#include "DecodeTransactionPage.h"
|
||||||
#include "RepairDefectPassphrase.h"
|
#include "RepairDefectPassphrase.h"
|
||||||
@ -224,6 +225,11 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c
|
|||||||
pageRequestHandler->setProfiler(timeUsed);
|
pageRequestHandler->setProfiler(timeUsed);
|
||||||
return pageRequestHandler;
|
return pageRequestHandler;
|
||||||
}
|
}
|
||||||
|
if (url_first_part == "/nodes") {
|
||||||
|
auto pageRequestHandler = new AdminNodeServerPage(s);
|
||||||
|
pageRequestHandler->setProfiler(timeUsed);
|
||||||
|
return pageRequestHandler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(url_first_part == "/logout") {
|
if(url_first_part == "/logout") {
|
||||||
|
|||||||
@ -74,6 +74,7 @@ Poco::Data::Session ConnectionManager::getConnection(ConnectionType type)
|
|||||||
}
|
}
|
||||||
auto session = mSessionPools.getPool(mSessionPoolNames[type]).get();
|
auto session = mSessionPools.getPool(mSessionPoolNames[type]).get();
|
||||||
|
|
||||||
|
|
||||||
//return mSessionPoolNames[type];
|
//return mSessionPoolNames[type];
|
||||||
/*if (!session.isConnected()) {
|
/*if (!session.isConnected()) {
|
||||||
printf("reconnect called\n");
|
printf("reconnect called\n");
|
||||||
@ -85,6 +86,7 @@ Poco::Data::Session ConnectionManager::getConnection(ConnectionType type)
|
|||||||
sendErrorsAsEmail();
|
sendErrorsAsEmail();
|
||||||
return mSessionPools.getPool(mSessionPoolNames[type]).get();
|
return mSessionPools.getPool(mSessionPoolNames[type]).get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}*/
|
}*/
|
||||||
//std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S");
|
//std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S");
|
||||||
//printf("[getConnection] %s impl: %p\n", dateTimeString.data(), session.impl());
|
//printf("[getConnection] %s impl: %p\n", dateTimeString.data(), session.impl());
|
||||||
|
|||||||
@ -50,6 +50,8 @@ bool SessionManager::init()
|
|||||||
case VALIDATE_HAS_NUMBER: mValidations[i] = new Poco::RegularExpression(".*[0-9].*"); break;
|
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_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_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_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression(".*[@$!%*?&+-].*"); break;
|
||||||
case VALIDATE_HAS_UPPERCASE_LETTER:
|
case VALIDATE_HAS_UPPERCASE_LETTER:
|
||||||
mValidations[i] = new Poco::RegularExpression(".*[A-Z].*");
|
mValidations[i] = new Poco::RegularExpression(".*[A-Z].*");
|
||||||
|
|||||||
@ -30,6 +30,7 @@ enum SessionValidationTypes {
|
|||||||
VALIDATE_HAS_NUMBER,
|
VALIDATE_HAS_NUMBER,
|
||||||
VALIDATE_ONLY_INTEGER,
|
VALIDATE_ONLY_INTEGER,
|
||||||
VALIDATE_ONLY_HEX,
|
VALIDATE_ONLY_HEX,
|
||||||
|
VALIDATE_ONLY_URL,
|
||||||
VALIDATE_HAS_SPECIAL_CHARACTER,
|
VALIDATE_HAS_SPECIAL_CHARACTER,
|
||||||
VALIDATE_HAS_UPPERCASE_LETTER,
|
VALIDATE_HAS_UPPERCASE_LETTER,
|
||||||
VALIDATE_HAS_LOWERCASE_LETTER,
|
VALIDATE_HAS_LOWERCASE_LETTER,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
#include "CryptoKey.h"
|
#include "CryptoKey.h"
|
||||||
|
#include "../SingletonManager/ErrorManager.h"
|
||||||
|
|
||||||
namespace controller {
|
namespace controller {
|
||||||
|
|
||||||
@ -39,6 +40,28 @@ namespace controller {
|
|||||||
return nullptr;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,8 @@ namespace controller {
|
|||||||
|
|
||||||
//! if returned ptr is NULL, dataset not found
|
//! if returned ptr is NULL, dataset not found
|
||||||
static Poco::AutoPtr<CryptoKey> load(int id);
|
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(); }
|
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,7 @@ namespace controller {
|
|||||||
std::vector<Poco::AutoPtr<Group>> Group::load(const std::string& alias)
|
std::vector<Poco::AutoPtr<Group>> Group::load(const std::string& alias)
|
||||||
{
|
{
|
||||||
auto db = new model::table::Group();
|
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;
|
std::vector<Poco::AutoPtr<Group>> resultVector;
|
||||||
resultVector.reserve(group_list.size());
|
resultVector.reserve(group_list.size());
|
||||||
|
|||||||
@ -20,15 +20,19 @@ namespace controller {
|
|||||||
return Poco::AutoPtr<HederaAccount>(group);
|
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 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;
|
std::vector<Poco::AutoPtr<HederaAccount>> resultVector;
|
||||||
resultVector.reserve(group_list.size());
|
resultVector.reserve(hedera_account_list.size());
|
||||||
for (auto it = group_list.begin(); it != group_list.end(); it++) {
|
for (auto it = hedera_account_list.begin(); it != hedera_account_list.end(); it++) {
|
||||||
resultVector.push_back(new HederaAccount(new model::table::HederaAccount(*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;
|
return resultVector;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#ifndef GRADIDO_LOGIN_SERVER_CONTROLLER_HEDERA_ACCOUNT_INCLUDE
|
#ifndef GRADIDO_LOGIN_SERVER_CONTROLLER_HEDERA_ACCOUNT_INCLUDE
|
||||||
#define 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 "../model/table/HederaAccount.h"
|
||||||
|
|
||||||
#include "Poco/SharedPtr.h"
|
#include "Poco/SharedPtr.h"
|
||||||
@ -11,21 +12,23 @@ namespace controller {
|
|||||||
class HederaAccount : public TableControllerBase
|
class HederaAccount : public TableControllerBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
~HederaAccount();
|
~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 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();
|
static std::vector<Poco::AutoPtr<HederaAccount>> listAll();
|
||||||
|
|
||||||
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
|
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
|
||||||
|
|
||||||
inline Poco::AutoPtr<model::table::HederaAccount> getModel() { return _getModel<model::table::HederaAccount>(); }
|
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:
|
protected:
|
||||||
HederaAccount(model::table::HederaAccount* dbModel);
|
HederaAccount(model::table::HederaAccount* dbModel);
|
||||||
|
Poco::AutoPtr<controller::HederaId> mHederaID;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
145
src/cpp/controller/NodeServer.cpp
Normal file
145
src/cpp/controller/NodeServer.cpp
Normal 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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
52
src/cpp/controller/NodeServer.h
Normal file
52
src/cpp/controller/NodeServer.h
Normal 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
|
||||||
@ -29,6 +29,15 @@ namespace model {
|
|||||||
|
|
||||||
static const char* hederaNetworkTypeToString(HederaNetworkType type);
|
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:
|
protected:
|
||||||
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
|
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 _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);
|
||||||
|
|||||||
@ -24,12 +24,37 @@ namespace model {
|
|||||||
std::string HederaId::toString()
|
std::string HederaId::toString()
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Shard Num: " << std::to_string(mShardNum) << std::endl;
|
ss << std::to_string(mShardNum) << "." << std::to_string(mRealmNum) << "." << std::to_string(mNum) << std::endl;
|
||||||
ss << "Realm Num: " << std::to_string(mRealmNum) << std::endl;
|
|
||||||
ss << "Num: " << std::to_string(mNum) << std::endl;
|
|
||||||
return ss.str();
|
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)
|
Poco::Data::Statement HederaId::_loadFromDB(Poco::Data::Session session, const std::string& fieldName)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,9 @@ namespace model {
|
|||||||
const char* getTableName() const { return "hedera_ids"; }
|
const char* getTableName() const { return "hedera_ids"; }
|
||||||
std::string toString();
|
std::string toString();
|
||||||
|
|
||||||
|
//! \brief check if hedera id already in db, then return id, else insert in db and return
|
||||||
|
int getID();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
|
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
|
||||||
|
|||||||
@ -48,17 +48,22 @@ namespace model {
|
|||||||
|
|
||||||
size_t resultCount = 0;
|
size_t resultCount = 0;
|
||||||
try {
|
try {
|
||||||
if (insert.execute() == 1) {
|
if (insert.execute(true) == 1) {
|
||||||
// load id from db
|
// load id from db
|
||||||
if (loadId) {
|
if (loadId) {
|
||||||
Poco::Data::Statement select = _loadIdFromDB(cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER));
|
Poco::Data::Statement select = _loadIdFromDB(session);
|
||||||
try {
|
try {
|
||||||
return select.execute() == 1;
|
select.executeAsync();
|
||||||
|
return select.wait() == 1;
|
||||||
}
|
}
|
||||||
catch (Poco::Exception& ex) {
|
catch (Poco::Exception& ex) {
|
||||||
addError(new ParamError(getTableName(), "mysql error by select id", ex.displayText().data()));
|
addError(new ParamError(getTableName(), "mysql error by select id", ex.displayText().data()));
|
||||||
addError(new ParamError(getTableName(), "data set: ", toString().data()));
|
addError(new ParamError(getTableName(), "data set: ", toString().data()));
|
||||||
}
|
}
|
||||||
|
select.reset(session);
|
||||||
|
select = _loadIdFromDB(session);
|
||||||
|
//Poco::Data::Statement select = _loadIdFromDB(session);
|
||||||
|
select.execute();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
114
src/cpp/model/table/NodeServer.cpp
Normal file
114
src/cpp/model/table/NodeServer.cpp
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
71
src/cpp/model/table/NodeServer.h
Normal file
71
src/cpp/model/table/NodeServer.h
Normal 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
|
||||||
@ -34,7 +34,7 @@
|
|||||||
//auto groups = controller::Group::load("gdd1");
|
//auto groups = controller::Group::load("gdd1");
|
||||||
//std::vector<Poco::SharedPtr<controller::Group>> groups;
|
//std::vector<Poco::SharedPtr<controller::Group>> groups;
|
||||||
|
|
||||||
%><%@ include file="header.cpsp" %>
|
%><%@ include file="header_large.cpsp" %>
|
||||||
<%= getErrorsHtml() %>
|
<%= getErrorsHtml() %>
|
||||||
<div class="center-form-container">
|
<div class="center-form-container">
|
||||||
<div class="content-list">
|
<div class="content-list">
|
||||||
@ -43,20 +43,20 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="content-list-table">
|
<div class="content-list-table">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="cell header-cell">ID</div>
|
<div class="cell header-cell c0">ID</div>
|
||||||
<div class="cell header-cell">Name</div>
|
<div class="cell header-cell c2">Name</div>
|
||||||
<div class="cell header-cell">Alias</div>
|
<div class="cell header-cell c2">Alias</div>
|
||||||
<div class="cell header-cell">Url</div>
|
<div class="cell header-cell c3">Url</div>
|
||||||
<div class="cell header-cell"><%= gettext("Description") %></div>
|
<div class="cell header-cell c5"><%= gettext("Description") %></div>
|
||||||
</div>
|
</div>
|
||||||
<% for(auto it = groups.begin(); it != groups.end(); it++) {
|
<% for(auto it = groups.begin(); it != groups.end(); it++) {
|
||||||
auto group_model = (*it)->getModel(); %>
|
auto group_model = (*it)->getModel(); %>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="cell"><%= group_model->getID() %></div>
|
<div class="cell c0"><%= group_model->getID() %></div>
|
||||||
<div class="cell"><%= group_model->getName() %></div>
|
<div class="cell c2"><%= group_model->getName() %></div>
|
||||||
<div class="cell"><%= group_model->getAlias() %></div>
|
<div class="cell c2"><%= group_model->getAlias() %></div>
|
||||||
<div class="cell"><%= group_model->getUrl() %></div>
|
<div class="cell c3"><%= group_model->getUrl() %></div>
|
||||||
<div class="celL"><%= group_model->getDescription()%></div>
|
<div class="cell c5"><%= group_model->getDescription()%></div>
|
||||||
</div>
|
</div>
|
||||||
<% } %>
|
<% } %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
200
src/cpsp/adminNodeServer.cpsp
Normal file
200
src/cpsp/adminNodeServer.cpsp
Normal 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" %>
|
||||||
@ -16,4 +16,14 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="layout">
|
<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">
|
<div class="content">
|
||||||
Loading…
x
Reference in New Issue
Block a user