decryptRoomEvent method
Future<Event>
decryptRoomEvent(
- Event event, {
- bool store = false,
- EventUpdateType updateType = EventUpdateType.timeline,
- bool waitForKeyBackupAndRetry = false,
Decrypts event if it is encrypted.
If the session is unknown, this by default fires off a key request in
the background and returns the undecryptable event right away. Pass
waitForKeyBackupAndRetry as true to instead await the online key backup
lookup and retry decryption once before returning.
Implementation
Future<Event> decryptRoomEvent(
Event event, {
bool store = false,
EventUpdateType updateType = EventUpdateType.timeline,
bool waitForKeyBackupAndRetry = false,
}) async {
try {
if (client.encryption == null ||
event.type != EventTypes.Encrypted ||
event.redacted) {
return event;
}
final content = event.parsedRoomEncryptedContent;
final sessionId = content.sessionId;
if (sessionId != null &&
!(keyManager
.getInboundGroupSession(event.room.id, sessionId)
?.isValid ??
false)) {
await keyManager.loadInboundGroupSession(event.room.id, sessionId);
}
final encryptedEvent = event;
event = decryptRoomEventSync(encryptedEvent);
if (event.canRequestSessionKey) {
await keyManager.maybeAutoRequest(
event.room,
sessionId!,
content.senderKey,
awaitRequest: waitForKeyBackupAndRetry,
);
if (waitForKeyBackupAndRetry) {
event = decryptRoomEventSync(encryptedEvent);
}
}
if (event.type != EventTypes.Encrypted && store) {
await client.database.storeEventUpdate(
event.room.id,
event,
updateType,
client,
);
}
return event;
} catch (e, s) {
Logs().e('[Decrypt] Could not decrpyt event', e, s);
return event;
}
}