diff --git a/src/Olm.cpp b/src/Olm.cpp
index 028095a6..4ccf8ab9 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -890,12 +890,15 @@ decryptEvent(const MegolmSessionIndex &index,
std::string msg_str;
try {
auto session = cache::client()->getInboundMegolmSession(index);
+
auto res =
olm::client()->decrypt_group_message(session.get(), event.content.ciphertext);
msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) {
return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
} catch (const mtx::crypto::olm_exception &e) {
+ if (e.error_code() == mtx::crypto::OlmErrorCode::UNKNOWN_MESSAGE_INDEX)
+ return {DecryptionErrorCode::MissingSessionIndex, e.what(), std::nullopt};
return {DecryptionErrorCode::DecryptionFailed, e.what(), std::nullopt};
}
diff --git a/src/Olm.h b/src/Olm.h
index 78c1e641..45b6b890 100644
--- a/src/Olm.h
+++ b/src/Olm.h
@@ -17,7 +17,9 @@ enum class DecryptionErrorCode
{
MissingSession, // Session was not found, retrieve from backup or request from other devices
// and try again
- DbError, // DB read failed
+ MissingSessionIndex, // Session was found, but it does not reach back enough to this index,
+ // retrieve from backup or request from other devices and try again
+ DbError, // DB read failed
DecryptionFailed, // libolm error
ParsingFailed, // Failed to parse the actual event
ReplayAttack, // Megolm index reused
diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index 41001081..d7629456 100644
--- a/src/timeline/EventStore.cpp
+++ b/src/timeline/EventStore.cpp
@@ -543,12 +543,21 @@ EventStore::decryptEvent(const IdIndex &idx,
if (decryptionResult.error) {
switch (*decryptionResult.error) {
- case olm::DecryptionErrorCode::MissingSession: {
- dummy.content.body =
- tr("-- Encrypted Event (No keys found for decryption) --",
- "Placeholder, when the message was not decrypted yet or can't be "
- "decrypted.")
- .toStdString();
+ case olm::DecryptionErrorCode::MissingSession:
+ case olm::DecryptionErrorCode::MissingSessionIndex: {
+ if (decryptionResult.error == olm::DecryptionErrorCode::MissingSession)
+ dummy.content.body =
+ tr("-- Encrypted Event (No keys found for decryption) --",
+ "Placeholder, when the message was not decrypted yet or can't "
+ "be "
+ "decrypted.")
+ .toStdString();
+ else
+ dummy.content.body =
+ tr("-- Encrypted Event (Key not valid for this index) --",
+ "Placeholder, when the message can't be decrypted with this "
+ "key since it is not valid for this index ")
+ .toStdString();
nhlog::crypto()->info("Could not find inbound megolm session ({}, {}, {})",
index.room_id,
index.session_id,
|