fix: Last message set incorrectly on all session key received

This fixes a bug that the
last message was sent
incorrectly when a session
key received for example
from the key backup. It may
fix several issues like the
last message is set as a
very old one or the last
message is not decrypted.
This commit is contained in:
Krille 2023-01-18 08:56:34 +01:00
parent 3fb134dfb2
commit 05c945b042
4 changed files with 39 additions and 21 deletions

View File

@ -190,20 +190,21 @@ class KeyManager {
event.content['session_id'] == sessionId) { event.content['session_id'] == sessionId) {
final decrypted = encryption.decryptRoomEventSync(roomId, event); final decrypted = encryption.decryptRoomEventSync(roomId, event);
if (decrypted.type != EventTypes.Encrypted) { if (decrypted.type != EventTypes.Encrypted) {
// Remove this from the state to make sure it does not appear as last event
room.states.remove(EventTypes.Encrypted);
// Set the decrypted event as last event by adding it to the state // Set the decrypted event as last event by adding it to the state
room.setState(decrypted); room.states[decrypted.type] = {'': decrypted};
// Also store in database // Also store in database
final database = client.database; final database = client.database;
if (database != null) { if (database != null) {
await database.transaction(() async {
await database.storeEventUpdate( await database.storeEventUpdate(
EventUpdate( EventUpdate(
roomID: room.id, roomID: room.id,
type: EventUpdateType.state, type: EventUpdateType.state,
content: decrypted.toJson(), content: decrypted.toJson(),
), ),
client); client,
}); );
} }
} }
} }

View File

@ -872,8 +872,11 @@ class Client extends MatrixApi {
// Try to decrypt encrypted events but don't update the database. // Try to decrypt encrypted events but don't update the database.
if (leftRoom.encrypted && leftRoom.client.encryptionEnabled) { if (leftRoom.encrypted && leftRoom.client.encryptionEnabled) {
if (timeline.events[i].type == EventTypes.Encrypted) { if (timeline.events[i].type == EventTypes.Encrypted) {
timeline.events[i] = await leftRoom.client.encryption! timeline.events[i] =
.decryptRoomEvent(leftRoom.id, timeline.events[i]); await leftRoom.client.encryption!.decryptRoomEvent(
leftRoom.id,
timeline.events[i],
);
} }
} }
} }

View File

@ -1322,7 +1322,10 @@ class Room {
for (var i = 0; i < events.length; i++) { for (var i = 0; i < events.length; i++) {
if (events[i].type == EventTypes.Encrypted && if (events[i].type == EventTypes.Encrypted &&
events[i].content['can_request_session'] == true) { events[i].content['can_request_session'] == true) {
events[i] = await client.encryption!.decryptRoomEvent(id, events[i]); events[i] = await client.encryption!.decryptRoomEvent(
id,
events[i],
);
} }
} }
} }
@ -1414,8 +1417,11 @@ class Room {
for (var i = 0; i < chunk.events.length; i++) { for (var i = 0; i < chunk.events.length; i++) {
if (chunk.events[i].content['can_request_session'] == true) { if (chunk.events[i].content['can_request_session'] == true) {
chunk.events[i] = await client.encryption!.decryptRoomEvent( chunk.events[i] = await client.encryption!.decryptRoomEvent(
id, chunk.events[i], id,
store: !isArchived); chunk.events[i],
store: !isArchived,
updateType: EventUpdateType.history,
);
} }
} }
}); });
@ -1632,8 +1638,10 @@ class Room {
final event = Event.fromMatrixEvent(matrixEvent, this); final event = Event.fromMatrixEvent(matrixEvent, this);
if (event.type == EventTypes.Encrypted && client.encryptionEnabled) { if (event.type == EventTypes.Encrypted && client.encryptionEnabled) {
// attempt decryption // attempt decryption
return await client.encryption return await client.encryption?.decryptRoomEvent(
?.decryptRoomEvent(id, event, store: false); id,
event,
);
} }
return event; return event;
} on MatrixException catch (err) { } on MatrixException catch (err) {

View File

@ -227,8 +227,10 @@ class Timeline {
if (room.encrypted && room.client.encryptionEnabled) { if (room.encrypted && room.client.encryptionEnabled) {
for (var i = 0; i < newEvents.length; i++) { for (var i = 0; i < newEvents.length; i++) {
if (newEvents[i].type == EventTypes.Encrypted) { if (newEvents[i].type == EventTypes.Encrypted) {
newEvents[i] = await room.client.encryption! newEvents[i] = await room.client.encryption!.decryptRoomEvent(
.decryptRoomEvent(room.id, newEvents[i]); room.id,
newEvents[i],
);
} }
} }
} }
@ -314,8 +316,12 @@ class Timeline {
if (events[i].type == EventTypes.Encrypted && if (events[i].type == EventTypes.Encrypted &&
events[i].messageType == MessageTypes.BadEncrypted && events[i].messageType == MessageTypes.BadEncrypted &&
events[i].content['session_id'] == sessionId) { events[i].content['session_id'] == sessionId) {
events[i] = await encryption.decryptRoomEvent(room.id, events[i], events[i] = await encryption.decryptRoomEvent(
store: true); room.id,
events[i],
store: true,
updateType: EventUpdateType.history,
);
onChange?.call(i); onChange?.call(i);
if (events[i].type != EventTypes.Encrypted) { if (events[i].type != EventTypes.Encrypted) {
decryptAtLeastOneEvent = true; decryptAtLeastOneEvent = true;