From 038274feb6024d0528e8e21876eae895bebf44e5 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Tue, 18 Feb 2020 23:27:03 +0100
Subject: [PATCH] global: Properly parse Message-ID header.

Use mail_get_message_id() instead of just mail_get_first_header().
---
 src/lib-sieve/plugins/duplicate/tst-duplicate.c   |  3 +--
 src/plugins/imap-filter-sieve/imap-filter-sieve.c |  2 +-
 src/plugins/imapsieve/imap-sieve.c                |  3 +--
 src/plugins/lda-sieve/lda-sieve-plugin.c          |  2 +-
 src/sieve-tools/sieve-filter.c                    |  2 +-
 src/sieve-tools/sieve-test.c                      |  2 +-
 src/testsuite/testsuite-message.c                 | 10 ++++++++--
 7 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/lib-sieve/plugins/duplicate/tst-duplicate.c b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
index db3756b36..2a000de2b 100644
--- a/src/lib-sieve/plugins/duplicate/tst-duplicate.c
+++ b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
@@ -403,8 +403,7 @@ tst_duplicate_operation_execute(const struct sieve_runtime_env *renv,
 		val_len = str_len(uniqueid);
 	} else {
 		if (header == NULL) {
-			ret = mail_get_first_header_utf8(mail, "Message-ID",
-							 &val);
+			ret = mail_get_message_id(mail, &val);
 			if (ret < 0) {
 				return sieve_runtime_mail_error(
 					renv, mail, "duplicate test: "
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 5f6b29adc..97e8faa07 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -954,7 +954,7 @@ imap_sieve_filter_get_msgdata(struct imap_filter_sieve_context *sctx,
 	msgdata_r->envelope.mail_from = mail_from;
 	msgdata_r->envelope.rcpt_to = rcpt_to;
 	msgdata_r->auth_user = user->username;
-	(void)mail_get_first_header(mail, "Message-ID", &msgdata_r->id);
+	(void)mail_get_message_id(mail, &msgdata_r->id);
 }
 
 int imap_sieve_filter_run_mail(struct imap_filter_sieve_context *sctx,
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index e701c63c3..a3ab53fd4 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -819,8 +819,7 @@ int imap_sieve_run_mail(struct imap_sieve_run *isrun, struct mail *mail,
 		i_zero(&msgdata);
 		msgdata.mail = mail;
 		msgdata.auth_user = user->username;
-		(void)mail_get_first_header(msgdata.mail, "Message-ID",
-					    &msgdata.id);
+		(void)mail_get_message_id(msgdata.mail, &msgdata.id);
 
 		/* Compose script execution environment */
 
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 979976f0b..2f51cfc1d 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -944,7 +944,7 @@ lda_sieve_execute(struct lda_sieve_run_context *srctx,
 	msgdata.envelope.mail_params = &mdctx->mail_params;
 	msgdata.envelope.rcpt_to = mdctx->rcpt_to;
 	msgdata.envelope.rcpt_params = &mdctx->rcpt_params;
-	(void)mail_get_first_header(msgdata.mail, "Message-ID", &msgdata.id);
+	(void)mail_get_message_id(msgdata.mail, &msgdata.id);
 
 	srctx->msgdata = &msgdata;
 
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index 6ef92100f..d71f4bcad 100644
--- a/src/sieve-tools/sieve-filter.c
+++ b/src/sieve-tools/sieve-filter.c
@@ -108,7 +108,7 @@ static int filter_message(struct sieve_filter_context *sfctx, struct mail *mail)
 	i_zero(&msgdata);
 	msgdata.mail = mail;
 	msgdata.auth_user = senv->user->username;
-	(void)mail_get_first_header(mail, "Message-ID", &msgdata.id);
+	(void)mail_get_message_id(mail, &msgdata.id);
 	senv->script_context = &msgdata;
 
 	sieve_tool_get_envelope_data(&msgdata, mail, NULL, NULL, NULL);
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index 92793920b..b623b6714 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -310,7 +310,7 @@ int main(int argc, char **argv)
 		i_zero(&msgdata);
 		msgdata.mail = mail;
 		msgdata.auth_user = sieve_tool_get_username(sieve_tool);
-		(void)mail_get_first_header(mail, "Message-ID", &msgdata.id);
+		(void)mail_get_message_id(mail, &msgdata.id);
 
 		sieve_tool_get_envelope_data(&msgdata, mail,
 					     mail_from, rcpt_to, final_rcpt_to);
diff --git a/src/testsuite/testsuite-message.c b/src/testsuite/testsuite-message.c
index 4f5752b3e..c04ab3445 100644
--- a/src/testsuite/testsuite-message.c
+++ b/src/testsuite/testsuite-message.c
@@ -42,6 +42,7 @@ static struct smtp_address *testsuite_env_orig_rcpt_to = NULL;
 static char *testsuite_env_auth = NULL;
 
 static pool_t testsuite_msg_pool;
+static char *testsuite_msg_id = NULL;
 
 static const struct smtp_address *
 testsuite_message_get_address(struct mail *mail, const char *header)
@@ -62,6 +63,7 @@ testsuite_message_get_address(struct mail *mail, const char *header)
 static void testsuite_message_set_data(struct mail *mail)
 {
 	const struct smtp_address *recipient = NULL, *sender = NULL;
+	const char *msg_id;
 
 	static const struct smtp_address default_recipient = {
 		.localpart = "recipient",
@@ -76,6 +78,7 @@ static void testsuite_message_set_data(struct mail *mail)
 	i_free(testsuite_env_rcpt_to);
 	i_free(testsuite_env_orig_rcpt_to);
 	i_free(testsuite_env_auth);
+	i_free(testsuite_msg_id);
 
 	/*
 	 * Collect necessary message data
@@ -101,18 +104,20 @@ static void testsuite_message_set_data(struct mail *mail)
 	testsuite_env_rcpt_to = smtp_address_clone(default_pool, recipient);
 	testsuite_env_orig_rcpt_to = smtp_address_clone(default_pool, recipient);
 
+	(void)mail_get_message_id(mail, &msg_id);
+	testsuite_msg_id = i_strdup(msg_id);
+
 	i_zero(&testsuite_msgdata);
 	testsuite_msgdata.mail = mail;
 	testsuite_msgdata.auth_user = sieve_tool_get_username(sieve_tool);
 	testsuite_msgdata.envelope.mail_from = testsuite_env_mail_from;
 	testsuite_msgdata.envelope.rcpt_to = testsuite_env_rcpt_to;
+	testsuite_msgdata.id = testsuite_msg_id;
 
 	i_zero(&testsuite_rcpt_params);
 	testsuite_rcpt_params.orcpt.addr = testsuite_env_orig_rcpt_to;
 
 	testsuite_msgdata.envelope.rcpt_params = &testsuite_rcpt_params;
-
-	(void)mail_get_first_header(mail, "Message-ID", &testsuite_msgdata.id);
 }
 
 void testsuite_message_init(void)
@@ -160,6 +165,7 @@ void testsuite_message_deinit(void)
 	i_free(testsuite_env_orig_rcpt_to);
 	i_free(testsuite_env_auth);
 	pool_unref(&testsuite_msg_pool);
+	i_free(testsuite_msg_id);
 }
 
 void testsuite_envelope_set_sender_address(const struct sieve_runtime_env *renv,
-- 
GitLab