changeset 4636:630e6121fb8d HEAD

Added -f parameter to specify the envelope sender which is used in mbox From-lines.
author Timo Sirainen <tss@iki.fi>
date Sun, 08 Oct 2006 22:24:37 +0300
parents 210bb1ff0e6e
children 0af548f101f8
files src/deliver/deliver.c
diffstat 1 files changed, 35 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/deliver/deliver.c	Sun Oct 08 22:22:33 2006 +0300
+++ b/src/deliver/deliver.c	Sun Oct 08 22:24:37 2006 +0300
@@ -30,6 +30,7 @@
 #define DEFAULT_CONFIG_FILE SYSCONFDIR"/dovecot.conf"
 #define DEFAULT_AUTH_SOCKET_PATH PKG_RUNDIR"/auth-master"
 #define DEFAULT_SENDMAIL_PATH "/usr/lib/sendmail"
+#define DEFAULT_ENVELOPE_SENDER "dovecot.deliver"
 
 /* After buffer grows larger than this, create a temporary file to /tmp
    where to read the mail. */
@@ -135,7 +136,7 @@
 	addr = str == NULL ? NULL :
 		message_address_parse(pool_datastack_create(),
 				      (const unsigned char *)str,
-				      strlen(str), 1);
+				      strlen(str), 1, FALSE);
 	return addr == NULL || addr->mailbox == NULL || addr->domain == NULL ?
 		NULL : t_strconcat(addr->mailbox, "@", addr->domain, NULL);
 }
@@ -293,14 +294,35 @@
 	return str_c(str);
 }
 
-static struct istream *create_mbox_stream(int fd)
+static const char *address_sanitize(const char *address)
+{
+	struct message_address *addr;
+	const char *ret;
+	pool_t pool;
+
+	pool = pool_alloconly_create("address sanitizer", 128);
+	addr = message_address_parse(pool, (const unsigned char *)address,
+				     strlen(address), 1, FALSE);
+	if (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);
+	pool_unref(pool);
+	return ret;
+}
+
+static struct istream *create_mbox_stream(int fd, const char *envelope_sender)
 {
 	const char *mbox_hdr;
 	struct istream *input_list[4], *input;
 
 	fd_set_nonblock(fd, FALSE);
 
-	mbox_hdr = mbox_from_create("dovecot.deliver", ioloop_time);
+	envelope_sender = address_sanitize(envelope_sender);
+	mbox_hdr = mbox_from_create(envelope_sender, ioloop_time);
 
 	input_list[0] = i_stream_create_from_data(default_pool, mbox_hdr,
 						  strlen(mbox_hdr));
@@ -347,6 +369,7 @@
 int main(int argc, char *argv[])
 {
 	const char *config_path = DEFAULT_CONFIG_FILE;
+	const char *envelope_sender = DEFAULT_ENVELOPE_SENDER;
 	const char *mailbox = "INBOX";
 	const char *auth_socket, *env_tz;
 	const char *home, *destination, *user, *mail_env, *value;
@@ -408,6 +431,14 @@
 					       "Missing mailbox argument");
 			}
 			mailbox = argv[i];
+		} else if (strcmp(argv[i], "-f") == 0) {
+			/* envelope sender address */
+			i++;
+			if (i == argc) {
+				i_fatal_status(EX_USAGE,
+					       "Missing envleope argument");
+			}
+			envelope_sender = argv[i];
 		} else {
 			print_help();
 			i_fatal_status(EX_USAGE,
@@ -515,7 +546,7 @@
 
 	mbox_storage = mail_storage_create("mbox", "/tmp", destination, 0,
 					   MAIL_STORAGE_LOCK_FCNTL);
-	input = create_mbox_stream(0);
+	input = create_mbox_stream(0, envelope_sender);
 	box = mailbox_open(mbox_storage, "Dovecot Delivery Mail", input,
 			   MAILBOX_OPEN_NO_INDEX_FILES |
 			   MAILBOX_OPEN_MBOX_ONE_MSG_ONLY);