From ead10cd0fdd3437004f87afde51c290fc2c025ca Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 18 Jun 2022 20:16:52 +0200 Subject: Request full online keybackup when turning it on --- src/encryption/Olm.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'src/encryption/Olm.cpp') diff --git a/src/encryption/Olm.cpp b/src/encryption/Olm.cpp index 8bf2222f..ed84a275 100644 --- a/src/encryption/Olm.cpp +++ b/src/encryption/Olm.cpp @@ -873,6 +873,73 @@ mark_keys_as_published() cache::saveOlmAccount(olm::client()->save(cache::client()->pickleSecret())); } +void +download_full_keybackup() +{ + if (!UserSettings::instance()->useOnlineKeyBackup()) { + // Online key backup disabled + return; + } + + auto backupVersion = cache::client()->backupVersion(); + if (!backupVersion) { + // no trusted OKB + return; + } + + using namespace mtx::crypto; + + auto decryptedSecret = cache::secret(mtx::secret_storage::secrets::megolm_backup_v1); + if (!decryptedSecret) { + // no backup key available + return; + } + auto sessionDecryptionKey = to_binary_buf(base642bin(*decryptedSecret)); + + http::client()->room_keys( + backupVersion->version, + [sessionDecryptionKey](const mtx::responses::backup::KeysBackup &bk, + mtx::http::RequestErr err) { + if (err) { + if (err->status_code != 404) + nhlog::crypto()->error("Failed to dowload backup {}:{}: {} - {}", + mtx::errors::to_string(err->matrix_error.errcode), + err->matrix_error.error); + return; + } + + mtx::crypto::ExportedSessionKeys allKeys; + try { + for (const auto &[room, roomKey] : bk.rooms) { + for (const auto &[session_id, encSession] : roomKey.sessions) { + auto session = decrypt_session(encSession.session_data, sessionDecryptionKey); + + if (session.algorithm != mtx::crypto::MEGOLM_ALGO) + // don't know this algorithm + return; + + ExportedSession sess{}; + sess.session_id = session_id; + sess.room_id = room; + sess.algorithm = mtx::crypto::MEGOLM_ALGO; + sess.forwarding_curve25519_key_chain = + std::move(session.forwarding_curve25519_key_chain); + sess.sender_claimed_keys = std::move(session.sender_claimed_keys); + sess.sender_key = std::move(session.sender_key); + sess.session_key = std::move(session.session_key); + allKeys.sessions.push_back(std::move(sess)); + } + } + + // call on UI thread + QTimer::singleShot(0, ChatPage::instance(), [keys = std::move(allKeys)] { + cache::importSessionKeys(keys); + }); + } catch (const lmdb::error &e) { + nhlog::crypto()->critical("failed to save inbound megolm session: {}", e.what()); + } + }); +} void lookup_keybackup(const std::string room, const std::string session_id) { -- cgit 1.5.1