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; - } - } }