diff --git a/README.md b/README.md index 38631fd..3321c9c 100644 --- a/README.md +++ b/README.md @@ -28,22 +28,25 @@ Include `omemo_dart` in your `pubspec.yaml` like this: dependencies: omemo_dart: hosted: https://git.polynom.me/api/packages/PapaTutuWawa/pub - version: ^0.4.3 + version: ^0.5.0 # [...] # [...] ``` -## Contributing +### Persistence -Due to issues with `protobuf`, `omemo_dart` reimplements the Protobuf encoding for the required -OMEMO messages. As such, `protobuf` is only a dependency for testing that the serialisation and -deserialisation of the custom implementation. In order to run tests, you need the Protbuf -compiler. After that, making sure that -the [Dart Protobuf compiler addon](https://pub.dev/packages/protoc_plugin) and the -Protobuf compiler itself is in your PATH, -run `protoc -I=./protobuf/ --dart_out=lib/protobuf/ ./protobuf/schema.proto` in the -repository's root to generate the real Protobuf bindings. +By default, `omemo_dart` uses in-memory implementations for everything. For a real-world application, this is unsuitable as OMEMO devices would be constantly added. +In order to allow persistence, your application needs to keep track of the following mappings: + +- `JID -> [int]`: The device list for each JID +- `(JID, device) -> Ratchet`: The actual ratchet + +If you also use the `BlindTrustBeforeVerificationTrustManager`, you additionally need to keep track of: + +- `(JID, device) -> (int, bool)`: The trust level and the enablement state + +## Contributing When submitting a PR, please run the linter using `dart analyze` and make sure that all tests still pass using `dart test`. diff --git a/lib/src/helpers.dart b/lib/src/helpers.dart index 287010f..bbf2cbd 100644 --- a/lib/src/helpers.dart +++ b/lib/src/helpers.dart @@ -86,9 +86,13 @@ extension BeforeAfterListDiff on List { extension AppendToListOrCreateExtension on Map> { /// Create or append [value] to the list identified with key [key]. - void appendOrCreate(K key, V value) { + void appendOrCreate(K key, V value, {bool checkExistence = false}) { if (containsKey(key)) { - this[key]!.add(value); + if (!checkExistence) { + this[key]!.add(value); + } if (!this[key]!.contains(value)) { + this[key]!.add(value); + } } else { this[key] = [value]; } diff --git a/lib/src/trust/btbv.dart b/lib/src/trust/btbv.dart index 4eb1365..5a04ab8 100644 --- a/lib/src/trust/btbv.dart +++ b/lib/src/trust/btbv.dart @@ -132,11 +132,8 @@ class BlindTrustBeforeVerificationTrustManager extends TrustManager { enablementCache[key] = true; } - if (devices.containsKey(jid)) { - devices[jid]!.add(deviceId); - } else { - devices[jid] = List.from([deviceId]); - } + // Append to the device list + devices.appendOrCreate(jid, deviceId, checkExistence: true); // Commit the state await commit( @@ -227,7 +224,7 @@ class BlindTrustBeforeVerificationTrustManager extends TrustManager { final key = RatchetMapKey(jid, result.device); trustCache[key] = result.state; enablementCache[key] = result.enabled; - devices.appendOrCreate(jid, result.device); + devices.appendOrCreate(jid, result.device, checkExistence: true); } }