diff --git a/lib/matrix_api_lite.dart b/lib/matrix_api_lite.dart index d9d91fa0..1a57a8b7 100644 --- a/lib/matrix_api_lite.dart +++ b/lib/matrix_api_lite.dart @@ -80,6 +80,7 @@ export 'src/model/auth/authentication_token.dart'; export 'src/model/auth/authentication_types.dart'; export 'src/model/auth/authentication_user_identifier.dart'; export 'src/model/events/forwarded_room_key_content.dart'; +export 'src/model/events/olm_plaintext_payload.dart'; export 'src/model/events/room_encrypted_content.dart'; export 'src/model/events/room_encryption_content.dart'; export 'src/model/events/room_key_content.dart'; diff --git a/lib/src/model/events/olm_plaintext_payload.dart b/lib/src/model/events/olm_plaintext_payload.dart new file mode 100644 index 00000000..fbd46c5c --- /dev/null +++ b/lib/src/model/events/olm_plaintext_payload.dart @@ -0,0 +1,40 @@ +import '../../utils/try_get_map_extension.dart'; + +class OlmPlaintextPayload { + String type; + Map content; + String sender; + String recipient; + Map recipientKeys; + Map keys; + + OlmPlaintextPayload({ + this.type, + this.content, + this.sender, + this.recipient, + this.recipientKeys, + this.keys, + }) : super(); + + factory OlmPlaintextPayload.fromJson(Map json) => + OlmPlaintextPayload( + sender: json.tryGet('sender'), + type: json.tryGet('type'), + content: json.tryGetMap('content'), + recipient: json.tryGet('recipient'), + recipientKeys: json.tryGetMap('recipient_keys'), + keys: json.tryGetMap('keys'), + ); + + Map toJson() { + final data = {}; + if (type != null) data['type'] = type; + if (sender != null) data['sender'] = sender; + if (content != null) data['content'] = content; + if (recipient != null) data['recipient'] = recipient; + if (recipientKeys != null) data['recipient_keys'] = recipientKeys; + if (keys != null) data['keys'] = keys; + return data; + } +} diff --git a/lib/src/utils/try_get_map_extension.dart b/lib/src/utils/try_get_map_extension.dart index bc7a926b..46db4943 100644 --- a/lib/src/utils/try_get_map_extension.dart +++ b/lib/src/utils/try_get_map_extension.dart @@ -20,7 +20,7 @@ extension TryGetMapExtension on Map { final value = this[key]; if (value != null && !(value is List)) { Logs().w( - 'Expected "${T.runtimeType}" in event content for the key "$key" but got "${value.runtimeType}".'); + 'Expected "List<${T.runtimeType}>" in event content for the key "$key" but got "${value.runtimeType}".'); return fallbackValue; } if (value == null && fallbackValue != null) { @@ -29,10 +29,31 @@ extension TryGetMapExtension on Map { return fallbackValue; } try { - return List.from(value as List); + return List.from(value); } catch (_) { Logs().w( - 'Unable to create List<${T.runtimeType}> in event content for the key "$key'); + 'Unable to create "List<${T.runtimeType}>" in event content for the key "$key"'); + return fallbackValue; + } + } + + Map tryGetMap(String key, [Map fallbackValue]) { + final value = this[key]; + if (value != null && !(value is Map)) { + Logs().w( + 'Expected "Map<${A.runtimeType},${B.runtimeType}>" in event content for the key "$key" but got "${value.runtimeType}".'); + return fallbackValue; + } + if (value == null && fallbackValue != null) { + Logs().w( + 'Required field in event content for the key "$key" is null. Set to "$fallbackValue".'); + return fallbackValue; + } + try { + return Map.from(value); + } catch (_) { + Logs().w( + 'Unable to create "Map<${A.runtimeType},${B.runtimeType}>" in event content for the key "$key"'); return fallbackValue; } } diff --git a/test/event_content_test.dart b/test/event_content_test.dart index a9ef3e47..95fb274e 100644 --- a/test/event_content_test.dart +++ b/test/event_content_test.dart @@ -146,5 +146,20 @@ void main() { expect(BasicEvent.fromJson(json).parsedForwardedRoomKeyContent.toJson(), json['content']); }); + test('OLM Plaintext Payload', () { + var json = { + 'type': '', + 'content': { + 'msgtype': 'm.text', + 'body': 'Hello world', + }, + 'sender': '', + 'recipient': '', + 'recipient_keys': {'ed25519': ''}, + 'keys': {'ed25519': ''} + }; + json = jsonDecode(jsonEncode(json)); + expect(OlmPlaintextPayload.fromJson(json).toJson(), json); + }); }); }