From fce77052430f4ec65ae14bb1b02bdfebe86b3271 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Fri, 8 Jan 2021 09:54:11 +0100 Subject: [PATCH] feat: Implement room key request parsing --- lib/matrix_api_lite.dart | 1 + .../events/room_key_request_content.dart | 58 +++++++++++++++++++ test/event_content_test.dart | 28 +++++++++ 3 files changed, 87 insertions(+) create mode 100644 lib/src/model/events/room_key_request_content.dart diff --git a/lib/matrix_api_lite.dart b/lib/matrix_api_lite.dart index 407c8b2f..440ba497 100644 --- a/lib/matrix_api_lite.dart +++ b/lib/matrix_api_lite.dart @@ -82,6 +82,7 @@ export 'src/model/auth/authentication_user_identifier.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'; +export 'src/model/events/room_key_request_content.dart'; export 'src/model/events/secret_storage_default_key_content.dart'; export 'src/model/events/secret_storage_key_content.dart'; export 'src/model/events/tombstone_content.dart'; diff --git a/lib/src/model/events/room_key_request_content.dart b/lib/src/model/events/room_key_request_content.dart new file mode 100644 index 00000000..2c5bac13 --- /dev/null +++ b/lib/src/model/events/room_key_request_content.dart @@ -0,0 +1,58 @@ +import '../basic_event.dart'; +import '../../utils/try_get_map_extension.dart'; + +extension RoomKeyRequestContentBasicEventExtension on BasicEvent { + RoomKeyRequestContent get parsedRoomKeyRequestContent => + RoomKeyRequestContent.fromJson(content); +} + +class RoomKeyRequestContent { + RequestedKeyInfo body; + String action; + String requestingDeviceId; + String requestId; + + RoomKeyRequestContent.fromJson(Map json) + : body = RequestedKeyInfo.fromJson( + json.tryGet>('body')), + action = json.tryGet('action', ''), + requestingDeviceId = json.tryGet('requesting_device_id', ''), + requestId = json.tryGet('request_id', ''); + + Map toJson() { + final data = {}; + if (body != null) data['body'] = body.toJson(); + data['action'] = action; + data['requesting_device_id'] = requestingDeviceId; + data['request_id'] = requestId; + return data; + } +} + +class RequestedKeyInfo { + String algorithm; + String roomId; + String sessionId; + String senderKey; + + RequestedKeyInfo(); + + factory RequestedKeyInfo.fromJson(Map json) { + if (json == null) return null; + final requestKeyInfo = RequestedKeyInfo(); + requestKeyInfo.algorithm = json.tryGet('algorithm', ''); + requestKeyInfo.roomId = json.tryGet('room_id', ''); + requestKeyInfo.sessionId = json.tryGet('session_id', ''); + requestKeyInfo.senderKey = json.tryGet('sender_key', ''); + return requestKeyInfo; + } + + Map toJson() { + final data = {}; + data['algorithm'] = algorithm; + data['room_id'] = roomId; + data['session_id'] = sessionId; + data['sender_key'] = senderKey; + return data; + } +} diff --git a/test/event_content_test.dart b/test/event_content_test.dart index c4ab99e2..80eb2232 100644 --- a/test/event_content_test.dart +++ b/test/event_content_test.dart @@ -91,5 +91,33 @@ void main() { expect(BasicEvent.fromJson(json).parsedRoomKeyContent.toJson(), json['content']); }); + test('Room Key Request Content', () { + var json = { + 'content': { + 'action': 'request_cancellation', + 'request_id': '1495474790150.19', + 'requesting_device_id': 'RJYKSTBOIE' + }, + 'type': 'm.room_key_request' + }; + expect(BasicEvent.fromJson(json).parsedRoomKeyRequestContent.toJson(), + json['content']); + json = { + 'content': { + 'action': 'request', + 'body': { + 'algorithm': 'm.megolm.v1.aes-sha2', + 'room_id': '!Cuyf34gef24t:localhost', + 'sender_key': 'RF3s+E7RkTQTGF2d8Deol0FkQvgII2aJDf3/Jp5mxVU', + 'session_id': 'X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ' + }, + 'request_id': '1495474790150.19', + 'requesting_device_id': 'RJYKSTBOIE' + }, + 'type': 'm.room_key_request' + }; + expect(BasicEvent.fromJson(json).parsedRoomKeyRequestContent.toJson(), + json['content']); + }); }); }