Fix keys not being reshared to the same devices, that already got them, if the message got lost

This commit is contained in:
Nicolas Werner 2021-04-20 19:52:23 +02:00
parent 20c1ca2aae
commit 1936749ff5
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
4 changed files with 49 additions and 24 deletions

View File

@ -361,13 +361,13 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare( FetchContent_Declare(
MatrixClient MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git 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_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(MatrixClient) FetchContent_MakeAvailable(MatrixClient)
else() else()
find_package(MatrixClient 0.4.1 REQUIRED) find_package(MatrixClient 0.5.1 REQUIRED)
endif() endif()
if(USE_BUNDLED_OLM) if(USE_BUNDLED_OLM)
include(FetchContent) include(FetchContent)

View File

@ -148,7 +148,8 @@ modules:
buildsystem: cmake-ninja buildsystem: cmake-ninja
name: mtxclient name: mtxclient
sources: sources:
- commit: fe3df73f71d921b6927f09b8ef58feba03408414 - commit: b19f1dc7e422f1bb217f02487567fc09e25e7d2b
tag: v0.5.1
type: git type: git
url: https://github.com/Nheko-Reborn/mtxclient.git url: https://github.com/Nheko-Reborn/mtxclient.git
- config-opts: - config-opts:

View File

@ -334,7 +334,7 @@ Cache::exportSessionKeys()
exported.room_id = index.room_id; exported.room_id = index.room_id;
exported.sender_key = index.sender_key; exported.sender_key = index.sender_key;
exported.session_id = index.session_id; 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); keys.sessions.push_back(exported);
} }

View File

@ -823,10 +823,10 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
} }
// Check if we have the keys for the requested session. // Check if we have the keys for the requested session.
if (!cache::outboundMegolmSessionExists(req.content.room_id)) { auto outboundSession = cache::getOutboundMegolmSession(req.content.room_id);
if (!outboundSession.session) {
nhlog::crypto()->warn("requested session not found in room: {}", nhlog::crypto()->warn("requested session not found in room: {}",
req.content.room_id); req.content.room_id);
return; return;
} }
@ -854,7 +854,9 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
auto verificationStatus = cache::verificationStatus(req.sender); auto verificationStatus = cache::verificationStatus(req.sender);
bool verifiedDevice = false; bool verifiedDevice = false;
if (verificationStatus && if (verificationStatus &&
ChatPage::instance()->userSettings()->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) { for (const auto &dev : verificationStatus->verified_devices) {
if (dev == req.content.requesting_device_id) { if (dev == req.content.requesting_device_id) {
verifiedDevice = true; verifiedDevice = true;
@ -864,28 +866,50 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
} }
} }
if (!utils::respondsToKeyRequests(req.content.room_id) && !verifiedDevice) { bool shouldSeeKeys = false;
nhlog::crypto()->debug("ignoring all key requests for room {}", uint64_t minimumIndex = -1;
req.content.room_id); 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; return;
} }
auto session_key = mtx::crypto::export_session(session.get()); if (verifiedDevice || utils::respondsToKeyRequests(req.content.room_id)) {
// // share the minimum index we have
// Prepare the m.room_key event. minimumIndex = -1;
// }
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 try {
forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; auto session_key = mtx::crypto::export_session(session.get(), minimumIndex);
forward_key.forwarding_curve25519_key_chain = {};
send_megolm_key_to_device(req.sender, req.content.requesting_device_id, forward_key); //
// 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 void