From 34b9cc0dcf11e2e2981489c5d077b4bcbf840abc Mon Sep 17 00:00:00 2001 From: Marcus Hoffmann Date: Thu, 1 Jul 2021 17:15:06 +0200 Subject: [PATCH] filter out invalid CiphertextInfo instead of crashing --- .../model/events/room_encrypted_content.dart | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/src/model/events/room_encrypted_content.dart b/lib/src/model/events/room_encrypted_content.dart index e062f77f..e124d3ca 100644 --- a/lib/src/model/events/room_encrypted_content.dart +++ b/lib/src/model/events/room_encrypted_content.dart @@ -31,6 +31,14 @@ extension RoomEncryptedContentBasicEventExtension on BasicEvent { RoomEncryptedContent.fromJson(content); } +/// Convert Nullable iterable of MapEntries to Map +extension ToMap on Iterable>? { + Map? toMap() { + final that = this; + return that != null ? Map.fromEntries(that) : null; + } +} + class RoomEncryptedContent { String algorithm; String senderKey; @@ -45,9 +53,19 @@ class RoomEncryptedContent { deviceId = json.tryGet('device_id'), sessionId = json.tryGet('session_id'), ciphertextMegolm = json.tryGet('ciphertext'), + // filter out invalid/incomplete CiphertextInfos ciphertextOlm = json .tryGet>('ciphertext') - ?.map((k, v) => MapEntry(k, CiphertextInfo.fromJson(v))); + ?.entries + .map((e) { + try { + return MapEntry(e.key, CiphertextInfo.fromJson(e.value)); + } catch (_) { + return null; + } + }) + .whereType>() + .toMap(); Map toJson() { final data = {};