aboutsummaryrefslogtreecommitdiff
path: root/plugins/openpgp/src/database.vala
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2026-06-07 21:52:00 +0200
committerMarvin W <git@larma.de>2026-06-07 23:13:07 +0200
commit9b7b0d98cb9a41e8bd06ae627474d4e1e97139e6 (patch)
tree61a36db5611fb57f9681c1c239ffa05931c7dc07 /plugins/openpgp/src/database.vala
parent8c05d7b066f03d0c024cc0701b69279fffb4e0cf (diff)
OpenPGP: Process signatures on presences only once needed
- Incoming signatures are stored in the database and processed when needed (to send PGP encrypted messages or to display them in the contact details) - Outgoing signatures are stored in the database and cached until the key is changed
Diffstat (limited to 'plugins/openpgp/src/database.vala')
-rw-r--r--plugins/openpgp/src/database.vala74
1 files changed, 68 insertions, 6 deletions
diff --git a/plugins/openpgp/src/database.vala b/plugins/openpgp/src/database.vala
index f488078c..fb575a3b 100644
--- a/plugins/openpgp/src/database.vala
+++ b/plugins/openpgp/src/database.vala
@@ -6,25 +6,46 @@ using Xmpp;
namespace Dino.Plugins.OpenPgp {
public class Database : Qlite.Database {
- private const int VERSION = 0;
+ private const int VERSION = 1;
public class AccountSetting : Table {
public Column<int> account_id = new Column.Integer("account_id") { primary_key = true };
public Column<string> key = new Column.Text("key") { not_null = true };
+ public Column<string> signed_data = new Column.Text("signed_data") { min_version = 1 };
+ public Column<string> sig = new Column.Text("sig") { min_version = 1 };
internal AccountSetting(Database db) {
base(db, "account_setting");
- init({account_id, key});
+ init({account_id, key, signed_data, sig});
}
}
public class ContactKey : Table {
public Column<string> jid = new Column.Text("jid") { primary_key = true };
- public Column<string> key = new Column.Text("key") { not_null = true };
+ public Column<string> key = new Column.Text("key");
+ public Column<string> sig = new Column.Text("sig") { min_version = 1 };
+ public Column<string> signed_data = new Column.Text("signed_data") { min_version = 1 };
internal ContactKey(Database db) {
base(db, "contact_key");
- init({jid, key});
+ init({jid, key, sig, signed_data});
+ }
+
+ internal void migrate_from_v0(Database db) {
+ string column_list = "";
+ foreach (Column c in columns) {
+ if (c.min_version <= VERSION && c.max_version >= VERSION) {
+ if (column_list == "") {
+ column_list = c.name;
+ } else {
+ column_list += ", " + c.name;
+ }
+ }
+ }
+ db.exec(@"ALTER TABLE $name RENAME TO _$(name)_1");
+ create_table_at_version(VERSION);
+ db.exec(@"INSERT INTO $name ($column_list) SELECT $column_list FROM _$(name)_1");
+ db.exec(@"DROP TABLE _$(name)_1");
}
}
@@ -46,6 +67,23 @@ public class Database : Qlite.Database {
}
}
+ public void set_contact_signature(Jid jid, string sig, string signed_data) {
+ contact_key_table.upsert()
+ .value(contact_key_table.jid, jid.to_string(), true)
+ .value(contact_key_table.sig, sig)
+ .value(contact_key_table.signed_data, signed_data)
+ .value_null(contact_key_table.key)
+ .perform();
+ }
+
+ public void clear_contact_signature(Jid jid) {
+ contact_key_table.upsert()
+ .value(contact_key_table.jid, jid.to_string(), true)
+ .value_null(contact_key_table.sig)
+ .value_null(contact_key_table.signed_data)
+ .perform();
+ }
+
public void set_contact_key(Jid jid, string key) {
contact_key_table.upsert()
.value(contact_key_table.jid, jid.to_string(), true)
@@ -54,23 +92,47 @@ public class Database : Qlite.Database {
}
public string? get_contact_key(Jid jid) {
+ return get_contact_key_row(jid)[contact_key_table.key];
+ }
+
+ public RowOption get_contact_key_row(Jid jid) {
return contact_key_table.select({contact_key_table.key})
- .with(contact_key_table.jid, "=", jid.to_string())[contact_key_table.key];
+ .with(contact_key_table.jid, "=", jid.to_string()).row();
}
public void set_account_key(Account account, string key) {
account_setting_table.upsert()
.value(account_setting_table.account_id, account.id, true)
.value(account_setting_table.key, key)
+ .value_null(account_setting_table.signed_data)
+ .value_null(account_setting_table.sig)
+ .perform();
+ }
+
+ public void set_account_signature(Account account, string signed_data, string sig) {
+ account_setting_table.update()
+ .with(account_setting_table.account_id, "=", account.id)
+ .set(account_setting_table.signed_data, signed_data)
+ .set(account_setting_table.sig, sig)
.perform();
}
+ public string? get_account_signature(Account account, string signed_data) {
+ return account_setting_table.select({account_setting_table.sig})
+ .with(account_setting_table.account_id, "=", account.id)
+ .with(account_setting_table.signed_data, "=", signed_data)[account_setting_table.sig];
+ }
+
public string? get_account_key(Account account) {
return account_setting_table.select({account_setting_table.key})
.with(account_setting_table.account_id, "=", account.id)[account_setting_table.key];
}
- public override void migrate(long oldVersion) { }
+ public override void migrate(long oldVersion) {
+ if (oldVersion < 1) {
+ contact_key_table.migrate_from_v0(this);
+ }
+ }
}
}