aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-04-28 11:52:04 +0200
committerdec05eba <dec05eba@protonmail.com>2018-04-28 11:53:18 +0200
commit3b03f87070d91f63f0dc3c7152723727781dcccf (patch)
tree7b06163f34248d1e632c032cfaf306787675e585 /src/main.cpp
parentb0bfb8b8d1479502bd5adf17e6a1b94ec00c63ca (diff)
Add commands, users side panel, improve image download
start using odhtdb
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp165
1 files changed, 159 insertions, 6 deletions
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 <string>
#include <SFML/Graphics.hpp>
#include <cstring>
-#include <X11/Xlib.h>
#include <boost/filesystem/path.hpp>
+#include <odhtdb/Database.hpp>
+#include <odhtdb/Signature.hpp>
+#include <odhtdb/bin2hex.hpp>
+#include <odhtdb/hex2bin.hpp>
+#include <X11/Xlib.h>
using namespace std;
using namespace dchat;
using namespace TinyProcessLib;
+string createChannelJoinKey(const unique_ptr<odhtdb::DatabaseCreateResponse> &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<odhtdb::NodeLocalUser> localNodeUsers;
+ string currentUserName;
+ string currentUserPassword;
+
+ Command::add("login", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &localNodeUsers, &database](const vector<string> &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", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &database](const vector<string> &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", [&currentUserKeyPair, &currentUserName, &database](const vector<string> &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", [&currentUserKeyPair, &database](const vector<string> &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();
}