Handle olm & lmdb exceptions during message decryption

fixes #345
This commit is contained in:
Konstantinos Sideris 2018-06-19 22:53:22 +03:00
parent 7ecabcd614
commit 961c880d55
2 changed files with 41 additions and 13 deletions

View file

@ -14,7 +14,7 @@ feels more like a mainstream chat app ([Riot], Telegram etc) and less like an IR
Most of the features you would expect from a chat application are missing right now Most of the features you would expect from a chat application are missing right now
but we are getting close to a more feature complete client. but we are getting close to a more feature complete client.
Specifically there is support for: Specifically there is support for:
- E2EE encryption. - E2E encryption.
- User registration. - User registration.
- Creating, joining & leaving rooms. - Creating, joining & leaving rooms.
- Sending & receiving invites. - Sending & receiving invites.

View file

@ -297,25 +297,50 @@ TimelineView::parseEncryptedEvent(const mtx::events::EncryptedEvent<mtx::events:
index.session_id = e.content.session_id; index.session_id = e.content.session_id;
index.sender_key = e.content.sender_key; index.sender_key = e.content.sender_key;
mtx::events::RoomEvent<mtx::events::msg::Text> dummy; mtx::events::RoomEvent<mtx::events::msg::Notice> dummy;
dummy.origin_server_ts = e.origin_server_ts; dummy.origin_server_ts = e.origin_server_ts;
dummy.event_id = e.event_id; dummy.event_id = e.event_id;
dummy.sender = e.sender; dummy.sender = e.sender;
dummy.content.body = "-- Encrypted Event (No keys found for decryption) --"; dummy.content.body = "-- Encrypted Event (No keys found for decryption) --";
if (!cache::client()->inboundMegolmSessionExists(index)) { try {
nhlog::crypto()->info("Could not find inbound megolm session ({}, {}, {})", if (!cache::client()->inboundMegolmSessionExists(index)) {
index.room_id, nhlog::crypto()->info("Could not find inbound megolm session ({}, {}, {})",
index.session_id, index.room_id,
e.sender); index.session_id,
// TODO: request megolm session_id & session_key from the sender. e.sender);
// TODO: request megolm session_id & session_key from the sender.
return dummy;
}
} catch (const lmdb::error &e) {
nhlog::db()->critical("failed to check megolm session's existence: {}", e.what());
dummy.content.body = "-- Decryption Error (failed to communicate with DB) --";
return dummy; return dummy;
} }
auto session = cache::client()->getInboundMegolmSession(index); std::string msg_str;
auto res = olm::client()->decrypt_group_message(session, e.content.ciphertext); try {
auto session = cache::client()->getInboundMegolmSession(index);
const auto msg_str = std::string((char *)res.data.data(), res.data.size()); auto res = olm::client()->decrypt_group_message(session, e.content.ciphertext);
msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) {
nhlog::db()->critical("failed to retrieve megolm session with index ({}, {}, {})",
index.room_id,
index.session_id,
index.sender_key,
e.what());
dummy.content.body =
"-- Decryption Error (failed to retrieve megolm keys from db) --";
return dummy;
} catch (const mtx::crypto::olm_exception &e) {
nhlog::crypto()->critical("failed to decrypt message with index ({}, {}, {}): {}",
index.room_id,
index.session_id,
index.sender_key,
e.what());
dummy.content.body = "-- Decryption Error (" + std::string(e.what()) + ") --";
return dummy;
}
// Add missing fields for the event. // Add missing fields for the event.
json body = json::parse(msg_str); json body = json::parse(msg_str);
@ -1301,10 +1326,13 @@ TimelineView::prepareEncryptedMessage(const PendingMessage &msg)
} }
}); });
// TODO: Let the user know about the errors.
} catch (const lmdb::error &e) { } catch (const lmdb::error &e) {
nhlog::db()->critical( nhlog::db()->critical(
"failed to open outbound megolm session ({}): {}", room_id, e.what()); "failed to open outbound megolm session ({}): {}", room_id, e.what());
return; } catch (const mtx::crypto::olm_exception &e) {
nhlog::crypto()->critical(
"failed to open outbound megolm session ({}): {}", room_id, e.what());
} }
} }