From 6087cc3a307354fbecb392e7c82b2703f1b7fc01 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Sat, 13 Aug 2016 14:37:35 +0300 Subject: [PATCH] [PATCH v2 11/14] cli/reply: return internet address list from get header funcs --- 57/49aacecf81875c15f0876dd73e54b0f601baa2 | 265 ++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 57/49aacecf81875c15f0876dd73e54b0f601baa2 diff --git a/57/49aacecf81875c15f0876dd73e54b0f601baa2 b/57/49aacecf81875c15f0876dd73e54b0f601baa2 new file mode 100644 index 000000000..20e8afa15 --- /dev/null +++ b/57/49aacecf81875c15f0876dd73e54b0f601baa2 @@ -0,0 +1,265 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by arlo.cworth.org (Postfix) with ESMTP id A6C836DE37B9 + for ; Sat, 13 Aug 2016 04:40:57 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" +X-Spam-Flag: NO +X-Spam-Score: -0.574 +X-Spam-Level: +X-Spam-Status: No, score=-0.574 tagged_above=-999 required=5 tests=[AWL=0.146, + DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_LOW=-0.7, + RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01] autolearn=disabled +Received: from arlo.cworth.org ([127.0.0.1]) + by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id DC3JgMCZkVxP for ; + Sat, 13 Aug 2016 04:40:49 -0700 (PDT) +Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com + [74.125.82.66]) by arlo.cworth.org (Postfix) with ESMTPS id 3D14F6DE396D for + ; Sat, 13 Aug 2016 04:39:20 -0700 (PDT) +Received: by mail-wm0-f66.google.com with SMTP id q128so2021406wma.1 + for ; Sat, 13 Aug 2016 04:39:20 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=nikula-org.20150623.gappssmtp.com; s=20150623; + h=from:to:cc:subject:date:message-id:in-reply-to:references + :in-reply-to:references; + bh=RiruvyPTe4M6SzkyFmUG/Rd/HLQ1Tvqhpp5XQSylaXA=; + b=koCYhZb2Wlm9FhlWO1fF38B1fJ6Jerv/jAG5AvQHNnpqYtN6reUM10F9O62VcMJR6C + trP51VpLUCAnsDAXkBQST7W5FN9DapHfee/+aEA1NHV/1zaJ3ynHwJjTT6f7hjErN7HY + fhW1t9JCpq7QFWoW5F89RE8LsIBqFSUtmTBg6FIbHcd6YZj8hEgF16089XeTuLpE9PdI + Swqk6pNoZMXUoQqcsk+jeSXF1n/6lazapQkR230AQSDxKUVz6SRebXoXU7TfpxhET7Dk + IJaGeohUNcp7RqT1v1Y5fczipS2EhjxJmWOqDSYdP0PrZQ26uCdZAf/6LAJPRM4UKUVT + LjOA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20130820; + h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to + :references:in-reply-to:references; + bh=RiruvyPTe4M6SzkyFmUG/Rd/HLQ1Tvqhpp5XQSylaXA=; + b=bLhuFoBqLzWcjN9QKV7eUWSZATGTg/I2vN7hXo7ghkFKAC6/h/BADWaPPavm2Fa7qA + x8Np0RqgQzoDmyibk1j/RcZwW3WpPAf+sdmyxCOGlYe7m60moyCIShhnsOiSQpmtIDVX + JiOqt6Q5dw1sYi0vSy1HZHXTWYwEpwq7RB7ce6iUhwA13eK6PhDqNVs/4yW6DPmf5FK8 + +DM9z04B2fHYGgyvWX5EwQoOxl7lBW6T6odeKf+UGkzXeeIiUrYc7/LT69uaBx09vX3V + P76q1/wRX/mF+CMygir5j4y4F65mVfVnYAttSy0Or+TKZYVlf0wJwflnoQSbxorVoAEi + n8bQ== +X-Gm-Message-State: + AEkooutj4XTbqiCndVryfO8ggmlIzXyI3YQjmj6CvI9ZPwzrUJ/UKMuL+4OYaLn27cAJrQ== +X-Received: by 10.194.67.198 with SMTP id p6mr19801346wjt.138.1471088358835; + Sat, 13 Aug 2016 04:39:18 -0700 (PDT) +Received: from localhost (mobile-access-bcee63-250.dhcp.inet.fi. + [188.238.99.250]) + by smtp.gmail.com with ESMTPSA id b203sm6796561wmh.20.2016.08.13.04.39.18 + (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Sat, 13 Aug 2016 04:39:18 -0700 (PDT) +From: Jani Nikula +To: notmuch@notmuchmail.org +Cc: Daniel Kahn Gillmor , + jani@nikula.org +Subject: [PATCH v2 11/14] cli/reply: return internet address list from get + header funcs +Date: Sat, 13 Aug 2016 14:37:35 +0300 +Message-Id: + +X-Mailer: git-send-email 2.1.4 +In-Reply-To: +References: +In-Reply-To: +References: +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.20 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Sat, 13 Aug 2016 11:40:57 -0000 + +Pass in GMimeMessage to simplify To/Cc/Bcc headers. We'll eventually +remove the notmuch message passing altogether, but keep both for now +to not make too big changes at once. + +Getting the headers from GMimeMessage using GMime functions fixes the +error on duplicate Cc headers reported by Daniel Kahn Gillmor + in id:87d1ngv95p.fsf@alice.fifthhorseman.net. + +Get rid of an intermediate function. + +The small annoyance is the ownership differences in the address lists. +--- + notmuch-reply.c | 73 ++++++++++++++++++++++-------------------------------- + test/T220-reply.sh | 1 - + 2 files changed, 30 insertions(+), 44 deletions(-) + +diff --git a/notmuch-reply.c b/notmuch-reply.c +index d90f46f9bed3..98034485c546 100644 +--- a/notmuch-reply.c ++++ b/notmuch-reply.c +@@ -227,31 +227,6 @@ scan_address_list (InternetAddressList *list, + return n; + } + +-/* Scan addresses in 'recipients'. +- * +- * See the documentation of scan_address_list() above. This function +- * does exactly the same, but converts 'recipients' to an +- * InternetAddressList first. +- */ +-static unsigned int +-scan_address_string (const char *recipients, +- notmuch_config_t *config, +- GMimeMessage *message, +- GMimeRecipientType type, +- const char **user_from) +-{ +- InternetAddressList *list; +- +- if (recipients == NULL) +- return 0; +- +- list = internet_address_list_parse_string (recipients); +- if (list == NULL) +- return 0; +- +- return scan_address_list (list, config, message, type, user_from); +-} +- + /* Does the address in the Reply-To header of 'message' already appear + * in either the 'To' or 'Cc' header of the message? + */ +@@ -287,11 +262,12 @@ reply_to_header_is_redundant (notmuch_message_t *message, const char *reply_to) + return 0; + } + +-static const char *get_sender(notmuch_message_t *message) ++static InternetAddressList *get_sender(notmuch_message_t *message, ++ GMimeMessage *mime_message) + { + const char *reply_to; + +- reply_to = notmuch_message_get_header (message, "reply-to"); ++ reply_to = g_mime_message_get_reply_to (mime_message); + if (reply_to && *reply_to) { + /* + * Some mailing lists munge the Reply-To header despite it +@@ -307,25 +283,32 @@ static const char *get_sender(notmuch_message_t *message) + * will always appear in the reply if reply_all is true. + */ + if (! reply_to_header_is_redundant (message, reply_to)) +- return reply_to; ++ return internet_address_list_parse_string (reply_to); + } + +- return notmuch_message_get_header (message, "from"); ++ return internet_address_list_parse_string ( ++ g_mime_message_get_sender (mime_message)); + } + +-static const char *get_to(notmuch_message_t *message) ++static InternetAddressList *get_to(unused(notmuch_message_t *message), ++ GMimeMessage *mime_message) + { +- return notmuch_message_get_header (message, "to"); ++ return g_mime_message_get_recipients (mime_message, ++ GMIME_RECIPIENT_TYPE_TO); + } + +-static const char *get_cc(notmuch_message_t *message) ++static InternetAddressList *get_cc(unused(notmuch_message_t *message), ++ GMimeMessage *mime_message) + { +- return notmuch_message_get_header (message, "cc"); ++ return g_mime_message_get_recipients (mime_message, ++ GMIME_RECIPIENT_TYPE_CC); + } + +-static const char *get_bcc(notmuch_message_t *message) ++static InternetAddressList *get_bcc(unused(notmuch_message_t *message), ++ GMimeMessage *mime_message) + { +- return notmuch_message_get_header (message, "bcc"); ++ return g_mime_message_get_recipients (mime_message, ++ GMIME_RECIPIENT_TYPE_BCC); + } + + /* Augment the recipients of 'reply' from the "Reply-to:", "From:", +@@ -344,10 +327,12 @@ static const char * + add_recipients_from_message (GMimeMessage *reply, + notmuch_config_t *config, + notmuch_message_t *message, ++ GMimeMessage *mime_message, + notmuch_bool_t reply_all) + { + struct { +- const char * (*get_header)(notmuch_message_t *message); ++ InternetAddressList * (*get_header)(notmuch_message_t *message, ++ GMimeMessage *mime_message); + GMimeRecipientType recipient_type; + } reply_to_map[] = { + { get_sender, GMIME_RECIPIENT_TYPE_TO }, +@@ -360,12 +345,12 @@ add_recipients_from_message (GMimeMessage *reply, + unsigned int n = 0; + + for (i = 0; i < ARRAY_SIZE (reply_to_map); i++) { +- const char *recipients; ++ InternetAddressList *recipients; + +- recipients = reply_to_map[i].get_header (message); ++ recipients = reply_to_map[i].get_header (message, mime_message); + +- n += scan_address_string (recipients, config, reply, +- reply_to_map[i].recipient_type, &from_addr); ++ n += scan_address_list (recipients, config, reply, ++ reply_to_map[i].recipient_type, &from_addr); + + if (!reply_all && n) { + /* Stop adding new recipients in reply-to-sender mode if +@@ -536,6 +521,7 @@ static GMimeMessage * + create_reply_message(void *ctx, + notmuch_config_t *config, + notmuch_message_t *message, ++ GMimeMessage *mime_message, + notmuch_bool_t reply_all, + notmuch_bool_t limited) + { +@@ -566,8 +552,8 @@ create_reply_message(void *ctx, + + g_mime_object_set_header (GMIME_OBJECT (reply), "References", references); + +- from_addr = add_recipients_from_message (reply, config, +- message, reply_all); ++ from_addr = add_recipients_from_message (reply, config, message, ++ mime_message, reply_all); + + /* The above is all that is needed for limited headers. */ + if (limited) +@@ -666,7 +652,8 @@ static int do_reply(notmuch_config_t *config, + if (mime_node_open (config, message, ¶ms->crypto, &node)) + return 1; + +- reply = create_reply_message (config, config, message, reply_all, ++ reply = create_reply_message (config, config, message, ++ GMIME_MESSAGE (node->part), reply_all, + format == FORMAT_HEADERS_ONLY); + if (!reply) + return 1; +diff --git a/test/T220-reply.sh b/test/T220-reply.sh +index d6f3a839ca48..47ba5d38e18d 100755 +--- a/test/T220-reply.sh ++++ b/test/T220-reply.sh +@@ -254,7 +254,6 @@ test_expect_equal_json "$output" ' + }' + + test_begin_subtest "Reply to a message with multiple Cc headers" +-test_subtest_known_broken + cat > "${MAIL_DIR}"/broken_cc < + To: Daniel Kahn Gillmor +-- +2.1.4 + -- 2.26.2