diff options
| author | Marvin W <git@larma.de> | 2026-10-23 16:46:01 +0200 |
|---|---|---|
| committer | Marvin W <git@larma.de> | 2026-10-23 17:01:44 +0200 |
| commit | 5bf8b829b7f7f2fb6e2b920eed8eace6a801157c (patch) | |
| tree | b6a4ce6ca29c9ce96dd4547b825436f20e83a793 /main/src/plugins/omemo/logic/pre_key_store.vala | |
| parent | 2eb311938665f92ef48e2cfa030720fc68ca7cc9 (diff) | |
omemo: Hand direct database access to libomemo
Previously used an in-memory map to represent the database content and kept those in sync
Diffstat (limited to 'main/src/plugins/omemo/logic/pre_key_store.vala')
| -rw-r--r-- | main/src/plugins/omemo/logic/pre_key_store.vala | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/main/src/plugins/omemo/logic/pre_key_store.vala b/main/src/plugins/omemo/logic/pre_key_store.vala index 968ec119..97e27858 100644 --- a/main/src/plugins/omemo/logic/pre_key_store.vala +++ b/main/src/plugins/omemo/logic/pre_key_store.vala @@ -4,41 +4,43 @@ using Omemo; namespace Dino.Plugins.Omemo { -private class BackedPreKeyStore : SimplePreKeyStore { +private class BackedPreKeyStore : PreKeyStore { private Database db; private int identity_id; public BackedPreKeyStore(Database db, int identity_id) { this.db = db; this.identity_id = identity_id; - init(); } - private void init() { - try { - foreach (Row row in db.pre_key.select().with(db.pre_key.identity_id, "=", identity_id)) { - store_pre_key(row[db.pre_key.pre_key_id], Base64.decode(row[db.pre_key.record_base64])); - } - } catch (Error e) { - warning("Error while initializing pre key store: %s", e.message); - } - - pre_key_stored.connect(on_pre_key_stored); - pre_key_deleted.connect(on_pre_key_deleted); + public override uint8[]? load_pre_key(uint32 pre_key_id) throws Crypto.Error { + RowOption row = db.pre_key.select({db.pre_key.record_base64}) + .with(db.pre_key.identity_id, "=", identity_id) + .with(db.pre_key.pre_key_id, "=", (int) pre_key_id) + .single().row(); + if (!row.is_present()) return null; + return Base64.decode(row[db.pre_key.record_base64]); } - public void on_pre_key_stored(PreKeyStore.Key key) { + public override void store_pre_key(uint32 pre_key_id, uint8[] record) throws Crypto.Error { db.pre_key.upsert() .value(db.pre_key.identity_id, identity_id, true) - .value(db.pre_key.pre_key_id, (int) key.key_id, true) - .value(db.pre_key.record_base64, Base64.encode(key.record)) + .value(db.pre_key.pre_key_id, (int) pre_key_id, true) + .value(db.pre_key.record_base64, Base64.encode(record)) .perform(); } - public void on_pre_key_deleted(PreKeyStore.Key key) { + public override bool contains_pre_key(uint32 pre_key_id) throws Crypto.Error { + return db.pre_key.select({db.pre_key.pre_key_id}) + .with(db.pre_key.identity_id, "=", identity_id) + .with(db.pre_key.pre_key_id, "=", (int) pre_key_id) + .count() > 0; + } + + public override void delete_pre_key(uint32 pre_key_id) throws Crypto.Error { db.pre_key.delete() .with(db.pre_key.identity_id, "=", identity_id) - .with(db.pre_key.pre_key_id, "=", (int) key.key_id) + .with(db.pre_key.pre_key_id, "=", (int) pre_key_id) .perform(); } } |
