Merge branch 'decrypt-enhance-implement-errors' into 'master'

[Room] Enhance decrypt error handling

See merge request famedly/famedlysdk!216
This commit is contained in:
Christian Pauly 2020-02-21 09:01:20 +00:00
commit 664f97b251

View file

@ -921,9 +921,10 @@ class Room {
if (this.encrypted && client.store != null) { if (this.encrypted && client.store != null) {
await client.store.transaction(() { await client.store.transaction(() {
for (int i = 0; i < events.length; i++) { for (int i = 0; i < events.length; i++) {
if (events[i].type == EventTypes.Encrypted) { if (events[i].type == EventTypes.Encrypted &&
events[i].content["body"] == DecryptError.UNKNOWN_SESSION) {
events[i] = events[i].decrypted; events[i] = events[i].decrypted;
if (events[i].type == EventTypes.Encrypted) { if (events[i].type != EventTypes.Encrypted) {
client.store.storeEventUpdate( client.store.storeEventUpdate(
EventUpdate( EventUpdate(
eventType: events[i].typeKey, eventType: events[i].typeKey,
@ -1531,14 +1532,14 @@ class Room {
Map<String, dynamic> decryptedPayload; Map<String, dynamic> decryptedPayload;
try { try {
if (!client.encryptionEnabled) { if (!client.encryptionEnabled) {
throw ("Encryption is not enabled in your client."); throw (DecryptError.NOT_ENABLED);
} }
if (event.content["algorithm"] != "m.megolm.v1.aes-sha2") { if (event.content["algorithm"] != "m.megolm.v1.aes-sha2") {
throw ("Unknown encryption algorithm."); throw (DecryptError.UNKNOWN_ALGORITHM);
} }
final String sessionId = event.content["session_id"]; final String sessionId = event.content["session_id"];
if (!sessionKeys.containsKey(sessionId)) { if (!sessionKeys.containsKey(sessionId)) {
throw ("The sender has not sent us the session key."); throw (DecryptError.UNKNOWN_SESSION);
} }
final olm.DecryptResult decryptResult = sessionKeys[sessionId] final olm.DecryptResult decryptResult = sessionKeys[sessionId]
.inboundGroupSession .inboundGroupSession
@ -1551,7 +1552,7 @@ class Room {
if ((_outboundGroupSession?.session_id() ?? "") == sessionId) { if ((_outboundGroupSession?.session_id() ?? "") == sessionId) {
clearOutboundGroupSession(); clearOutboundGroupSession();
} }
throw ("The secure channel with the sender was corrupted."); throw (DecryptError.CHANNEL_CORRUPTED);
} }
sessionKeys[sessionId].indexes[messageIndexKey] = sessionKeys[sessionId].indexes[messageIndexKey] =
decryptResult.message_index; decryptResult.message_index;
@ -1560,8 +1561,7 @@ class Room {
decryptedPayload = json.decode(decryptResult.plaintext); decryptedPayload = json.decode(decryptResult.plaintext);
} catch (exception) { } catch (exception) {
if (exception.toString() == if (exception.toString() == DecryptError.UNKNOWN_SESSION) {
"The sender has not sent us the session key.") {
decryptedPayload = { decryptedPayload = {
"content": event.content, "content": event.content,
"type": "m.room.encrypted", "type": "m.room.encrypted",
@ -1593,3 +1593,12 @@ class Room {
); );
} }
} }
abstract class DecryptError {
static const String NOT_ENABLED = "Encryption is not enabled in your client.";
static const String UNKNOWN_ALGORITHM = "Unknown encryption algorithm.";
static const String UNKNOWN_SESSION =
"The sender has not sent us the session key.";
static const String CHANNEL_CORRUPTED =
"The secure channel with the sender was corrupted.";
}