diff --git a/lib/encryption/key_manager.dart b/lib/encryption/key_manager.dart index e2262627..16e8468b 100644 --- a/lib/encryption/key_manager.dart +++ b/lib/encryption/key_manager.dart @@ -190,20 +190,21 @@ class KeyManager { event.content['session_id'] == sessionId) { final decrypted = encryption.decryptRoomEventSync(roomId, event); if (decrypted.type != EventTypes.Encrypted) { + // Remove this from the state to make sure it does not appear as last event + room.states.remove(EventTypes.Encrypted); // Set the decrypted event as last event by adding it to the state - room.setState(decrypted); + room.states[decrypted.type] = {'': decrypted}; // Also store in database final database = client.database; if (database != null) { - await database.transaction(() async { - await database.storeEventUpdate( - EventUpdate( - roomID: room.id, - type: EventUpdateType.state, - content: decrypted.toJson(), - ), - client); - }); + await database.storeEventUpdate( + EventUpdate( + roomID: room.id, + type: EventUpdateType.state, + content: decrypted.toJson(), + ), + client, + ); } } } diff --git a/lib/src/client.dart b/lib/src/client.dart index 71e60283..3459d710 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -872,8 +872,11 @@ class Client extends MatrixApi { // Try to decrypt encrypted events but don't update the database. if (leftRoom.encrypted && leftRoom.client.encryptionEnabled) { if (timeline.events[i].type == EventTypes.Encrypted) { - timeline.events[i] = await leftRoom.client.encryption! - .decryptRoomEvent(leftRoom.id, timeline.events[i]); + timeline.events[i] = + await leftRoom.client.encryption!.decryptRoomEvent( + leftRoom.id, + timeline.events[i], + ); } } } diff --git a/lib/src/room.dart b/lib/src/room.dart index eb3de7da..cef98d89 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1322,7 +1322,10 @@ class Room { for (var i = 0; i < events.length; i++) { if (events[i].type == EventTypes.Encrypted && events[i].content['can_request_session'] == true) { - events[i] = await client.encryption!.decryptRoomEvent(id, events[i]); + events[i] = await client.encryption!.decryptRoomEvent( + id, + events[i], + ); } } } @@ -1414,8 +1417,11 @@ class Room { for (var i = 0; i < chunk.events.length; i++) { if (chunk.events[i].content['can_request_session'] == true) { chunk.events[i] = await client.encryption!.decryptRoomEvent( - id, chunk.events[i], - store: !isArchived); + id, + chunk.events[i], + store: !isArchived, + updateType: EventUpdateType.history, + ); } } }); @@ -1632,8 +1638,10 @@ class Room { final event = Event.fromMatrixEvent(matrixEvent, this); if (event.type == EventTypes.Encrypted && client.encryptionEnabled) { // attempt decryption - return await client.encryption - ?.decryptRoomEvent(id, event, store: false); + return await client.encryption?.decryptRoomEvent( + id, + event, + ); } return event; } on MatrixException catch (err) { diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index 18fa8b7c..b1318c3e 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -227,8 +227,10 @@ class Timeline { if (room.encrypted && room.client.encryptionEnabled) { for (var i = 0; i < newEvents.length; i++) { if (newEvents[i].type == EventTypes.Encrypted) { - newEvents[i] = await room.client.encryption! - .decryptRoomEvent(room.id, newEvents[i]); + newEvents[i] = await room.client.encryption!.decryptRoomEvent( + room.id, + newEvents[i], + ); } } } @@ -314,8 +316,12 @@ class Timeline { if (events[i].type == EventTypes.Encrypted && events[i].messageType == MessageTypes.BadEncrypted && events[i].content['session_id'] == sessionId) { - events[i] = await encryption.decryptRoomEvent(room.id, events[i], - store: true); + events[i] = await encryption.decryptRoomEvent( + room.id, + events[i], + store: true, + updateType: EventUpdateType.history, + ); onChange?.call(i); if (events[i].type != EventTypes.Encrypted) { decryptAtLeastOneEvent = true;