diff options
Diffstat (limited to 'main/src/plugins/omemo/logic/session_store.vala')
| -rw-r--r-- | main/src/plugins/omemo/logic/session_store.vala | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/main/src/plugins/omemo/logic/session_store.vala b/main/src/plugins/omemo/logic/session_store.vala new file mode 100644 index 00000000..883e1caa --- /dev/null +++ b/main/src/plugins/omemo/logic/session_store.vala @@ -0,0 +1,69 @@ +using Dino.Crypto.Omemo; +using Dino.Qlite; +using Omemo; + +namespace Dino.Plugins.Omemo { + +private class BackedSessionStore : SessionStore { + private Database db; + private int identity_id; + + public BackedSessionStore(Database db, int identity_id) { + this.db = db; + this.identity_id = identity_id; + } + + public override uint8[]? load_session(Address address) throws Crypto.Error { + RowOption row = db.session.select({db.session.record_base64}) + .with(db.session.identity_id, "=", identity_id) + .with(db.session.address_name, "=", address.name) + .with(db.session.device_id, "=", address.device_id) + .single().row(); + if (!row.is_present()) return null; + return Base64.decode(row[db.session.record_base64]); + } + + public override IntList get_sub_device_sessions(string name) throws Crypto.Error { + IntList res = new IntList(); + foreach (Row row in db.session.select({db.session.device_id}) + .with(db.session.identity_id, "=", identity_id) + .with(db.session.address_name, "=", name)) { + res.add(row[db.session.device_id]); + } + return res; + } + + public override void store_session(Address address, uint8[] record) throws Crypto.Error { + db.session.upsert() + .value(db.session.identity_id, identity_id, true) + .value(db.session.address_name, address.name, true) + .value(db.session.device_id, address.device_id, true) + .value(db.session.record_base64, Base64.encode(record)) + .perform(); + } + + public override bool contains_session(Address address) throws Crypto.Error { + return db.session.select({db.session.device_id}) + .with(db.session.identity_id, "=", identity_id) + .with(db.session.address_name, "=", address.name) + .with(db.session.device_id, "=", address.device_id) + .count() > 0; + } + + public override void delete_session(Address address) throws Crypto.Error { + db.session.delete() + .with(db.session.identity_id, "=", identity_id) + .with(db.session.address_name, "=", address.name) + .with(db.session.device_id, "=", address.device_id) + .perform(); + } + + public override void delete_all_sessions(string name) throws Crypto.Error { + db.session.delete() + .with(db.session.identity_id, "=", identity_id) + .with(db.session.address_name, "=", name) + .perform(); + } +} + +} |
