diff options
| author | Marvin W <git@larma.de> | 2026-06-07 21:52:00 +0200 |
|---|---|---|
| committer | Marvin W <git@larma.de> | 2026-06-07 23:13:07 +0200 |
| commit | 9b7b0d98cb9a41e8bd06ae627474d4e1e97139e6 (patch) | |
| tree | 61a36db5611fb57f9681c1c239ffa05931c7dc07 /plugins/openpgp/src/manager.vala | |
| parent | 8c05d7b066f03d0c024cc0701b69279fffb4e0cf (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.vala | 29 |
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 { |
