Fix bug #2964 'Lack of escaping of nested double-quotes in To: header'
[claws.git] / src / compose.c
index b36c56dd60a8d291171dab055c854d0d0ba483e2..48170ae1324197eca7dff36e0f130b1ad3838e83 100644 (file)
@@ -393,6 +393,8 @@ static void compose_insert_file_cb  (GtkAction      *action,
                                         gpointer        data);
 static void compose_insert_sig_cb      (GtkAction      *action,
                                         gpointer        data);
+static void compose_replace_sig_cb     (GtkAction      *action,
+                                        gpointer        data);
 
 static void compose_close_cb           (GtkAction      *action,
                                         gpointer        data);
@@ -588,6 +590,7 @@ static GtkActionEntry compose_entries[] =
        {"Message/AttachFile",          NULL, N_("_Attach file"), "<control>M", NULL, G_CALLBACK(compose_attach_cb) },
        {"Message/InsertFile",          NULL, N_("_Insert file"), "<control>I", NULL, G_CALLBACK(compose_insert_file_cb) },
        {"Message/InsertSig",           NULL, N_("Insert si_gnature"), "<control>G", NULL, G_CALLBACK(compose_insert_sig_cb) },
+       {"Message/ReplaceSig",          NULL, N_("_Replace signature"), NULL, NULL, G_CALLBACK(compose_replace_sig_cb) },
        /* {"Message/---",              NULL, "---" }, */
        {"Message/Save",                NULL, N_("_Save"), "<control>S", NULL, G_CALLBACK(compose_save_cb) }, /*COMPOSE_KEEP_EDITING*/
        /* {"Message/---",              NULL, "---" }, */
@@ -2491,6 +2494,7 @@ Compose *compose_redirect(PrefsAccount *account, MsgInfo *msginfo,
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/InsertFile", FALSE);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/AttachFile", FALSE);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/InsertSig", FALSE);
+       cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/ReplaceSig", FALSE);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit", FALSE);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Options", FALSE);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Tools/ShowRuler", FALSE);
@@ -4733,7 +4737,7 @@ compose_current_mail_account(void)
 
 #define QUOTE_IF_REQUIRED(out, str)                                    \
 {                                                                      \
-       if (*str != '"' && strpbrk(str, ",.:;[]<>()@\\")) {             \
+       if (*str != '"' && strpbrk(str, ",.:;[]<>()@\\\"")) {           \
                gchar *__tmp;                                           \
                gint len;                                               \
                                                                        \
@@ -4761,7 +4765,7 @@ compose_current_mail_account(void)
 
 #define QUOTE_IF_REQUIRED_NORMAL(out, str, errret)                     \
 {                                                                      \
-       if (*str != '"' && strpbrk(str, ",.:;[]<>()@\\")) {             \
+       if (*str != '"' && strpbrk(str, ",.:;[]<>()@\\\"")) {           \
                gchar *__tmp;                                           \
                gint len;                                               \
                                                                        \
@@ -4798,10 +4802,13 @@ static void compose_select_account(Compose *compose, PrefsAccount *account,
 
        compose->account = account;
        if (account->name && *account->name) {
-               gchar *buf;
+               gchar *buf, *qbuf;
                QUOTE_IF_REQUIRED_NORMAL(buf, account->name, return);
+               qbuf = escape_internal_quotes(buf, '"');
                from = g_strdup_printf("%s <%s>",
-                                      buf, account->address);
+                                      qbuf, account->address);
+               if (qbuf != buf)
+                       g_free(qbuf);
                gtk_entry_set_text(GTK_ENTRY(compose->from_name), from);
        } else {
                from = g_strdup_printf("<%s>",
@@ -6139,12 +6146,14 @@ static gchar *compose_quote_list_of_addresses(gchar *str)
                gchar *spec = item->data;
                gchar *endofname = strstr(spec, " <");
                if (endofname != NULL) {
+                       gchar * qqname;
                        *endofname = '\0';
                        QUOTE_IF_REQUIRED_NORMAL(qname, spec, return NULL);
+                       qqname = escape_internal_quotes(qname, '"');
                        *endofname = ' ';
-                       if (*qname != *spec) { /* has been quoted, compute new */
+                       if (*qname != *spec || qqname != qname) { /* has been quoted, compute new */
                                gchar *addr = g_strdup(endofname);
-                               gchar *name = g_strdup(qname);
+                               gchar *name = (qqname != qname)? qqname: g_strdup(qname);
                                faddr = g_strconcat(name, addr, NULL);
                                g_free(name);
                                g_free(addr);
@@ -6335,13 +6344,17 @@ static gchar *compose_get_header(Compose *compose)
        
        
        if (from_name && *from_name) {
+               gchar *qname;
                compose_convert_header
                        (compose, buf, sizeof(buf), from_name,
                         strlen("From: "), TRUE);
                QUOTE_IF_REQUIRED(name, buf);
+               qname = escape_internal_quotes(name, '"');
                
                g_string_append_printf(header, "From: %s <%s>\n",
-                       name, from_address);
+                       qname, from_address);
+               if (qname != name)
+                       g_free(qname);
        } else
                g_string_append_printf(header, "From: %s\n", from_address);
        
@@ -7438,6 +7451,7 @@ static Compose *compose_create(PrefsAccount *account,
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "AttachFile", "Message/AttachFile", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "InsertFile", "Message/InsertFile", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "InsertSig", "Message/InsertSig", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "ReplaceSig", "Message/ReplaceSig", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "Save", "Message/Save", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
@@ -9287,6 +9301,7 @@ static void compose_set_ext_editor_sensitive(Compose *compose,
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/SendLater", sensitive);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/InsertFile", sensitive);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/InsertSig", sensitive);
+       cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/ReplaceSig", sensitive);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit/WrapPara", sensitive);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit/WrapAllLines", sensitive);
        cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit/ExtEditor", sensitive);
@@ -10011,6 +10026,13 @@ static void compose_insert_sig_cb(GtkAction *action, gpointer data)
        compose_insert_sig(compose, FALSE);
 }
 
+static void compose_replace_sig_cb(GtkAction *action, gpointer data)
+{
+       Compose *compose = (Compose *)data;
+
+       compose_insert_sig(compose, TRUE);
+}
+
 static gint compose_delete_cb(GtkWidget *widget, GdkEventAny *event,
                              gpointer data)
 {