#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; } case cmix_proto::CMixMessage::ContentsCase::CONTENTS_NOT_SET: case cmix_proto::CMixMessage::ContentsCase::kInitialization: case cmix_proto::CMixMessage::ContentsCase::kSecretkey: case cmix_proto::CMixMessage::ContentsCase::kImaclient: case cmix_proto::CMixMessage::ContentsCase::kImanode: case cmix_proto::CMixMessage::ContentsCase::kNodeready: case cmix_proto::CMixMessage::ContentsCase::kPrepre: case cmix_proto::CMixMessage::ContentsCase::kPremix: case cmix_proto::CMixMessage::ContentsCase::kPrepost: case cmix_proto::CMixMessage::ContentsCase::kRealpre: case cmix_proto::CMixMessage::ContentsCase::kRealmix: case cmix_proto::CMixMessage::ContentsCase::kRealpost: case cmix_proto::CMixMessage::ContentsCase::kCommitments: case cmix_proto::CMixMessage::ContentsCase::kPayload: case cmix_proto::CMixMessage::ContentsCase::kPerformance: { BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents."; break; } } clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message2){ handle_client_message(handle, message2); }); }