Do ignore empty recipients when checking names
[modest] / src / modest-tny-msg.c
index 8e4c86f..2869c3b 100644 (file)
@@ -167,12 +167,12 @@ modest_tny_msg_new_html_plain (const gchar* mailto, const gchar* from, const gch
 
        if (in_reply_to)
                tny_mime_part_set_header_pair (TNY_MIME_PART (new_msg), "In-Reply-To", in_reply_to);
-       
-       /* Add the body of the new mail */      
+
+       /* Add the body of the new mail */
        add_body_part (new_msg, plain_body, content_type);
        add_html_body_part (new_msg, html_body);
        g_free (content_type);
-                      
+
        /* Add attachments */
        tmp_attached = add_attachments (TNY_MIME_PART (new_msg), attachments, FALSE, err);
        if (attached)
@@ -343,12 +343,19 @@ add_attachments (TnyMimePart *part, GList *attachments_list, gboolean add_inline
                                                                       "inline");
                                } else {
                                        const gchar *filename;
+
                                        filename = tny_mime_part_get_filename (old_attachment);
-                                       if (filename)
-                                               tny_mime_part_set_filename (attachment_part, filename);
-                                       else
+                                       if (filename) {
+                                               /* If the mime part has a filename do not set it again
+                                                  because Camel won't replace the old one. Instead it
+                                                  will append the filename to the old one and that will
+                                                  mislead email clients */
+                                               if (!tny_mime_part_get_filename (attachment_part))
+                                                       tny_mime_part_set_filename (attachment_part, filename);
+                                       } else {
                                                tny_mime_part_set_header_pair (attachment_part, "Content-Disposition",
                                                                               "attachment");
+                                       }
                                }
                                if (!TNY_IS_MSG (old_attachment))  {
                                        tny_mime_part_set_transfer_encoding (TNY_MIME_PART (attachment_part), "base64");
@@ -657,7 +664,6 @@ create_reply_forward_mail (TnyMsg *msg, TnyHeader *header, const gchar *from,
        TnyMimePart *body = NULL;
        TnyMimePart *html_body = NULL;
        ModestFormatter *formatter;
-       gchar *subject_prefix;
        gboolean no_text_part;
        gchar *parent_uid;
        gboolean forward_as_attach = FALSE;
@@ -711,16 +717,10 @@ create_reply_forward_mail (TnyMsg *msg, TnyHeader *header, const gchar *from,
        tny_header_set_replyto (new_header, from);
 
        /* Change the subject */
-       if (is_reply)
-               subject_prefix = g_strconcat (_("mail_va_re"), ":", NULL);
-       else
-               subject_prefix = g_strconcat (_("mail_va_fw"), ":", NULL);
        old_subject = tny_header_dup_subject (header);
        new_subject =
-               (gchar *) modest_text_utils_derived_subject (old_subject,
-                                                            subject_prefix);
+               (gchar *) modest_text_utils_derived_subject (old_subject, is_reply);
        g_free (old_subject);
-       g_free (subject_prefix);
        tny_header_set_subject (new_header, (const gchar *) new_subject);
        g_free (new_subject);
 
@@ -961,6 +961,8 @@ static gchar*
 get_new_to (TnyMsg *msg, TnyHeader *header, const gchar* from,
            ModestTnyMsgReplyMode reply_mode)
 {
+       const gchar *reply_header = "Reply-To:";
+       const gchar *from_header = "From:";
        gchar* old_reply_to;
        gchar* old_from;
        gchar* new_to;
@@ -981,13 +983,25 @@ get_new_to (TnyMsg *msg, TnyHeader *header, const gchar* from,
        old_reply_to = modest_tny_mime_part_get_header_value (TNY_MIME_PART(msg), 
                                                              "Reply-To"); 
        old_from     = tny_header_dup_from (header);
-       
+
        if (!old_from && !old_reply_to) {
                g_debug ("%s: failed to get either Reply-To: or From: from header",
                           __FUNCTION__);
                return NULL;
        }
-       
+
+       /* Prevent DoS attacks caused by malformed emails */
+       if (old_from) {
+               gchar *tmp = old_from;
+               old_from = modest_text_utils_get_secure_header ((const gchar *) tmp, from_header);
+               g_free (tmp);
+       }
+       if (old_reply_to) {
+               gchar *tmp = old_reply_to;
+               old_reply_to = modest_text_utils_get_secure_header ((const gchar *) tmp, reply_header);
+               g_free (tmp);
+       }
+
        /* for mailing lists, use both Reply-To and From if we did a
         * 'Reply All:'
         * */
@@ -1137,6 +1151,14 @@ modest_tny_msg_get_references (TnyMsg *msg, gchar **message_id, gchar **referenc
        }
 }
 
+static void
+remove_line_breaks (gchar *str)
+{
+       gchar *needle = g_strrstr (str, "\r\n");
+       if (needle)
+               *needle = '\0';
+}
+
 static void 
 set_references (TnyMsg *reply_msg, TnyMsg *original_msg)
 {
@@ -1171,14 +1193,18 @@ set_references (TnyMsg *reply_msg, TnyMsg *original_msg)
        g_free (orig_message_id);
 
        if (in_reply_to) {
+               remove_line_breaks (in_reply_to);
                tny_mime_part_set_header_pair (TNY_MIME_PART (reply_msg), "In-Reply-To", in_reply_to);
+               g_free (in_reply_to);
        }
        if (references) {
+               remove_line_breaks (references);
                tny_mime_part_set_header_pair (TNY_MIME_PART (reply_msg), "References", references);
+               g_free (references);
        }
 }
 
-TnyMsg* 
+TnyMsg*
 modest_tny_msg_create_reply_msg (TnyMsg *msg,
                                 TnyHeader *header,
                                 const gchar *from,
@@ -1309,56 +1335,32 @@ modest_tny_msg_header_get_all_recipients_list (TnyHeader *header)
 {
        GSList *recipients = NULL;
        gchar *from = NULL, *to = NULL, *cc = NULL, *bcc = NULL;
-       gchar *after_remove;
-       GString *buffer;
-       gboolean add_separator = TRUE;
+       gchar *after_remove, *joined;
 
        if (header == NULL)
                return NULL;
 
-       buffer = g_string_new ("");
-
        from = tny_header_dup_from (header);
        to = tny_header_dup_to (header);
        cc = tny_header_dup_cc (header);
        bcc = tny_header_dup_bcc (header);
 
-       recipients = NULL;
-       if (from) {
-               buffer = g_string_append (buffer, from);
-               add_separator = TRUE;
-       }
-       if (to) {
-               if (add_separator)
-                       buffer = g_string_append (buffer, "; ");
-               else
-                       add_separator = TRUE;
-
-               buffer = g_string_append (buffer, to);
-       }
-       if (cc) {
-               if (add_separator)
-                       buffer = g_string_append (buffer, "; ");
-               else
-                       add_separator = TRUE;
-
-               buffer = g_string_append (buffer, cc);
-       }
-       if (bcc) {
-               if (add_separator)
-                       buffer = g_string_append (buffer, "; ");
-               else
-                       add_separator = TRUE;
-
-               buffer = g_string_append (buffer, bcc);
-       }
-
-       after_remove = modest_text_utils_remove_duplicate_addresses (buffer->str);
-       g_string_free (buffer, TRUE);
+       joined = modest_text_utils_join_addresses (from, to, cc, bcc);
+       after_remove = modest_text_utils_remove_duplicate_addresses (joined);
+       g_free (joined);
 
        recipients = modest_text_utils_split_addresses_list (after_remove);
        g_free (after_remove);
 
+       if (from)
+               g_free (from);
+       if (to)
+               g_free (to);
+       if (cc)
+               g_free (cc);
+       if (bcc)
+               g_free (bcc);
+
        return recipients;
 }