aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-10-12 14:26:12 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-10-12 14:26:12 +0200
commit7bca48bc5b5e37a3a8b0b23e57b88d069fa50589 (patch)
tree47cd62512e631a064852015c65bb1965bc72414a /client
parent0fb433690c0ca5f9561fe9e2e973e2cd61b873ba (diff)
downloadcmix-7bca48bc5b5e37a3a8b0b23e57b88d069fa50589.tar.gz
cmix-7bca48bc5b5e37a3a8b0b23e57b88d069fa50589.tar.bz2
cmix-7bca48bc5b5e37a3a8b0b23e57b88d069fa50589.zip
Major network rewrite.
One generic class has been introduced to handle all connection types. Typedefs provide Sender Receiver and SenderReceiver types, which limit the functionality of the types. As to not accidentally communicate with the wrong node about things.
Diffstat (limited to 'client')
-rw-r--r--client/CMakeLists.txt1
-rw-r--r--client/cmixclient.cpp38
-rw-r--r--client/cmixclient.hpp9
-rw-r--r--client/node.cpp23
-rw-r--r--client/node.hpp72
5 files changed, 15 insertions, 128 deletions
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index e04bf6a..489a136 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -3,7 +3,6 @@ find_package(Boost COMPONENTS system program_options REQUIRED)
add_executable(client
main.cpp
cmixclient.hpp cmixclient.cpp
- node.hpp node.cpp
)
if(WIN32)
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp
index 195c5e0..1ffd904 100644
--- a/client/cmixclient.cpp
+++ b/client/cmixclient.cpp
@@ -2,15 +2,16 @@
#include "cmixclient.hpp"
void CMixClient::key_exchange(int i) {
- shared_keys.resize(network_connections.size());
+ BOOST_LOG_TRIVIAL(trace) << "Sending KeyExchange for node: " << i;
+ shared_keys.resize(network_details.size());
cmix_proto::KeyExchange ke;
ke.set_public_key(keypair.pub, keypair.pub_len);
- network_connections[i].send(ke);
+ network_connections[i].async_send(ke);
cmix_proto::Bye bye;
- network_connections[i].send(bye);
+ network_connections[i].async_send(bye);
}
void CMixClient::initialize_connections() {
@@ -20,25 +21,14 @@ void CMixClient::initialize_connections() {
auto handler = [this, i]() mutable {
cmix_proto::ImAClient imaclient;
BOOST_LOG_TRIVIAL(trace) << "sending imaclient to node: " << i;
- network_connections.at(i).send(imaclient);
+ network_connections.at(i).async_send(imaclient);
key_exchange(i);
};
network_connections.emplace_back(boost::asio::ip::tcp::socket(io_service));
network_connections.back().async_connect(network_details[i].host, network_details[i].port, handler);
-
- }
-}
-
-cmix_proto::CMixMessage CMixClient::parse_cmix_message(std::vector<uint8_t> const& buffer)
-{
- cmix_proto::CMixMessage message;
- if(!message.ParseFromArray(buffer.data(), buffer.size())) {
- BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage";
- throw std::runtime_error("Network communication was disrupted in a unrecoverable way.");
}
- return message;
}
void CMixClient::handle_key_exchange(int node_id, cmix_proto::KeyExchange const& ke)
@@ -46,19 +36,8 @@ void CMixClient::handle_key_exchange(int node_id, cmix_proto::KeyExchange const&
shared_keys[node_id] = api.derive_shared_key(keypair, reinterpret_cast<uint8_t const*>(ke.public_key().c_str()), false);
}
-void CMixClient::handle_message(int node_id, std::vector<uint8_t> const& message_buffer)
+void CMixClient::handle_message(int node_id, cmix_proto::CMixMessage message)
{
- cmix_proto::CMixMessage message;
- try {
- message = parse_cmix_message(message_buffer);
- } catch(std::runtime_error const& e) {
- for(auto&& connection : network_connections) {
- connection.close();
- }
- io_service.stop();
- return;
- }
-
switch(message.contents_case()) {
case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
handle_key_exchange(node_id, *message.mutable_keyexchange());
@@ -85,6 +64,11 @@ CMixClient::CMixClient(std::vector<NodeDetails> details)
initialize_connections();
}
+CMixClient::~CMixClient()
+{
+ api.free_key_pair(keypair);
+}
+
void CMixClient::run() {
io_service.run();
}
diff --git a/client/cmixclient.hpp b/client/cmixclient.hpp
index 5c6405a..056e2b3 100644
--- a/client/cmixclient.hpp
+++ b/client/cmixclient.hpp
@@ -1,6 +1,6 @@
#pragma once
-#include "node.hpp"
+#include "protobufclient.hpp"
#include "api.h"
#include "logging.hpp"
@@ -21,7 +21,7 @@ class CMixClient {
boost::asio::io_service io_service;
std::vector<NodeDetails> network_details;
- std::vector<Node> network_connections;
+ std::vector<ProtobufClient<SendReceive>> network_connections;
Api api;
KeyPair keypair;
@@ -31,14 +31,13 @@ class CMixClient {
void initialize_connections();
- cmix_proto::CMixMessage parse_cmix_message(std::vector<uint8_t> const& buffer);
-
void handle_key_exchange(int node_id, cmix_proto::KeyExchange const& ke);
- void handle_message(int node_id, std::vector<uint8_t> const& message_buffer);
+ void handle_message(int node_id, cmix_proto::CMixMessage message);
public:
CMixClient(std::vector<NodeDetails> details);
+ ~CMixClient();
void run();
}; \ No newline at end of file
diff --git a/client/node.cpp b/client/node.cpp
deleted file mode 100644
index 46375f4..0000000
--- a/client/node.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "node.hpp"
-
-#include "logging.hpp"
-
-using namespace boost::asio::ip;
-
-Node::Node(tcp::socket&& socket)
-: client(std::move(socket))
-{}
-
-void Node::async_connect(std::string next_host, std::string next_port, std::function<void ()> on_connect)
-{
- client.async_connect(next_host, next_port, on_connect);
-}
-
-void Node::receive(std::function<void (const std::vector<uint8_t>&)> receive_handler) {
- client.receive(receive_handler);
-}
-
-void Node::close()
-{
- client.close();
-}
diff --git a/client/node.hpp b/client/node.hpp
deleted file mode 100644
index afcf56a..0000000
--- a/client/node.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#pragma once
-
-#include "client.hpp"
-
-#include "cmix.pb.h"
-
-#include <boost/asio/ip/tcp.hpp>
-
-/*!
- * \file
- */
-
-/*!
- * MESSAGE_SETTER is a boilerplate macro that generates a setter function for our CMix
- * protobuf messages, This because there are seperate functions for each to type to use.
- * And there seems no way to solve this using templates.
- */
-#define MESSAGE_SETTER(TYPE, NAME) \
-inline void message_setter(cmix_proto::CMixMessage& m, cmix_proto::TYPE const& v) { \
- *m.mutable_##NAME() = v; \
-} \
-
-MESSAGE_SETTER(ImAClient, imaclient)
-MESSAGE_SETTER(Bye, bye)
-MESSAGE_SETTER(KeyExchange, keyexchange)
-
-#undef MESSAGE_SETTER
-
-/*!
- * \brief The Node class represents a node in the network.
- */
-class Node
-{
- Client client;
-public:
- /*!
- * \brief Node
- * \param socket an rvalue reference to the socket it takes ownership and uses to communicate with the next node in the network.
- */
- Node(boost::asio::ip::tcp::socket&& socket);
-
- /*!
- * \brief send
- * \param v The CMixMessage type we try to send and first have to wrap in a CMixMessage.
- */
- template <typename T>
- void send(T v) {
- cmix_proto::CMixMessage m;
- message_setter(m, v);
- client.send(m.SerializeAsString());
- }
-
- /*!
- * \brief receive
- * \param receive_handler
- */
- void receive(std::function<void(std::vector<uint8_t> const&)> receive_handler);
-
- /*!
- * \brief async_connect
- * \param next_host The host of the next node.
- * \param next_port The port of the next node.
- * \param on_connect The callback to call when the connect was succesfull.
- */
- void async_connect(std::string next_host, std::string next_port, std::function<void()> on_connect);
-
- /*!
- * \brief close This function closes the underlying socket connection.
- */
- void close();
-};
-