From 1936749ff580fd6a598af43dea93d8e5525017a6 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Tue, 20 Apr 2021 19:52:23 +0200 Subject: [PATCH] Fix keys not being reshared to the same devices, that already got them, if the message got lost --- CMakeLists.txt | 4 +- io.github.NhekoReborn.Nheko.yaml | 3 +- src/Cache.cpp | 2 +- src/Olm.cpp | 68 +++++++++++++++++++++----------- 4 files changed, 51 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 11e7518d..468480d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -361,13 +361,13 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG v0.5.0 + GIT_TAG v0.5.1 ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") FetchContent_MakeAvailable(MatrixClient) else() - find_package(MatrixClient 0.4.1 REQUIRED) + find_package(MatrixClient 0.5.1 REQUIRED) endif() if(USE_BUNDLED_OLM) include(FetchContent) diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml index 97d0d095..c00385bc 100644 --- a/io.github.NhekoReborn.Nheko.yaml +++ b/io.github.NhekoReborn.Nheko.yaml @@ -148,7 +148,8 @@ modules: buildsystem: cmake-ninja name: mtxclient sources: - - commit: fe3df73f71d921b6927f09b8ef58feba03408414 + - commit: b19f1dc7e422f1bb217f02487567fc09e25e7d2b + tag: v0.5.1 type: git url: https://github.com/Nheko-Reborn/mtxclient.git - config-opts: diff --git a/src/Cache.cpp b/src/Cache.cpp index 9e9e1586..0de790ac 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -334,7 +334,7 @@ Cache::exportSessionKeys() exported.room_id = index.room_id; exported.sender_key = index.sender_key; exported.session_id = index.session_id; - exported.session_key = export_session(saved_session.get()); + exported.session_key = export_session(saved_session.get(), -1); keys.sessions.push_back(exported); } diff --git a/src/Olm.cpp b/src/Olm.cpp index 95aae99a..b218ba2c 100644 --- a/src/Olm.cpp +++ b/src/Olm.cpp @@ -823,10 +823,10 @@ handle_key_request_message(const mtx::events::DeviceEventwarn("requested session not found in room: {}", req.content.room_id); - return; } @@ -854,7 +854,9 @@ handle_key_request_message(const mtx::events::DeviceEventuserSettings()->shareKeysWithTrustedUsers()) { + // Share keys, if the option to share with trusted users is enabled or with yourself + (ChatPage::instance()->userSettings()->shareKeysWithTrustedUsers() || + req.sender == http::client()->user_id().to_string())) { for (const auto &dev : verificationStatus->verified_devices) { if (dev == req.content.requesting_device_id) { verifiedDevice = true; @@ -864,28 +866,50 @@ handle_key_request_message(const mtx::events::DeviceEventdebug("ignoring all key requests for room {}", - req.content.room_id); + bool shouldSeeKeys = false; + uint64_t minimumIndex = -1; + if (outboundSession.data.currently.keys.count(req.sender)) { + if (outboundSession.data.currently.keys.at(req.sender) + .devices.count(req.content.requesting_device_id)) { + shouldSeeKeys = true; + minimumIndex = outboundSession.data.currently.keys.at(req.sender) + .devices.at(req.content.requesting_device_id); + } + } + + if (!verifiedDevice && !shouldSeeKeys && + !utils::respondsToKeyRequests(req.content.room_id)) { + nhlog::crypto()->debug("ignoring key request for room {}", req.content.room_id); return; } - auto session_key = mtx::crypto::export_session(session.get()); - // - // Prepare the m.room_key event. - // - mtx::events::msg::ForwardedRoomKey forward_key{}; - forward_key.algorithm = MEGOLM_ALGO; - forward_key.room_id = index.room_id; - forward_key.session_id = index.session_id; - forward_key.session_key = session_key; - forward_key.sender_key = index.sender_key; - - // TODO(Nico): Figure out if this is correct - forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; - forward_key.forwarding_curve25519_key_chain = {}; - - send_megolm_key_to_device(req.sender, req.content.requesting_device_id, forward_key); + if (verifiedDevice || utils::respondsToKeyRequests(req.content.room_id)) { + // share the minimum index we have + minimumIndex = -1; + } + + try { + auto session_key = mtx::crypto::export_session(session.get(), minimumIndex); + + // + // Prepare the m.room_key event. + // + mtx::events::msg::ForwardedRoomKey forward_key{}; + forward_key.algorithm = MEGOLM_ALGO; + forward_key.room_id = index.room_id; + forward_key.session_id = index.session_id; + forward_key.session_key = session_key; + forward_key.sender_key = index.sender_key; + + // TODO(Nico): Figure out if this is correct + forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; + forward_key.forwarding_curve25519_key_chain = {}; + + send_megolm_key_to_device( + req.sender, req.content.requesting_device_id, forward_key); + } catch (std::exception &e) { + nhlog::crypto()->error("Failed to forward session key: {}", e.what()); + } } void