changeset 6660:a7d462ed94df HEAD

Fix handling envelope senders containing spaces.
author Timo Sirainen <tss@iki.fi>
date Fri, 02 Nov 2007 17:29:25 +0200
parents d9fb00afbc25
children dbe6224b0309
files src/deliver/deliver.c
diffstat 1 files changed, 23 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/deliver/deliver.c	Fri Nov 02 17:28:43 2007 +0200
+++ b/src/deliver/deliver.c	Fri Nov 02 17:29:25 2007 +0200
@@ -20,6 +20,7 @@
 #include "str-sanitize.h"
 #include "strescape.h"
 #include "var-expand.h"
+#include "rfc822-parser.h"
 #include "message-address.h"
 #include "message-header-parser.h"
 #include "istream-header-filter.h"
@@ -451,10 +452,24 @@
 	return str_c(str);
 }
 
+static const char *escape_local_part(const char *local_part)
+{
+	const char *p;
+
+	/* if there are non-atext chars, we need to return quoted-string */
+	for (p = local_part; *p != '\0'; p++) {
+		if (!IS_ATEXT(*p)) {
+			return t_strdup_printf("\"%s\"",
+					       str_escape(local_part));
+		}
+	}
+	return local_part;
+}
+
 static const char *address_sanitize(const char *address)
 {
 	struct message_address *addr;
-	const char *ret;
+	const char *ret, *mailbox;
 	pool_t pool;
 
 	pool = pool_alloconly_create("address sanitizer", 256);
@@ -464,10 +479,13 @@
 	if (addr == NULL || addr->mailbox == NULL || addr->domain == NULL ||
 	    *addr->mailbox == '\0')
 		ret = DEFAULT_ENVELOPE_SENDER;
-	else if (*addr->domain == '\0')
-		ret = t_strdup(addr->mailbox);
-	else
-		ret = t_strdup_printf("%s@%s", addr->mailbox, addr->domain);
+	else {
+		mailbox = escape_local_part(addr->mailbox);
+		if (*addr->domain == '\0')
+			ret = t_strdup(mailbox);
+		else
+			ret = t_strdup_printf("%s@%s", mailbox, addr->domain);
+	}
 	pool_unref(&pool);
 	return ret;
 }