[Commits] [SCM] claws branch, master, updated. 3.15.0-142-g3bce048

ticho at claws-mail.org ticho at claws-mail.org
Sat Sep 23 20:43:16 CEST 2017


The branch, master has been updated
       via  3bce04815148589855c401da99bcabe6d2ead575 (commit)
      from  afd7adf52bd5622002f225175aea3b221bd63314 (commit)

Summary of changes:
 AUTHORS                         |    1 +
 src/gtk/authors.h               |    1 +
 src/plugins/pgpcore/prefs_gpg.c |  172 ++++++++++++++++++++++++++++-----------
 src/plugins/pgpcore/prefs_gpg.h |    2 +
 src/plugins/pgpcore/sgpgme.c    |   28 +++++--
 5 files changed, 151 insertions(+), 53 deletions(-)


- Log -----------------------------------------------------------------
commit 3bce04815148589855c401da99bcabe6d2ead575
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sat Jul 1 12:23:33 2017 +0200

    Use separate account configuration for OpenPGP and for S/MIME.
    
    This is useful for users who switch between privacy systems.
    Based on patch by Thomas Orgis.
    Closes bug Bug 3834 - [PATCH] separate account prefs for
    S/MIME to be able to specify keys for both PGP and S/MIME

diff --git a/AUTHORS b/AUTHORS
index ebe907e..a1c322f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -315,3 +315,4 @@ contributors (in addition to the above; based on Changelog)
 	Michael Vilain
 	Orbea
 	Flavio Leitner
+	Thomas Orgis
diff --git a/src/gtk/authors.h b/src/gtk/authors.h
index b398923..00cab1a 100644
--- a/src/gtk/authors.h
+++ b/src/gtk/authors.h
@@ -242,6 +242,7 @@ static char *CONTRIBS_LIST[] = {
 "Paul Ollis",
 "Fredrik Olofssen",
 "Orbea",
+"Thomas Orgis",
 "Reza Pakdel",
 "Richard Palo",
 "Marcel Pol",
diff --git a/src/plugins/pgpcore/prefs_gpg.c b/src/plugins/pgpcore/prefs_gpg.c
index 19f6421..1f2c5b3 100644
--- a/src/plugins/pgpcore/prefs_gpg.c
+++ b/src/plugins/pgpcore/prefs_gpg.c
@@ -87,6 +87,26 @@ struct GPGPage
 	GtkWidget *gpg_path;
 };
 
+struct GPGAccountPage
+{
+	PrefsPage page;
+
+	GtkWidget *key_default;
+	GtkWidget *key_by_from;
+	GtkWidget *key_custom;
+	GtkWidget *keyid;
+	GtkWidget *keyid_label;
+	GtkWidget *new_key_label;
+	GtkWidget *new_key_btn;
+	GtkWidget *new_key_box;
+
+	PrefsAccount *account;
+};
+
+static struct GPGPage gpg_page;
+static struct GPGAccountPage gpg_account_page;
+static struct GPGAccountPage smime_account_page;
+
 static void prefs_gpg_create_widget_func(PrefsPage *_page,
 					 GtkWindow *window,
 					 gpointer data)
@@ -270,22 +290,6 @@ static void prefs_gpg_save_func(PrefsPage *_page)
 	prefs_gpg_save_config();
 }
 
-struct GPGAccountPage
-{
-	PrefsPage page;
-
-	GtkWidget *key_default;
-	GtkWidget *key_by_from;
-	GtkWidget *key_custom;
-	GtkWidget *keyid;
-	GtkWidget *keyid_label;
-	GtkWidget *new_key_label;
-	GtkWidget *new_key_btn;
-	GtkWidget *new_key_box;
-
-	PrefsAccount *account;
-};
-
 void key_custom_toggled(GtkToggleButton *togglebutton, gpointer user_data)
 {
 	struct GPGAccountPage *page = (struct GPGAccountPage *) user_data;
@@ -333,6 +337,7 @@ static void prefs_gpg_account_create_widget_func(PrefsPage *_page,
 	struct GPGAccountPage *page = (struct GPGAccountPage *) _page;
 	PrefsAccount *account = (PrefsAccount *) data;
 	GPGAccountConfig *config;
+	SignKeyType sign_key;
 
 	GtkWidget *vbox;
 	GtkWidget *frame1;
@@ -403,7 +408,10 @@ static void prefs_gpg_account_create_widget_func(PrefsPage *_page,
 	gtk_box_pack_start(GTK_BOX(hbox), keyid, FALSE, FALSE, 0);
 
 	config = prefs_gpg_account_get_config(account);
-	switch (config->sign_key) {
+
+	sign_key =
+		(page == &smime_account_page ? config->smime_sign_key : config->sign_key);
+	switch (sign_key) {
 	case SIGN_KEY_DEFAULT:
 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(key_default), TRUE);
 		gtk_widget_set_sensitive(GTK_WIDGET(keyid_label), FALSE);
@@ -441,9 +449,13 @@ static void prefs_gpg_account_create_widget_func(PrefsPage *_page,
 	gtk_widget_show(new_key_btn);
 	gtk_box_pack_start(GTK_BOX(hbox), new_key_btn, FALSE, FALSE, 0);
 
-	if (config->sign_key_id != NULL)
-		gtk_entry_set_text(GTK_ENTRY(keyid), config->sign_key_id);
-
+	if (page == &smime_account_page) {
+		if (config->smime_sign_key_id != NULL)
+			gtk_entry_set_text(GTK_ENTRY(keyid), config->smime_sign_key_id);
+	} else {
+		if (config->sign_key_id != NULL)
+			gtk_entry_set_text(GTK_ENTRY(keyid), config->sign_key_id);
+	}
 	g_signal_connect(G_OBJECT(key_custom), "toggled", G_CALLBACK(key_custom_toggled), page);
 	g_signal_connect(G_OBJECT(new_key_btn), "clicked", G_CALLBACK(new_key_clicked), page);
 
@@ -473,14 +485,26 @@ static void prefs_gpg_account_save_func(PrefsPage *_page)
 
 	config = prefs_gpg_account_get_config(page->account);
 
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_default)))
-		config->sign_key = SIGN_KEY_DEFAULT;
-	else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_by_from)))
-		config->sign_key = SIGN_KEY_BY_FROM;
-	else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) {
-		config->sign_key = SIGN_KEY_CUSTOM;
-		g_free(config->sign_key_id);
-		config->sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
+	if (page == &smime_account_page) {
+		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_default)))
+			config->smime_sign_key = SIGN_KEY_DEFAULT;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_by_from)))
+			config->smime_sign_key = SIGN_KEY_BY_FROM;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) {
+			config->smime_sign_key = SIGN_KEY_CUSTOM;
+			g_free(config->smime_sign_key_id);
+			config->smime_sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
+		}
+	} else {
+		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_default)))
+			config->sign_key = SIGN_KEY_DEFAULT;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_by_from)))
+			config->sign_key = SIGN_KEY_BY_FROM;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) {
+			config->sign_key = SIGN_KEY_CUSTOM;
+			g_free(config->sign_key_id);
+			config->sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
+		}
 	}
 
 	prefs_gpg_account_set_config(page->account, config);
@@ -526,26 +550,51 @@ struct GPGAccountConfig *prefs_gpg_account_get_config(PrefsAccount *account)
 	config = g_new0(GPGAccountConfig, 1);
 	config->sign_key = SIGN_KEY_DEFAULT;
 	config->sign_key_id = NULL;
+	config->smime_sign_key = SIGN_KEY_DEFAULT;
+	config->smime_sign_key_id = NULL;
 
 	confstr = prefs_account_get_privacy_prefs(account, "gpg");
-	if (confstr == NULL)
-		return config;
-
-	strv = g_strsplit(confstr, ";", 0);
-	if (strv[0] != NULL) {
-		if (!strcmp(strv[0], "DEFAULT"))
-			config->sign_key = SIGN_KEY_DEFAULT;
-		if (!strcmp(strv[0], "BY_FROM"))
-			config->sign_key = SIGN_KEY_BY_FROM;
-		if (!strcmp(strv[0], "CUSTOM")) {
-			if (strv[1] != NULL) {
-				config->sign_key = SIGN_KEY_CUSTOM;
-				config->sign_key_id = g_strdup(strv[1]);
-			} else
+	if (confstr != NULL) {
+		strv = g_strsplit(confstr, ";", 0);
+		if (strv[0] != NULL) {
+			if (!strcmp(strv[0], "DEFAULT"))
 				config->sign_key = SIGN_KEY_DEFAULT;
+			if (!strcmp(strv[0], "BY_FROM"))
+				config->sign_key = SIGN_KEY_BY_FROM;
+			if (!strcmp(strv[0], "CUSTOM")) {
+				if (strv[1] != NULL) {
+					config->sign_key = SIGN_KEY_CUSTOM;
+					config->sign_key_id = g_strdup(strv[1]);
+				} else
+					config->sign_key = SIGN_KEY_DEFAULT;
+			}
 		}
+		g_strfreev(strv);
+	}
+
+	confstr = prefs_account_get_privacy_prefs(account, "smime");
+	/* If the "smime" section does not yet exist, fall back to
+	 * "gpg" section even for smime_ values. This will generally
+	 * only happen on first run. */
+	if (confstr == NULL)
+		confstr = prefs_account_get_privacy_prefs(account, "gpg");
+	if (confstr != NULL) {
+		strv = g_strsplit(confstr, ";", 0);
+		if (strv[0] != NULL) {
+			if (!strcmp(strv[0], "DEFAULT"))
+				config->smime_sign_key = SIGN_KEY_DEFAULT;
+			if (!strcmp(strv[0], "BY_FROM"))
+				config->smime_sign_key = SIGN_KEY_BY_FROM;
+			if (!strcmp(strv[0], "CUSTOM")) {
+				if (strv[1] != NULL) {
+					config->smime_sign_key = SIGN_KEY_CUSTOM;
+					config->smime_sign_key_id = g_strdup(strv[1]);
+				} else
+					config->smime_sign_key = SIGN_KEY_DEFAULT;
+			}
+		}
+		g_strfreev(strv);
 	}
-	g_strfreev(strv);
 
 	return config;
 }
@@ -572,17 +621,35 @@ void prefs_gpg_account_set_config(PrefsAccount *account, GPGAccountConfig *confi
 	prefs_account_set_privacy_prefs(account, "gpg", confstr);
 
 	g_free(confstr);
+	confstr = NULL;
+
+	switch (config->smime_sign_key) {
+	case SIGN_KEY_DEFAULT:
+		confstr = g_strdup("DEFAULT");
+		break;
+	case SIGN_KEY_BY_FROM:
+		confstr = g_strdup("BY_FROM");
+		break;
+	case SIGN_KEY_CUSTOM:
+		confstr = g_strdup_printf("CUSTOM;%s", config->smime_sign_key_id);
+		break;
+	default:
+		confstr = g_strdup("");
+		g_warning("prefs_gpg_account_set_config: bad sign_key val");
+	}
+
+	prefs_account_set_privacy_prefs(account, "smime", confstr);
+
+	g_free(confstr);
 }
 
 void prefs_gpg_account_free_config(GPGAccountConfig *config)
 {
+	g_free(config->smime_sign_key_id);
 	g_free(config->sign_key_id);
 	g_free(config);
 }
 
-static struct GPGPage gpg_page;
-static struct GPGAccountPage gpg_account_page;
-
 void prefs_gpg_enable_agent(gboolean enable)
 {
 	if (enable) {
@@ -607,7 +674,7 @@ void prefs_gpg_enable_agent(gboolean enable)
 
 void prefs_gpg_init()
 {
-	static gchar *path[3];
+	static gchar *path[3], *spath[3];
 	gchar *rcpath;
 	const gchar *tmp = NULL;
 
@@ -635,6 +702,17 @@ void prefs_gpg_init()
         gpg_account_page.page.weight = 30.0;
 
         prefs_account_register_page((PrefsPage *) &gpg_account_page);
+
+        spath[0] = _("Plugins");
+        spath[1] = _("S/MIME");
+        spath[2] = NULL;
+        smime_account_page.page.path = spath;
+        smime_account_page.page.create_widget = prefs_gpg_account_create_widget_func;
+        smime_account_page.page.destroy_widget = prefs_gpg_account_destroy_widget_func;
+        smime_account_page.page.save_page = prefs_gpg_account_save_func;
+        smime_account_page.page.weight = 30.0;
+
+        prefs_account_register_page((PrefsPage *) &smime_account_page);
 	
 	tmp = g_getenv("GPG_AGENT_INFO");
 	if (tmp)
diff --git a/src/plugins/pgpcore/prefs_gpg.h b/src/plugins/pgpcore/prefs_gpg.h
index 3eb9c34..70d308a 100644
--- a/src/plugins/pgpcore/prefs_gpg.h
+++ b/src/plugins/pgpcore/prefs_gpg.h
@@ -50,6 +50,8 @@ struct GPGAccountConfig
 {
 	SignKeyType	 sign_key;
 	gchar 		*sign_key_id;
+	SignKeyType	 smime_sign_key;
+	gchar 		*smime_sign_key_id;
 };
 
 void prefs_gpg_init(void);
diff --git a/src/plugins/pgpcore/sgpgme.c b/src/plugins/pgpcore/sgpgme.c
index 4ae51b3..89b4c87 100644
--- a/src/plugins/pgpcore/sgpgme.c
+++ b/src/plugins/pgpcore/sgpgme.c
@@ -572,14 +572,30 @@ gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account,
 {
 	GPGAccountConfig *config;
 	const gchar *signer_addr = account->address;
+	SignKeyType sk;
+	gchar *skid;
+	gboolean smime = FALSE;
 
 	gpgme_signers_clear(ctx);
 
+	if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_CMS)
+		smime = TRUE;
+
 	if (from_addr)
 		signer_addr = from_addr;
 	config = prefs_gpg_account_get_config(account);
 
-	switch(config->sign_key) {
+	if(smime) {
+		debug_print("sgpgme_setup_signers: S/MIME protocol\n");
+		sk = config->smime_sign_key;
+		skid = config->smime_sign_key_id;
+	} else {
+		debug_print("sgpgme_setup_signers: OpenPGP protocol\n");
+		sk = config->sign_key;
+		skid = config->sign_key_id;
+	}
+
+	switch(sk) {
 	case SIGN_KEY_DEFAULT:
 		debug_print("using default gnupg key\n");
 		break;
@@ -587,19 +603,19 @@ gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account,
 		debug_print("using key for %s\n", signer_addr);
 		break;
 	case SIGN_KEY_CUSTOM:
-		debug_print("using key for %s\n", config->sign_key_id);
+		debug_print("using key for %s\n", skid);
 		break;
 	}
 
-	if (config->sign_key != SIGN_KEY_DEFAULT) {
+	if (sk != SIGN_KEY_DEFAULT) {
 		const gchar *keyid;
 		gpgme_key_t key, found_key;
 		gpgme_error_t err;
 
-		if (config->sign_key == SIGN_KEY_BY_FROM)
+		if (sk == SIGN_KEY_BY_FROM)
 			keyid = signer_addr;
-		else if (config->sign_key == SIGN_KEY_CUSTOM)
-			keyid = config->sign_key_id;
+		else if (sk == SIGN_KEY_CUSTOM)
+			keyid = skid;
 		else
 			goto bail;
 

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list