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