#include "node.hpp" void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange const& ke) { CMixClientData d; size_t len = get_group_element_array_size(&cmix_ctx); cmix_proto::KeyExchange nke; nke.mutable_public_key()->resize(len); nke.mutable_value()->resize(len); key_exchange_responder(&cmix_ctx, &d.shared_value, &(*nke.mutable_public_key())[0], &(*nke.mutable_value())[0], ke.public_key().data(), ke.value().data()); data[handle] = d; clients.at(handle).async_send(nke); } void Node::handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye const&) { clients.at(handle).close(); clients.erase(handle); } void Node::handle_client_usermessage(ClientConnections::key_type handle, cmix_proto::UserMessage const& um) { if(!network_settings.is_first) { BOOST_LOG_TRIVIAL(warning) << "Received a user message but I'm not the first node, ignoring."; return; } messages[handle].push(um.m()); } void Node::handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message) { switch(message.contents_case()) { case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: { BOOST_LOG_TRIVIAL(trace) << "Handling keyexchange"; handle_client_keyexchange(handle, message.keyexchange()); break; } case cmix_proto::CMixMessage::ContentsCase::kBye: { BOOST_LOG_TRIVIAL(trace) << "Handling bye"; handle_client_bye(handle, message.bye()); return; } case cmix_proto::CMixMessage::ContentsCase::kUsermessage: { BOOST_LOG_TRIVIAL(trace) << "Handling user message"; handle_client_usermessage(handle, message.usermessage()); break; } default: { BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents."; } } clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message){ handle_client_message(handle, message); }); }