summary refs log tree commit diff
path: root/src/Olm.cpp
diff options
context:
space:
mode:
authorJoseph Donofry <joedonofry@gmail.com>2020-05-16 15:10:49 -0400
committerJoseph Donofry <joedonofry@gmail.com>2020-05-16 15:10:49 -0400
commita5778bdf400660f35d6824add12cd8bd78f54336 (patch)
tree379eb6a7a7b7b89bc3086752b6ef317599a2182f /src/Olm.cpp
parentMerge master into reactions (diff)
parentMerge pull request #202 from aaronraimist/brew-libolm (diff)
downloadnheko-a5778bdf400660f35d6824add12cd8bd78f54336.tar.xz
Merge remote-tracking branch 'origin/master' into reactions
Diffstat (limited to 'src/Olm.cpp')
-rw-r--r--src/Olm.cpp73
1 files changed, 39 insertions, 34 deletions
diff --git a/src/Olm.cpp b/src/Olm.cpp

index 8ea39566..2c4f6186 100644 --- a/src/Olm.cpp +++ b/src/Olm.cpp
@@ -23,52 +23,55 @@ client() } void -handle_to_device_messages(const std::vector<nlohmann::json> &msgs) +handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEvents> &msgs) { if (msgs.empty()) return; nhlog::crypto()->info("received {} to_device messages", msgs.size()); + nlohmann::json j_msg; for (const auto &msg : msgs) { - if (msg.count("type") == 0) { + j_msg = std::visit([](auto &e) { return json(e); }, std::move(msg)); + if (j_msg.count("type") == 0) { nhlog::crypto()->warn("received message with no type field: {}", - msg.dump(2)); + j_msg.dump(2)); continue; } - std::string msg_type = msg.at("type"); + std::string msg_type = j_msg.at("type"); if (msg_type == to_string(mtx::events::EventType::RoomEncrypted)) { try { - OlmMessage olm_msg = msg; + OlmMessage olm_msg = j_msg; handle_olm_message(std::move(olm_msg)); } catch (const nlohmann::json::exception &e) { nhlog::crypto()->warn( - "parsing error for olm message: {} {}", e.what(), msg.dump(2)); + "parsing error for olm message: {} {}", e.what(), j_msg.dump(2)); } catch (const std::invalid_argument &e) { - nhlog::crypto()->warn( - "validation error for olm message: {} {}", e.what(), msg.dump(2)); + nhlog::crypto()->warn("validation error for olm message: {} {}", + e.what(), + j_msg.dump(2)); } } else if (msg_type == to_string(mtx::events::EventType::RoomKeyRequest)) { - nhlog::crypto()->warn("handling key request event: {}", msg.dump(2)); + nhlog::crypto()->warn("handling key request event: {}", j_msg.dump(2)); try { - mtx::events::msg::KeyRequest req = msg; - if (req.action == mtx::events::msg::RequestAction::Request) - handle_key_request_message(std::move(req)); + mtx::events::DeviceEvent<mtx::events::msg::KeyRequest> req = j_msg; + if (req.content.action == mtx::events::msg::RequestAction::Request) + handle_key_request_message(req); else nhlog::crypto()->warn( "ignore key request (unhandled action): {}", - req.request_id); + req.content.request_id); } catch (const nlohmann::json::exception &e) { nhlog::crypto()->warn( "parsing error for key_request message: {} {}", e.what(), - msg.dump(2)); + j_msg.dump(2)); } } else { - nhlog::crypto()->warn("unhandled event: {}", msg.dump(2)); + nhlog::crypto()->warn("unhandled event: {}", j_msg.dump(2)); } } } @@ -341,51 +344,53 @@ send_key_request_for(const std::string &room_id, } void -handle_key_request_message(const mtx::events::msg::KeyRequest &req) +handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyRequest> &req) { - if (req.algorithm != MEGOLM_ALGO) { + if (req.content.algorithm != MEGOLM_ALGO) { nhlog::crypto()->debug("ignoring key request {} with invalid algorithm: {}", - req.request_id, - req.algorithm); + req.content.request_id, + req.content.algorithm); return; } // Check if we were the sender of the session being requested. - if (req.sender_key != olm::client()->identity_keys().curve25519) { + if (req.content.sender_key != olm::client()->identity_keys().curve25519) { nhlog::crypto()->debug("ignoring key request {} because we were not the sender: " "\nrequested({}) ours({})", - req.request_id, - req.sender_key, + req.content.request_id, + req.content.sender_key, olm::client()->identity_keys().curve25519); return; } // Check if we have the keys for the requested session. - if (!cache::outboundMegolmSessionExists(req.room_id)) { - nhlog::crypto()->warn("requested session not found in room: {}", req.room_id); + if (!cache::outboundMegolmSessionExists(req.content.room_id)) { + nhlog::crypto()->warn("requested session not found in room: {}", + req.content.room_id); return; } // Check that the requested session_id and the one we have saved match. - const auto session = cache::getOutboundMegolmSession(req.room_id); - if (req.session_id != session.data.session_id) { + const auto session = cache::getOutboundMegolmSession(req.content.room_id); + if (req.content.session_id != session.data.session_id) { nhlog::crypto()->warn("session id of retrieved session doesn't match the request: " "requested({}), ours({})", - req.session_id, + req.content.session_id, session.data.session_id); return; } - if (!cache::isRoomMember(req.sender, req.room_id)) { + if (!cache::isRoomMember(req.sender, req.content.room_id)) { nhlog::crypto()->warn( "user {} that requested the session key is not member of the room {}", req.sender, - req.room_id); + req.content.room_id); return; } - if (!utils::respondsToKeyRequests(req.room_id)) { - nhlog::crypto()->debug("ignoring all key requests for room {}", req.room_id); + if (!utils::respondsToKeyRequests(req.content.room_id)) { + nhlog::crypto()->debug("ignoring all key requests for room {}", + req.content.room_id); return; } @@ -393,11 +398,11 @@ handle_key_request_message(const mtx::events::msg::KeyRequest &req) // Prepare the m.room_key event. // auto payload = json{{"algorithm", "m.megolm.v1.aes-sha2"}, - {"room_id", req.room_id}, - {"session_id", req.session_id}, + {"room_id", req.content.room_id}, + {"session_id", req.content.session_id}, {"session_key", session.data.session_key}}; - send_megolm_key_to_device(req.sender, req.requesting_device_id, payload); + send_megolm_key_to_device(req.sender, req.content.requesting_device_id, payload); } void