fix: Attempt event decryption on fetching replied events

This commit is contained in:
Sorunome 2021-02-02 12:10:37 +01:00
parent a6ee805367
commit 21a5854fbf
No known key found for this signature in database
GPG Key ID: B19471D07FC9BE9C
3 changed files with 104 additions and 17 deletions

View File

@ -1299,8 +1299,21 @@ class Room {
/// Searches for the event on the server. Returns null if not found. /// Searches for the event on the server. Returns null if not found.
Future<Event> getEventById(String eventID) async { Future<Event> getEventById(String eventID) async {
final matrixEvent = await client.requestEvent(id, eventID); try {
return Event.fromMatrixEvent(matrixEvent, this); final matrixEvent = await client.requestEvent(id, eventID);
final event = Event.fromMatrixEvent(matrixEvent, this);
if (event.type == EventTypes.Encrypted && client.encryptionEnabled) {
// attempt decryption
return await client.encryption
.decryptRoomEvent(id, event, store: false);
}
return event;
} on MatrixException catch (err) {
if (err.errcode == 'M_NOT_FOUND') {
return null;
}
rethrow;
}
} }
/// Returns the power level of the given user ID. /// Returns the power level of the given user ID.

View File

@ -83,7 +83,11 @@ class FakeMatrixApi extends MockClient {
if (api.containsKey(method) && api[method].containsKey(action)) { if (api.containsKey(method) && api[method].containsKey(action)) {
res = api[method][action](data); res = api[method][action](data);
if (res is Map && res.containsKey('errcode')) { if (res is Map && res.containsKey('errcode')) {
statusCode = 405; if (res['errcode'] == 'M_NOT_FOUND') {
statusCode = 404;
} else {
statusCode = 405;
}
} }
} else if (method == 'PUT' && } else if (method == 'PUT' &&
action.contains('/client/r0/sendToDevice/')) { action.contains('/client/r0/sendToDevice/')) {
@ -1283,6 +1287,41 @@ class FakeMatrixApi extends MockClient {
'origin_server_ts': 1432735824653, 'origin_server_ts': 1432735824653,
'unsigned': {'age': 1234} 'unsigned': {'age': 1234}
}, },
'/client/r0/rooms/!1234%3Aexample.com/event/not_found': (var req) => {
'errcode': 'M_NOT_FOUND',
'error': 'Event not found',
},
'/client/r0/rooms/!1234%3Aexample.com/event/unencrypted_event':
(var req) => {
'content': {
'body': 'This is an example text message',
'msgtype': 'm.text',
'format': 'org.matrix.custom.html',
'formatted_body': '<b>This is an example text message</b>'
},
'type': 'm.room.message',
'event_id': '143273582443PhrSn:example.org',
'room_id': '!localpart:server.abc',
'sender': '@example:example.org',
'origin_server_ts': 1432735824653,
'unsigned': {'age': 1234}
},
'/client/r0/rooms/!1234%3Aexample.com/event/encrypted_event': (var req) =>
{
'content': {
'algorithm': 'm.megolm.v1.aes-sha2',
'ciphertext': 'invalid',
'device_id': 'SOME_DEVICE',
'sender_key': 'invalid',
'session_id': 'not_found'
},
'type': 'm.room.encrypted',
'event_id': '143273582443PhrSn:example.org',
'room_id': '!localpart:server.abc',
'sender': '@example:example.org',
'origin_server_ts': 1432735824653,
'unsigned': {'age': 1234}
},
'/client/r0/rooms/!localpart%3Aserver.abc/messages?from=1234&dir=b&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D': '/client/r0/rooms/!localpart%3Aserver.abc/messages?from=1234&dir=b&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
(var req) => messagesResponse, (var req) => messagesResponse,
'/client/r0/rooms/!localpart%3Aserver.abc/messages?from=&dir=b&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D': '/client/r0/rooms/!localpart%3Aserver.abc/messages?from=&dir=b&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':

View File

@ -24,7 +24,8 @@ import 'package:famedlysdk/src/room.dart';
import 'package:famedlysdk/src/timeline.dart'; import 'package:famedlysdk/src/timeline.dart';
import 'package:famedlysdk/src/utils/event_update.dart'; import 'package:famedlysdk/src/utils/event_update.dart';
import 'package:famedlysdk/src/utils/room_update.dart'; import 'package:famedlysdk/src/utils/room_update.dart';
import 'fake_matrix_api.dart'; import 'package:olm/olm.dart' as olm;
import 'fake_client.dart';
void main() { void main() {
/// All Tests related to the MxContent /// All Tests related to the MxContent
@ -34,21 +35,35 @@ void main() {
final testTimeStamp = DateTime.now().millisecondsSinceEpoch; final testTimeStamp = DateTime.now().millisecondsSinceEpoch;
var updateCount = 0; var updateCount = 0;
var insertList = <int>[]; var insertList = <int>[];
var olmEnabled = true;
try {
olm.init();
olm.Account();
} catch (e) {
olmEnabled = false;
Logs().w('[LibOlm] Failed to load LibOlm', e);
}
Logs().i('[LibOlm] Enabled: $olmEnabled');
var client = Client('testclient', Client client;
httpClient: FakeMatrixApi(), sendMessageTimeoutSeconds: 5); Room room;
Timeline timeline;
test('create stuff', () async {
client = await getClient();
client.sendMessageTimeoutSeconds = 5;
var room = Room( room = Room(
id: roomID, client: client, prev_batch: '1234', roomAccountData: {}); id: roomID, client: client, prev_batch: '1234', roomAccountData: {});
var timeline = Timeline( timeline = Timeline(
room: room, room: room,
events: [], events: [],
onUpdate: () { onUpdate: () {
updateCount++; updateCount++;
}, },
onInsert: (int insertID) { onInsert: (int insertID) {
insertList.add(insertID); insertList.add(insertID);
}); });
});
test('Create', () async { test('Create', () async {
await client.checkHomeserver('https://fakeserver.notexisting', await client.checkHomeserver('https://fakeserver.notexisting',
@ -221,6 +236,23 @@ void main() {
expect(timeline.events[0].status, -1); expect(timeline.events[0].status, -1);
}); });
test('getEventById', () async {
var event = await timeline.getEventById('abc');
expect(event.content, {'msgtype': 'm.text', 'body': 'Testcase'});
event = await timeline.getEventById('not_found');
expect(event, null);
event = await timeline.getEventById('unencrypted_event');
expect(event.body, 'This is an example text message');
if (olmEnabled) {
event = await timeline.getEventById('encrypted_event');
// the event is invalid but should have traces of attempting to decrypt
expect(event.messageType, MessageTypes.BadEncrypted);
}
});
test('Resend message', () async { test('Resend message', () async {
timeline.events.clear(); timeline.events.clear();
client.onEvent.add(EventUpdate( client.onEvent.add(EventUpdate(
@ -565,5 +597,8 @@ void main() {
expect(timeline.events[0].status, 2); expect(timeline.events[0].status, 2);
expect(timeline.events.length, 1); expect(timeline.events.length, 1);
}); });
test('logout', () async {
await client.logout();
});
}); });
} }