From 017a39c792616301b0cc1fd7b824c45ac68baa65 Mon Sep 17 00:00:00 2001 From: Krille Date: Wed, 18 Dec 2024 09:34:53 +0100 Subject: [PATCH] refactor: Use Event instead of EventUpdate for pending decryption event queue and for decrypt events in general This should removes an unnecessary step of json serialization and deserialization and should therefore improve performance. Gets rid of some unnecessary code as well. --- lib/encryption/encryption.dart | 10 ++++---- lib/src/client.dart | 45 ++++++++++++++++++--------------- lib/src/utils/event_update.dart | 26 ------------------- 3 files changed, 30 insertions(+), 51 deletions(-) diff --git a/lib/encryption/encryption.dart b/lib/encryption/encryption.dart index 7d6c03ff..d6003268 100644 --- a/lib/encryption/encryption.dart +++ b/lib/encryption/encryption.dart @@ -314,12 +314,12 @@ class Encryption { bool store = false, EventUpdateType updateType = EventUpdateType.timeline, }) async { - if (event.type != EventTypes.Encrypted || event.redacted) { - return event; - } - final content = event.parsedRoomEncryptedContent; - final sessionId = content.sessionId; try { + if (event.type != EventTypes.Encrypted || event.redacted) { + return event; + } + final content = event.parsedRoomEncryptedContent; + final sessionId = content.sessionId; if (client.database != null && sessionId != null && !(keyManager diff --git a/lib/src/client.dart b/lib/src/client.dart index 26fc444f..3958b107 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -2561,16 +2561,16 @@ class Client extends MatrixApi { if (room != null) { final List events = []; for (final event in _eventsPendingDecryption) { - if (event.event.roomID != roomId) continue; + if (event.event.room.id != roomId) continue; if (!sessionIds.contains( - event.event.content['content']?['session_id'], + event.event.content.tryGet('session_id'), )) { continue; } - final decryptedEvent = await event.event.decrypt(room); - if (decryptedEvent.content.tryGet('type') != - EventTypes.Encrypted) { + final decryptedEvent = + await encryption!.decryptRoomEvent(event.event); + if (decryptedEvent.type != EventTypes.Encrypted) { events.add(BasicEvent.fromJson(decryptedEvent.content)); } } @@ -2747,7 +2747,7 @@ class Client extends MatrixApi { // we collect them first before we handle them. final callEvents = []; - for (final event in events) { + for (var event in events) { // The client must ignore any new m.room.encryption event to prevent // man-in-the-middle attacks! if ((event.type == EventTypes.Encryption && @@ -2760,25 +2760,30 @@ class Client extends MatrixApi { continue; } - var update = - EventUpdate(roomID: room.id, type: type, content: event.toJson()); - if (event.type == EventTypes.Encrypted && encryptionEnabled) { - update = await update.decrypt(room); + if (event is MatrixEvent && + event.type == EventTypes.Encrypted && + encryptionEnabled) { + final decrypted = await encryption!.decryptRoomEvent( + Event.fromMatrixEvent(event, room), + updateType: type, + ); - // if the event failed to decrypt, add it to the queue - if (update.content.tryGet('type') == EventTypes.Encrypted) { + if (decrypted.type != EventTypes.Encrypted) { + event = decrypted; + } else { + // if the event failed to decrypt, add it to the queue _eventsPendingDecryption.add( - _EventPendingDecryption( - EventUpdate( - roomID: update.roomID, - type: EventUpdateType.decryptedTimelineQueue, - content: update.content, - ), - ), + _EventPendingDecryption(Event.fromMatrixEvent(event, room)), ); } } + final update = EventUpdate( + roomID: room.id, + type: type, + content: event.toJson(), + ); + // Any kind of member change? We should invalidate the profile then: if (event is StrippedStateEvent && event.type == EventTypes.RoomMember) { final userId = event.stateKey; @@ -3985,7 +3990,7 @@ class ArchivedRoom { class _EventPendingDecryption { DateTime addedAt = DateTime.now(); - EventUpdate event; + Event event; bool get timedOut => addedAt.add(Duration(minutes: 5)).isBefore(DateTime.now()); diff --git a/lib/src/utils/event_update.dart b/lib/src/utils/event_update.dart index f083748f..7d299517 100644 --- a/lib/src/utils/event_update.dart +++ b/lib/src/utils/event_update.dart @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import 'package:matrix/matrix.dart'; - enum EventUpdateType { /// Newly received events from /sync timeline, @@ -58,28 +56,4 @@ class EventUpdate { required this.type, required this.content, }); - - Future decrypt(Room room, {bool store = false}) async { - final encryption = room.client.encryption; - if (content['type'] != EventTypes.Encrypted || - !room.client.encryptionEnabled || - encryption == null) { - return this; - } - try { - final decrpytedEvent = await encryption.decryptRoomEvent( - Event.fromJson(content, room), - store: store, - updateType: type, - ); - return EventUpdate( - roomID: roomID, - type: type, - content: decrpytedEvent.toJson(), - ); - } catch (e, s) { - Logs().e('[LibOlm] Could not decrypt megolm event', e, s); - return this; - } - } }