summary refs log tree commit diff
path: root/src/encryption/Olm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/encryption/Olm.cpp')
-rw-r--r--src/encryption/Olm.cpp67
1 files changed, 67 insertions, 0 deletions
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
@@ -874,6 +874,73 @@ mark_keys_as_published() } 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) { if (!UserSettings::instance()->useOnlineKeyBackup()) {