feat: Better guard against failed lookups
This commit is contained in:
@@ -44,3 +44,11 @@ class InvalidKeyExchangeException extends OmemoException implements Exception {
|
||||
class MessageAlreadyDecryptedException extends OmemoException implements Exception {
|
||||
String errMsg() => 'The message has already been decrypted';
|
||||
}
|
||||
|
||||
/// Triggered by the OmemoManager when we could not encrypt a message as we have
|
||||
/// no key material available. That happens, for example, when we want to create a
|
||||
/// ratchet session with a JID we had no session with but fetching the device bundle
|
||||
/// failed.
|
||||
class NoKeyMaterialAvailableException extends OmemoException implements Exception {
|
||||
String errMsg() => 'No key material available to create a ratchet session with';
|
||||
}
|
||||
|
||||
@@ -1,14 +1,26 @@
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:omemo_dart/src/errors.dart';
|
||||
import 'package:omemo_dart/src/omemo/encrypted_key.dart';
|
||||
import 'package:omemo_dart/src/omemo/ratchet_map_key.dart';
|
||||
|
||||
@immutable
|
||||
class EncryptionResult {
|
||||
const EncryptionResult(this.ciphertext, this.encryptedKeys);
|
||||
const EncryptionResult(this.ciphertext, this.encryptedKeys, this.deviceEncryptionErrors, this.jidEncryptionErrors);
|
||||
|
||||
/// The actual message that was encrypted
|
||||
/// The actual message that was encrypted.
|
||||
final List<int>? ciphertext;
|
||||
|
||||
|
||||
/// Mapping of the device Id to the key for decrypting ciphertext, encrypted
|
||||
/// for the ratchet with said device Id
|
||||
/// for the ratchet with said device Id.
|
||||
final List<EncryptedKey> encryptedKeys;
|
||||
|
||||
/// Mapping of a ratchet map keys to a possible exception.
|
||||
final Map<RatchetMapKey, OmemoException> deviceEncryptionErrors;
|
||||
|
||||
/// Mapping of a JID to a possible exception.
|
||||
final Map<String, OmemoException> jidEncryptionErrors;
|
||||
|
||||
/// True if the encryption was a success. This means that we could encrypt for
|
||||
/// at least one ratchet.
|
||||
bool isSuccess(int numberOfRecipients) => encryptedKeys.isNotEmpty && jidEncryptionErrors.length < numberOfRecipients;
|
||||
}
|
||||
|
||||
@@ -447,8 +447,17 @@ class OmemoManager {
|
||||
}
|
||||
|
||||
// We assume that the user already checked if the session exists
|
||||
final deviceEncryptionErrors = <RatchetMapKey, OmemoException>{};
|
||||
final jidEncryptionErrors = <String, OmemoException>{};
|
||||
for (final jid in jids) {
|
||||
for (final deviceId in _deviceList[jid]!) {
|
||||
final devices = _deviceList[jid];
|
||||
if (devices == null) {
|
||||
_log.severe('Device list does not exist for $jid.');
|
||||
jidEncryptionErrors[jid] = NoKeyMaterialAvailableException();
|
||||
continue;
|
||||
}
|
||||
|
||||
for (final deviceId in devices) {
|
||||
// Empty OMEMO messages are allowed to bypass trust
|
||||
if (plaintext != null) {
|
||||
// Only encrypt to devices that are trusted
|
||||
@@ -459,7 +468,13 @@ class OmemoManager {
|
||||
}
|
||||
|
||||
final ratchetKey = RatchetMapKey(jid, deviceId);
|
||||
var ratchet = _ratchetMap[ratchetKey]!;
|
||||
var ratchet = _ratchetMap[ratchetKey];
|
||||
if (ratchet == null) {
|
||||
_log.severe('Ratchet ${ratchetKey.toJsonKey()} does not exist.');
|
||||
deviceEncryptionErrors[ratchetKey] = NoKeyMaterialAvailableException();
|
||||
continue;
|
||||
}
|
||||
|
||||
final ciphertext = (await ratchet.ratchetEncrypt(keyPayload)).ciphertext;
|
||||
|
||||
if (kex.isNotEmpty && kex.containsKey(deviceId)) {
|
||||
@@ -522,8 +537,11 @@ class OmemoManager {
|
||||
}
|
||||
|
||||
return EncryptionResult(
|
||||
plaintext != null ? ciphertext : null,
|
||||
plaintext != null ?
|
||||
ciphertext : null,
|
||||
encryptedKeys,
|
||||
deviceEncryptionErrors,
|
||||
jidEncryptionErrors,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -329,6 +329,8 @@ class OmemoSessionManager {
|
||||
return EncryptionResult(
|
||||
plaintext != null ? ciphertext : null,
|
||||
encryptedKeys,
|
||||
const <RatchetMapKey, OmemoException>{},
|
||||
const <String, OmemoException>{},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user