aboutsummaryrefslogtreecommitdiff
path: root/plugins/openpgp/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/openpgp/src')
-rw-r--r--plugins/openpgp/src/account_settings_entry.vala163
-rw-r--r--plugins/openpgp/src/encryption_preferences_entry.vala86
-rw-r--r--plugins/openpgp/src/plugin.vala4
3 files changed, 87 insertions, 166 deletions
diff --git a/plugins/openpgp/src/account_settings_entry.vala b/plugins/openpgp/src/account_settings_entry.vala
deleted file mode 100644
index 7c99942f..00000000
--- a/plugins/openpgp/src/account_settings_entry.vala
+++ /dev/null
@@ -1,163 +0,0 @@
-using Dino.Entities;
-using Gtk;
-
-namespace Dino.Plugins.OpenPgp {
-
-public class AccountSettingsEntry : Plugins.AccountSettingsEntry {
-
- private Label label;
- private Button button;
- private ComboBox combobox;
- private Stack stack;
-
- private Plugin plugin;
- private Account current_account;
- private Gee.List<GPG.Key> keys = null;
- private Gtk.ListStore list_store = new Gtk.ListStore(2, typeof(string), typeof(string?));
-
- public override string id { get { return "pgp_key_picker"; }}
-
- public override string name { get { return "OpenPGP"; }}
-
- public AccountSettingsEntry(Plugin plugin) {
- this.plugin = plugin;
-
- Builder builder = new Builder.from_resource("/im/dino/Dino/openpgp/account_settings_item.ui");
- stack = (Stack) builder.get_object("stack");
- label = (Label) builder.get_object("label");
- button = (Button) builder.get_object("button");
- combobox = (ComboBox) builder.get_object("combobox");
-
- CellRendererText renderer = new CellRendererText();
- renderer.set_padding(0, 0);
- combobox.pack_start(renderer, true);
- combobox.add_attribute(renderer, "markup", 0);
- combobox.set_model(list_store);
-
- button.clicked.connect(on_button_clicked);
- combobox.changed.connect(key_changed);
- }
-
- public override void deactivate() {
- stack.set_visible_child_name("label");
- }
-
- public override void set_account(Account account) {
- set_account_.begin(account);
- }
-
- private async void set_account_(Account account) {
- this.current_account = account;
- if (keys == null) {
- yield fetch_keys();
- populate_list_store();
- }
- activate_current_account();
- }
-
- private void on_button_clicked() {
- activated();
- stack.set_visible_child_name("entry");
- combobox.grab_focus();
- combobox.popup();
- }
-
- private void activate_current_account() {
- combobox.changed.disconnect(key_changed);
- if (keys == null) {
- label.set_markup(build_markup_string(_("Key publishing disabled"), _("Error in GnuPG")));
- return;
- }
- if (keys.size == 0) {
- label.set_markup(build_markup_string(_("Key publishing disabled"), _("No keys available. Generate one!")));
- return;
- }
-
- string? account_key = plugin.db.get_account_key(current_account);
- int activate_index = 0;
- for (int i = 0; i < keys.size; i++) {
- GPG.Key key = keys[i];
- if (key.fpr == account_key) {
- activate_index = i + 1;
- }
- }
- combobox.active = activate_index;
-
- TreeIter selected;
- combobox.get_active_iter(out selected);
- set_label_active(selected);
-
- combobox.changed.connect(key_changed);
- }
-
- private void populate_list_store() {
- if (keys == null || keys.size == 0) {
- return;
- }
-
- list_store.clear();
- TreeIter iter;
- list_store.append(out iter);
- list_store.set(iter, 0, build_markup_string(_("Key publishing disabled"), _("Select key") + "<span font_family='monospace' font='8'> \n </span>"), 1, "");
- for (int i = 0; i < keys.size; i++) {
- list_store.append(out iter);
- list_store.set(iter, 0, @"$(Markup.escape_text(keys[i].uids[0].uid))\n<span font_family='monospace' font='8'>$(markup_colorize_id(keys[i].fpr, true))</span><span font='8'> </span>");
- list_store.set(iter, 1, keys[i].fpr);
- if (keys[i].fpr == plugin.db.get_account_key(current_account)) {
- set_label_active(iter, i + 1);
- }
- }
- button.sensitive = true;
- }
-
- private async void fetch_keys() {
- label.set_markup(build_markup_string(_("Loading…"), _("Querying GnuPG")));
-
- SourceFunc callback = fetch_keys.callback;
- new Thread<void*> (null, () => { // Querying GnuPG might take some time
- try {
- keys = GPGHelper.get_keylist(null, true);
- } catch (Error e) {
- warning(e.message);
- }
- Idle.add((owned)callback);
- return null;
- });
- yield;
- }
-
- private void set_label_active(TreeIter iter, int i = -1) {
- Value text;
- list_store.get_value(iter, 0, out text);
- label.set_markup((string) text);
- if (i != -1) combobox.active = i;
- }
-
- private void key_changed() {
- TreeIter selected;
- bool iter_valid = combobox.get_active_iter(out selected);
- if (iter_valid) {
- Value key_value;
- list_store.get_value(selected, 1, out key_value);
- string? key_id = key_value as string;
- if (key_id != null) {
- if (plugin.modules.has_key(current_account)) {
- plugin.modules[current_account].set_private_key_id(key_id);
- }
- plugin.db.set_account_key(current_account, key_id);
- }
- set_label_active(selected);
- deactivate();
- }
- }
-
- private string build_markup_string(string primary, string secondary) {
- return @"$(Markup.escape_text(primary))\n<span font='8'>$secondary</span>";
- }
-
- public override Object? get_widget(WidgetType type) {
- if (type != WidgetType.GTK4) return null;
- return stack;
- }
-}
-} \ No newline at end of file
diff --git a/plugins/openpgp/src/encryption_preferences_entry.vala b/plugins/openpgp/src/encryption_preferences_entry.vala
new file mode 100644
index 00000000..4620e173
--- /dev/null
+++ b/plugins/openpgp/src/encryption_preferences_entry.vala
@@ -0,0 +1,86 @@
+using Adw;
+using Dino.Entities;
+using Gtk;
+
+namespace Dino.Plugins.OpenPgp {
+
+ public class PgpPreferencesEntry : Plugins.EncryptionPreferencesEntry {
+
+ private Plugin plugin;
+
+ public PgpPreferencesEntry(Plugin plugin) {
+ this.plugin = plugin;
+ }
+
+ public override Object? get_widget(Account account, WidgetType type) {
+ if (type != WidgetType.GTK4) return null;
+ StringList string_list = new StringList(null);
+ string_list.append(_("Querying GnuPG"));
+
+ Adw.PreferencesGroup preferences_group = new Adw.PreferencesGroup() { title="OpenPGP" };
+ populate_string_list.begin(account, preferences_group);
+
+ return preferences_group;
+ }
+
+ public override string id { get { return "pgp_preferences_encryption"; }}
+
+ private async void populate_string_list(Account account, Adw.PreferencesGroup preferences_group) {
+ var keys = yield get_pgp_keys();
+
+ if (keys == null) {
+ preferences_group.add(new Adw.ActionRow() { title="Announce key", subtitle="Error in GnuPG" });
+ return;
+ }
+ if (keys.size == 0) {
+ preferences_group.add(new Adw.ActionRow() { title="Announce key", subtitle="No keys available. Generate one!" });
+ return;
+ }
+
+ StringList string_list = new StringList(null);
+#if Adw_1_4
+ var drop_down = new Adw.ComboRow() { title = "Announce key" };
+ drop_down.model = string_list;
+ preferences_group.add(drop_down);
+#else
+ var view = new Adw.ActionRow() { title = "Announce key" };
+ var drop_down = new DropDown(string_list, null) { valign = Align.CENTER };
+ view.activatable_widget = drop_down;
+ view.add_suffix(drop_down);
+ preferences_group.add(view);
+#endif
+
+ string_list.append(_("Disabled"));
+ for (int i = 0; i < keys.size; i++) {
+ string_list.append(@"$(keys[i].uids[0].uid)\n$(keys[i].fpr.substring(24, 16))");
+ if (keys[i].fpr == plugin.db.get_account_key(account)) {
+ drop_down.selected = i + 1;
+ }
+ }
+
+ drop_down.notify["selected"].connect(() => {
+ var key_id = drop_down.selected == 0 ? "" : keys[(int)drop_down.selected - 1].fpr;
+ if (plugin.modules.has_key(account)) {
+ plugin.modules[account].set_private_key_id(key_id);
+ }
+ plugin.db.set_account_key(account, key_id);
+ });
+ }
+
+ private static async Gee.List<GPG.Key> get_pgp_keys() {
+ Gee.List<GPG.Key> keys = null;
+ SourceFunc callback = get_pgp_keys.callback;
+ new Thread<void*> (null, () => { // Querying GnuPG might take some time
+ try {
+ keys = GPGHelper.get_keylist(null, true);
+ } catch (Error e) {
+ warning(e.message);
+ }
+ Idle.add((owned)callback);
+ return null;
+ });
+ yield;
+ return keys;
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/openpgp/src/plugin.vala b/plugins/openpgp/src/plugin.vala
index 324b8652..463058f3 100644
--- a/plugins/openpgp/src/plugin.vala
+++ b/plugins/openpgp/src/plugin.vala
@@ -13,18 +13,16 @@ public class Plugin : Plugins.RootInterface, Object {
public HashMap<Account, Module> modules = new HashMap<Account, Module>(Account.hash_func, Account.equals_func);
private EncryptionListEntry list_entry;
- private AccountSettingsEntry settings_entry;
private ContactDetailsProvider contact_details_provider;
public void registered(Dino.Application app) {
this.app = app;
this.db = new Database(Path.build_filename(Application.get_storage_dir(), "pgp.db"));
this.list_entry = new EncryptionListEntry(app.stream_interactor, db);
- this.settings_entry = new AccountSettingsEntry(this);
this.contact_details_provider = new ContactDetailsProvider(app.stream_interactor);
app.plugin_registry.register_encryption_list_entry(list_entry);
- app.plugin_registry.register_account_settings_entry(settings_entry);
+ app.plugin_registry.register_encryption_preferences_entry(new PgpPreferencesEntry(this));
app.plugin_registry.register_contact_details_entry(contact_details_provider);
app.stream_interactor.module_manager.initialize_account_modules.connect(on_initialize_account_modules);