aboutsummaryrefslogtreecommitdiff
path: root/plugins/openpgp/src/manager.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/manager.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/manager.vala')
-rw-r--r--plugins/openpgp/src/manager.vala29
1 files changed, 17 insertions, 12 deletions
diff --git a/plugins/openpgp/src/manager.vala b/plugins/openpgp/src/manager.vala
index 6ec30acc..23cc93c2 100644
--- a/plugins/openpgp/src/manager.vala
+++ b/plugins/openpgp/src/manager.vala
@@ -14,7 +14,6 @@ public class Manager : StreamInteractionModule, Object {
private StreamInteractor stream_interactor;
private Database db;
- private HashMap<Jid, string> pgp_key_ids = new HashMap<Jid, string>(Jid.hash_bare_func, Jid.equals_bare_func);
private ReceivedMessageListener received_message_listener = new ReceivedMessageListener();
public static void start(StreamInteractor stream_interactor, Database db) {
@@ -81,23 +80,29 @@ public class Manager : StreamInteractionModule, Object {
public string? get_key_id(Account account, Jid jid) {
Jid search_jid = stream_interactor.get_module(MucManager.IDENTITY).is_groupchat_occupant(jid, account) ? jid : jid.bare_jid;
- return db.get_contact_key(search_jid);
+ Qlite.RowOption key_row = db.get_contact_key_row(search_jid);
+ if (!key_row.is_present()) return null;
+ string? key_id = key_row.get(db.contact_key_table.key);
+ if (key_id != null) return key_id;
+ string? sig = key_row.get(db.contact_key_table.sig);
+ string? signed_data = key_row.get(db.contact_key_table.signed_data);
+ if (sig == null || signed_data == null) return null;
+ key_id = get_sign_key(sig, signed_data);
+ if (key_id != null) {
+ db.set_contact_key(search_jid, key_id);
+ }
+ return key_id;
}
private void on_account_added(Account account) {
- stream_interactor.module_manager.get_module(account, Module.IDENTITY).received_jid_key_id.connect((stream, jid, key_id) => {
- on_jid_key_received(account, jid, key_id);
+ stream_interactor.module_manager.get_module(account, Module.IDENTITY).received_jid_presence_signature.connect((stream, jid, sig, signed_data) => {
+ on_jid_signature_received(account, jid, sig, signed_data);
});
}
- private void on_jid_key_received(Account account, Jid jid, string key_id) {
- lock (pgp_key_ids) {
- if (!pgp_key_ids.has_key(jid) || pgp_key_ids[jid] != key_id) {
- Jid set_jid = stream_interactor.get_module(MucManager.IDENTITY).is_groupchat_occupant(jid, account) ? jid : jid.bare_jid;
- db.set_contact_key(set_jid, key_id);
- }
- pgp_key_ids[jid] = key_id;
- }
+ private void on_jid_signature_received(Account account, Jid jid, string sig, string signed_data) {
+ Jid set_jid = stream_interactor.get_module(MucManager.IDENTITY).is_groupchat_occupant(jid, account) ? jid : jid.bare_jid;
+ db.set_contact_signature(set_jid, sig, signed_data);
}
private class ReceivedMessageListener : MessageListener {