[Commits] [SCM] claws branch, master, updated. 3.16.0-132-ge9f610a

ticho at claws-mail.org ticho at claws-mail.org
Fri Apr 13 20:03:17 CEST 2018


The branch, master has been updated
       via  e9f610a4f8d1c1ffdcadc14d9cb5373987ac28e4 (commit)
      from  33c094132790240a142967d603cfa9ea4ceddfd1 (commit)

Summary of changes:
 src/compose.c |  124 ++++++++++++++++++++++++++++++---------------------------
 src/compose.h |   13 +++++-
 src/folder.c  |    6 +--
 3 files changed, 81 insertions(+), 62 deletions(-)


- Log -----------------------------------------------------------------
commit e9f610a4f8d1c1ffdcadc14d9cb5373987ac28e4
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Tue Apr 10 19:46:01 2018 +0200

    Rework and simplify how compose_queue() return values are handled
    
    Also closes bug #3960 - Sends unencrypted emails when encryption fails
    because we now return from compose_queue() with an error when
    that happens, instead of ignoring it.

diff --git a/src/compose.c b/src/compose.c
index efb3b9c..4cfa88b 100644
--- a/src/compose.c
+++ b/src/compose.c
@@ -314,7 +314,7 @@ static gint compose_write_body_to_file		(Compose	*compose,
 static gint compose_remove_reedit_target	(Compose	*compose,
 						 gboolean	 force);
 static void compose_remove_draft			(Compose	*compose);
-static gint compose_queue_sub			(Compose	*compose,
+static ComposeQueueResult compose_queue_sub			(Compose	*compose,
 						 gint		*msgnum,
 						 FolderItem	**item,
 						 gchar		**msgpath,
@@ -5204,11 +5204,47 @@ static gboolean compose_check_entries(Compose *compose, gboolean check_everythin
 	return TRUE;
 }
 
+static void _display_queue_error(ComposeQueueResult val)
+{
+	switch (val) {
+		case COMPOSE_QUEUE_SUCCESS:
+			break;
+		case COMPOSE_QUEUE_ERROR_NO_MSG:
+			alertpanel_error(_("Could not queue message."));
+			break;
+		case COMPOSE_QUEUE_ERROR_WITH_ERRNO:
+			alertpanel_error(_("Could not queue message:\n\n%s."),
+					g_strerror(errno));
+			break;
+		case COMPOSE_QUEUE_ERROR_SIGNING_FAILED:
+			alertpanel_error(_("Could not queue message for sending:\n\n"
+						"Signature failed: %s"), privacy_get_error());
+			break;
+		case COMPOSE_QUEUE_ERROR_ENCRYPT_FAILED:
+			alertpanel_error(_("Could not queue message for sending:\n\n"
+						"Encryption failed: %s"), privacy_get_error());
+			break;
+		case COMPOSE_QUEUE_ERROR_CHAR_CONVERSION:
+			alertpanel_error(_("Could not queue message for sending:\n\n"
+						"Charset conversion failed."));
+			break;
+		case COMPOSE_QUEUE_ERROR_NO_ENCRYPTION_KEY:
+			alertpanel_error(_("Could not queue message for sending:\n\n"
+						"Couldn't get recipient encryption key."));
+			break;
+		default:
+			/* unhandled error */
+			debug_print("oops, unhandled compose_queue() return value %d\n",
+					val);
+			break;
+	}
+}
+
 gint compose_send(Compose *compose)
 {
 	gint msgnum;
 	FolderItem *folder = NULL;
-	gint val = -1;
+	ComposeQueueResult val = COMPOSE_QUEUE_ERROR_NO_MSG;
 	gchar *msgpath = NULL;
 	gboolean discard_window = FALSE;
 	gchar *errstr = NULL;
@@ -5233,27 +5269,13 @@ gint compose_send(Compose *compose)
 	inc_lock();
 	val = compose_queue(compose, &msgnum, &folder, &msgpath, TRUE);
 
-	if (val) {
+	if (val != COMPOSE_QUEUE_SUCCESS) {
 		if (compose->batch) {
 			gtk_widget_show_all(compose->window);
 		}
-		if (val == -4) {
-			alertpanel_error(_("Could not queue message for sending:\n\n"
-					   "Charset conversion failed."));
-		} else if (val == -5) {
-			alertpanel_error(_("Could not queue message for sending:\n\n"
-					   "Couldn't get recipient encryption key."));
-		} else if (val == -6) {
-			/* silent error */
-		} else if (val == -3) {
-			if (privacy_peek_error())
-			alertpanel_error(_("Could not queue message for sending:\n\n"
-					   "Signature failed: %s"), privacy_get_error());
-		} else if (val == -2 && errno != 0) {
-			alertpanel_error(_("Could not queue message for sending:\n\n%s."), g_strerror(errno));
-		} else {
-			alertpanel_error(_("Could not queue message for sending."));
-		}
+
+		_display_queue_error(val);
+
 		goto bail;
 	}
 
@@ -5730,7 +5752,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
 
 			if (aval != G_ALERTALTERNATE) {
 				g_free(chars);
-				return -3;
+				return COMPOSE_QUEUE_ERROR_CHAR_CONVERSION;
 			} else {
 				buf = chars;
 				out_codeset = src_codeset;
@@ -5791,7 +5813,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
 		g_free(msg);
 		if (aval != G_ALERTALTERNATE) {
 			g_free(buf);
-			return -1;
+			return COMPOSE_QUEUE_ERROR_NO_MSG;
 		}
 	}
 	
@@ -5894,8 +5916,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
 			if (!privacy_encrypt(compose->privacy_system, mimemsg, compose->encdata)) {
 				debug_print("Couldn't encrypt mime structure: %s.\n",
 						privacy_get_error());
-				alertpanel_error(_("Couldn't encrypt the email: %s"),
-						privacy_get_error());
+				return COMPOSE_QUEUE_ERROR_ENCRYPT_FAILED;
 			}
 		}
 	}
@@ -6001,7 +6022,7 @@ static void compose_remove_draft(Compose *compose)
 
 }
 
-gint compose_queue(Compose *compose, gint *msgnum, FolderItem **item, gchar **msgpath,
+ComposeQueueResult compose_queue(Compose *compose, gint *msgnum, FolderItem **item, gchar **msgpath,
 		   gboolean remove_reedit_target)
 {
 	return compose_queue_sub (compose, msgnum, item, msgpath, FALSE, remove_reedit_target);
@@ -6032,7 +6053,7 @@ static gboolean compose_warn_encryption(Compose *compose)
 	} 
 }
 
-static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item, 
+static ComposeQueueResult compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item, 
 			      gchar **msgpath, gboolean perform_checks,
 			      gboolean remove_reedit_target)
 {
@@ -6051,12 +6072,12 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 		if (compose->batch) {
 			gtk_widget_show_all(compose->window);
 		}
-                return -1;
+                return COMPOSE_QUEUE_ERROR_NO_MSG;
 	}
 
 	if (!compose->to_list && !compose->newsgroup_list) {
 	        g_warning("can't get recipient list.");
-                return -1;
+                return COMPOSE_QUEUE_ERROR_NO_MSG;
         }
 
 	if (compose->to_list) {
@@ -6066,7 +6087,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 	    		mailac = cur_account;
 		else if (!(mailac = compose_current_mail_account())) {
 			alertpanel_error(_("No account for sending mails available!"));
-			return -1;
+			return COMPOSE_QUEUE_ERROR_NO_MSG;
 		}
 	}
 
@@ -6075,7 +6096,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
                         newsac = compose->account;
                 else {
 			alertpanel_error(_("Selected account isn't NNTP: Posting is impossible."));
-			return -1;
+			return COMPOSE_QUEUE_ERROR_NO_MSG;
 		}			
 	}
 
@@ -6086,7 +6107,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 	if ((fp = g_fopen(tmp, "w+b")) == NULL) {
 		FILE_OP_ERROR(tmp, "fopen");
 		g_free(tmp);
-		return -2;
+		return COMPOSE_QUEUE_ERROR_WITH_ERRNO;
 	}
 
 	if (change_file_mode_rw(fp, tmp) < 0) {
@@ -6149,7 +6170,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 				fclose(fp);
 				claws_unlink(tmp);
 				g_free(tmp);
-				return -6;
+				return COMPOSE_QUEUE_ERROR_NO_MSG;
 			}
 			if (mailac && mailac->encrypt_to_self) {
 				GSList *tmp_list = g_slist_copy(compose->to_list);
@@ -6174,7 +6195,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 				fclose(fp);
 				claws_unlink(tmp);
 				g_free(tmp);
-				return -5;
+				return COMPOSE_QUEUE_ERROR_NO_ENCRYPTION_KEY;
 			}
 		}
 	}
@@ -6227,7 +6248,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 			fclose(fp);
 			claws_unlink(tmp);
 			g_free(tmp);
-			return -2;
+			return COMPOSE_QUEUE_ERROR_WITH_ERRNO;
 		}
 	} else {
 		gint result = 0;
@@ -6235,7 +6256,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 			fclose(fp);
 			claws_unlink(tmp);
 			g_free(tmp);
-			return result - 1; /* -2 for a generic error, -3 for signing error, -4 for encoding */
+			return result;
 		}
 	}
 	if (err == TRUE) {
@@ -6243,13 +6264,13 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 		fclose(fp);
 		claws_unlink(tmp);
 		g_free(tmp);
-		return -2;
+		return COMPOSE_QUEUE_ERROR_WITH_ERRNO;
 	}
 	if (fclose(fp) == EOF) {
 		FILE_OP_ERROR(tmp, "fclose");
 		claws_unlink(tmp);
 		g_free(tmp);
-		return -2;
+		return COMPOSE_QUEUE_ERROR_WITH_ERRNO;
 	}
 
 	if (item && *item) {
@@ -6261,14 +6282,14 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 		g_warning("can't find queue folder");
 		claws_unlink(tmp);
 		g_free(tmp);
-		return -1;
+		return COMPOSE_QUEUE_ERROR_NO_MSG;
 	}
 	folder_item_scan(queue);
 	if ((num = folder_item_add_msg(queue, tmp, NULL, FALSE)) < 0) {
 		g_warning("can't queue the message");
 		claws_unlink(tmp);
 		g_free(tmp);
-		return -1;
+		return COMPOSE_QUEUE_ERROR_NO_MSG;
 	}
 	
 	if (msgpath == NULL) {
@@ -6286,7 +6307,7 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
 		*item = queue;
 	}
 
-	return 0;
+	return COMPOSE_QUEUE_SUCCESS;
 }
 
 static int compose_add_attachments(Compose *compose, MimeInfo *parent)
@@ -10194,7 +10215,7 @@ static void compose_send_cb(GtkAction *action, gpointer data)
 static void compose_send_later_cb(GtkAction *action, gpointer data)
 {
 	Compose *compose = (Compose *)data;
-	gint val;
+	ComposeQueueResult val;
 
 	inc_lock();
 	compose_allow_user_actions(compose, FALSE);
@@ -10202,25 +10223,12 @@ static void compose_send_later_cb(GtkAction *action, gpointer data)
 	compose_allow_user_actions(compose, TRUE);
 	inc_unlock();
 
-	if (!val) {
+	if (val == COMPOSE_QUEUE_SUCCESS) {
 		compose_close(compose);
-	} else if (val == -1) {
-		alertpanel_error(_("Could not queue message."));
-	} else if (val == -2) {
-		alertpanel_error(_("Could not queue message:\n\n%s."), g_strerror(errno));
-	} else if (val == -3) {
-		if (privacy_peek_error())
-		alertpanel_error(_("Could not queue message for sending:\n\n"
-				   "Signature failed: %s"), privacy_get_error());
-	} else if (val == -4) {
-		alertpanel_error(_("Could not queue message for sending:\n\n"
-				   "Charset conversion failed."));
-	} else if (val == -5) {
-		alertpanel_error(_("Could not queue message for sending:\n\n"
-				   "Couldn't get recipient encryption key."));
-	} else if (val == -6) {
-		/* silent error */
+	} else {
+		_display_queue_error(val);
 	}
+
 	toolbar_main_set_sensitive(mainwindow_get_mainwindow());
 }
 
diff --git a/src/compose.h b/src/compose.h
index fee1956..d0d920a 100644
--- a/src/compose.h
+++ b/src/compose.h
@@ -78,6 +78,17 @@ typedef enum
 	COMPOSE_REEDIT
 } ComposeMode;
 
+typedef enum
+{
+	COMPOSE_QUEUE_SUCCESS = 0,
+	COMPOSE_QUEUE_ERROR_NO_MSG = -1,
+	COMPOSE_QUEUE_ERROR_WITH_ERRNO = -2,
+	COMPOSE_QUEUE_ERROR_SIGNING_FAILED = -3,
+	COMPOSE_QUEUE_ERROR_ENCRYPT_FAILED = -4,
+	COMPOSE_QUEUE_ERROR_CHAR_CONVERSION = -5,
+	COMPOSE_QUEUE_ERROR_NO_ENCRYPTION_KEY = -6
+} ComposeQueueResult;
+
 typedef enum {
 	PREF_ACCOUNT,
 	PREF_FOLDER,
@@ -339,7 +350,7 @@ gboolean compose_search_string			(Compose	*compose,
 gboolean compose_search_string_backward	(Compose	*compose,
 						 const gchar	*str,
 						 gboolean	 case_sens);
-gint compose_queue			(Compose *compose, 
+ComposeQueueResult compose_queue	(Compose *compose,
 					 gint *msgnum, 
 					 FolderItem **item, 
 					 gchar **msgpath,
diff --git a/src/folder.c b/src/folder.c
index 3f35f5e..503a049 100644
--- a/src/folder.c
+++ b/src/folder.c
@@ -3474,7 +3474,7 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
 		for (; cur; cur = cur->next) {
 			Compose *compose = NULL;
 			FolderItem *queue = dest;
-			int val = 0;
+			ComposeQueueResult val = COMPOSE_QUEUE_SUCCESS;
 			
 			msginfo = (MsgInfo *)cur->data;
 			compose = compose_reedit(msginfo, TRUE);
@@ -3484,12 +3484,12 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
 			}
 			val = compose_queue(compose, NULL, &queue, NULL,
 					FALSE);
-			if (val < 0) {
+			if (val != COMPOSE_QUEUE_SUCCESS) {
 				queue_err = TRUE;
 			} else if (remove_source) {
 				folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
 			}
-			if (val == 0)
+			if (val == COMPOSE_QUEUE_SUCCESS)
 				compose_close(compose);
 		}
 		return queue_err ? -1:0;

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


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list