From 994faf1012ae2f6f3c59990ed78a22da1bee7364 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sun, 21 Aug 2022 14:10:29 +0200 Subject: [PATCH] fix: Decrypt of last event might make an old message as last event We should only decrypt the last message in room if it is the current last message. By just fetching the state we might bring up an old encrypted message which is not really the last event. --- lib/encryption/key_manager.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/encryption/key_manager.dart b/lib/encryption/key_manager.dart index b41ac249..088a9253 100644 --- a/lib/encryption/key_manager.dart +++ b/lib/encryption/key_manager.dart @@ -183,9 +183,14 @@ class KeyManager { final room = client.getRoomById(roomId); if (room != null) { // attempt to decrypt the last event - final event = room.getState(EventTypes.Encrypted); - if (event != null && event.content['session_id'] == sessionId) { - room.setState(encryption.decryptRoomEventSync(roomId, event)); + final event = room.lastEvent; + if (event != null && + event.type == EventTypes.Encrypted && + event.content['session_id'] == sessionId) { + final decrypted = encryption.decryptRoomEventSync(roomId, event); + if (decrypted.type != EventTypes.Encrypted) { + room.setState(decrypted); + } } // and finally broadcast the new session room.onSessionKeyReceived.add(sessionId); @@ -887,7 +892,11 @@ class KeyManager { // we *received* an incoming key request final encryptedContent = event.encryptedContent; if (encryptedContent == null) { - return; // event wasn't encrypted, this is a security risk + Logs().w( + 'Ignoring an unencrypted forwarded key from a to device message', + event.toJson(), + ); + return; } final request = outgoingShareRequests.values.firstWhereOrNull((r) => r.room.id == event.content['room_id'] &&