From 3b03f87070d91f63f0dc3c7152723727781dcccf Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 28 Apr 2018 11:52:04 +0200 Subject: Add commands, users side panel, improve image download start using odhtdb --- src/main.cpp | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 159 insertions(+), 6 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 3cebfe7..52a19b9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,48 @@ #include "../include/Channel.hpp" #include "../include/ChannelSidePanel.hpp" +#include "../include/UsersSidePanel.hpp" #include "../include/Cache.hpp" #include "../include/ResourceCache.hpp" #include "../include/Video.hpp" +#include "../include/Command.hpp" #include #include #include -#include #include +#include +#include +#include +#include +#include using namespace std; using namespace dchat; using namespace TinyProcessLib; +string createChannelJoinKey(const unique_ptr &databaseCreateResponse) +{ + string result; + result += databaseCreateResponse->getRequestHash()->toString(); + result += "&"; + result += odhtdb::bin2hex((const char*)databaseCreateResponse->getNodeEncryptionKey()->data, databaseCreateResponse->getNodeEncryptionKey()->size); + return result; +} + +odhtdb::DatabaseNode createDatabaseNodeFromJoinKey(const string &joinKey) +{ + odhtdb::DatabaseNode result; + + string nodeHashStr = odhtdb::hex2bin(joinKey.c_str(), 64); + memcpy(result.getRequestHash()->getData(), nodeHashStr.data(), nodeHashStr.size()); + + string nodeEncryptionKeyStr = odhtdb::hex2bin(joinKey.c_str() + 65, 64); + char *nodeEncryptionKeyRaw = new char[nodeEncryptionKeyStr.size()]; + result.getNodeEncryptionKey()->data = nodeEncryptionKeyRaw; + result.getNodeEncryptionKey()->size = nodeEncryptionKeyStr.size(); + + return result; +} + int main(int argc, char **argv) { /* @@ -27,14 +57,138 @@ int main(int argc, char **argv) window.setVerticalSyncEnabled(false); window.setFramerateLimit(60); - //odhtdb::Database database("bootstrap.ring.cx", 4222, Cache::getDchatDir()); + odhtdb::Database database("bootstrap.ring.cx", 4222, Cache::getDchatDir()); + + database.setOnCreateNodeCallback([](const odhtdb::DatabaseCreateNodeRequest &request) + { + + }); + + database.setOnAddNodeCallback([](const odhtdb::DatabaseAddNodeRequest &request) + { + + }); + + database.setOnAddUserCallback([](const odhtdb::DatabaseAddUserRequest &request) + { + + }); //Video video(500, 500, "https://www.youtube.com/watch?v=bs0-EX9mJmg"); Cache cache; Channel channel("latenightshiendjs"); - ChannelSidePanel channelSidePanel(300.0f); - channelSidePanel.addChannel(&channel); + ChannelSidePanel::addChannel(&channel); + UsersSidePanel::addUser(channel.getLocalUser()); + + odhtdb::Signature::KeyPair *currentUserKeyPair = nullptr; + vector localNodeUsers; + string currentUserName; + string currentUserPassword; + + Command::add("login", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &localNodeUsers, &database](const vector &args) + { + if(args.size() != 2) + { + fprintf(stderr, "Expected 2 arguments for command login (username and password), got %u argument(s)\n", args.size()); + return; + } + + try + { + odhtdb::Signature::KeyPair keyPair = database.getStorage().decryptLocalEncryptedUser(args[0], args[1]); + localNodeUsers = database.getStorage().getLocalNodeUsers(keyPair); + + for(auto localNodeUser : localNodeUsers) + { + //const odhtdb::DatabaseStorageObjectList *nodeStorage = database.getStorage().getStorage(localNodeUser.nodeHash); + //Channel *channel = new Channel() + } + + printf("Successfully logged into user %s\n", args[0].c_str()); + if(currentUserKeyPair) + delete currentUserKeyPair; + currentUserKeyPair = new odhtdb::Signature::KeyPair(keyPair); + + currentUserName = args[0]; + currentUserPassword = args[1]; + } + catch(odhtdb::DatabaseStorageException &e) + { + fprintf(stderr, "Failed to login, reason: %s\n", e.what()); + } + }); + + Command::add("register", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &database](const vector &args) + { + if(args.size() != 2) + { + fprintf(stderr, "Expected 2 arguments for command register (username and password), got %u argument(s)\n", args.size()); + return; + } + + odhtdb::Signature::KeyPair keyPair; + if(!database.getStorage().storeLocalUser(args[0], keyPair, args[1])) + { + fprintf(stderr, "User with name %s already exists in storage\n", args[0].c_str()); + return; + } + + printf("Registered user %s, public key: %s, private key: %s\n", args[0].c_str(), keyPair.getPublicKey().toString().c_str(), keyPair.getPrivateKey().toString().c_str()); + printf("Successfully logged into user %s\n", args[0].c_str()); + + if(currentUserKeyPair) + delete currentUserKeyPair; + currentUserKeyPair = new odhtdb::Signature::KeyPair(keyPair); + + currentUserName = args[0]; + currentUserPassword = args[1]; + }); + + Command::add("cc", [¤tUserKeyPair, ¤tUserName, &database](const vector &args) + { + if(args.size() != 1) + { + fprintf(stderr, "Expected 1 argument for command cc (channel name), got %u argument(s)\n", args.size()); + return; + } + + if(!currentUserKeyPair) + { + fprintf(stderr, "You are not logged in. Please login before creating a channel\n"); + return; + } + + auto createResponse = database.create(currentUserName, *currentUserKeyPair, args[0]); + database.commit(); + odhtdb::DatabaseNode databaseNode(createResponse->getNodeEncryptionKey(), createResponse->getRequestHash()); + database.seed(databaseNode); + printf("Created database '%s', join key: '%s'\n", args[0].c_str(), createChannelJoinKey(createResponse).c_str()); + }); + + Command::add("jc", [¤tUserKeyPair, &database](const vector &args) + { + if(args.size() != 1) + { + fprintf(stderr, "Expected 1 argument for command jc (channel join key), got %u argument(s)\n", args.size()); + return; + } + + if(args[0].size() != 129) + { + fprintf(stderr, "Expected join key to be 129 characters, was %u character(s)\n", args[0].size()); + return; + } + + if(!currentUserKeyPair) + { + fprintf(stderr, "You are not logged in. Please login before joining a channel\n"); + return; + } + + odhtdb::DatabaseNode databaseNode = createDatabaseNodeFromJoinKey(args[0]); + database.seed(databaseNode); + }); sf::Event event; while (window.isOpen()) @@ -60,8 +214,7 @@ int main(int argc, char **argv) } window.clear(sf::Color(40, 40, 40)); - channel.draw(window, sf::Vector2f(channelSidePanel.width, 0.0f), cache); - channelSidePanel.draw(window); + channel.draw(window, cache); //video.draw(window); window.display(); } -- cgit v1.2.3