dovecot: Another try, -d is now destination user as originally a...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 30 17:51:30 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/9b71007b70c7
changeset: 6518:9b71007b70c7
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 30 17:51:25 2007 +0300
description:
Another try, -d is now destination user as originally and -a is now
destination address.

diffstat:

1 file changed, 33 insertions(+), 40 deletions(-)
src/deliver/deliver.c |   73 ++++++++++++++++++++++---------------------------

diffs (182 lines):

diff -r 4e92a6c44b44 -r 9b71007b70c7 src/deliver/deliver.c
--- a/src/deliver/deliver.c	Sun Sep 30 17:38:31 2007 +0300
+++ b/src/deliver/deliver.c	Sun Sep 30 17:51:25 2007 +0300
@@ -511,7 +511,7 @@ static void print_help(void)
 static void print_help(void)
 {
 	printf(
-"Usage: deliver [-c <config file>] [-a <username>] [-d <destination address>]\n"
+"Usage: deliver [-c <config file>] [-a <address>] [-d <username>]\n"
 "               [-f <envelope sender>] [-m <mailbox>] [-n] [-e] [-k]\n");
 }
 
@@ -590,7 +590,7 @@ int main(int argc, char *argv[])
 	const char *envelope_sender = DEFAULT_ENVELOPE_SENDER;
 	const char *mailbox = "INBOX";
 	const char *auth_socket;
-	const char *home, *destaddr, *authuser, *value, *error;
+	const char *home, *destaddr, *user, *value, *error;
 	ARRAY_TYPE(string) extra_fields;
 	struct mail_namespace *ns, *mbox_ns;
 	struct mail_storage *storage;
@@ -602,6 +602,7 @@ int main(int argc, char *argv[])
 	pool_t namespace_pool;
 	bool stderr_rejection = FALSE;
 	bool keep_environment = FALSE;
+	bool user_auth = FALSE;
 	bool *input_first;
 	int i, ret;
 
@@ -619,24 +620,21 @@ int main(int argc, char *argv[])
         lib_signals_ignore(SIGXFSZ, TRUE);
 #endif
 
-	destaddr = authuser = NULL;
+	destaddr = user = NULL;
 	for (i = 1; i < argc; i++) {
 		if (strcmp(argv[i], "-a") == 0) {
-			/* destination auth user */
-			i++;
-			if (i == argc) {
-				i_fatal_status(EX_USAGE,
-					       "Missing auth user argument");
-			}
-			authuser = argv[i];
-		} else if (strcmp(argv[i], "-d") == 0) {
 			/* destination address */
 			i++;
-			if (i == argc) {
-				i_fatal_status(EX_USAGE,
-					       "Missing destination argument");
-			}
+			if (i == argc)
+				i_fatal_status(EX_USAGE, "Missing -a argument");
 			destaddr = argv[i];
+		} else if (strcmp(argv[i], "-d") == 0) {
+			/* destination user */
+			i++;
+			if (i == argc)
+				i_fatal_status(EX_USAGE, "Missing -d argument");
+			user = argv[i];
+			user_auth = TRUE;
 		} else if (strcmp(argv[i], "-e") == 0) {
 			stderr_rejection = TRUE;
 		} else if (strcmp(argv[i], "-c") == 0) {
@@ -652,10 +650,8 @@ int main(int argc, char *argv[])
 		} else if (strcmp(argv[i], "-m") == 0) {
 			/* destination mailbox */
 			i++;
-			if (i == argc) {
-				i_fatal_status(EX_USAGE,
-					       "Missing mailbox argument");
-			}
+			if (i == argc)
+				i_fatal_status(EX_USAGE, "Missing -m argument");
 			/* Ignore -m "". This allows doing -m ${extension}
 			   in Postfix to handle user+mailbox */
 			if (*argv[i] != '\0')
@@ -666,10 +662,8 @@ int main(int argc, char *argv[])
 		} else if (strcmp(argv[i], "-f") == 0) {
 			/* envelope sender address */
 			i++;
-			if (i == argc) {
-				i_fatal_status(EX_USAGE,
-					       "Missing envelope argument");
-			}
+			if (i == argc)
+				i_fatal_status(EX_USAGE, "Missing -f argument");
 			envelope_sender = argv[i];
 			explicit_envelope_sender = argv[i];
 		} else if (argv[i][0] != '\0') {
@@ -683,16 +677,15 @@ int main(int argc, char *argv[])
 		deliver_env_clean();
 
 	process_euid = geteuid();
-	if (destaddr != NULL) {
-		if (authuser == NULL)
-			authuser = destaddr;
-	} else if (process_euid != 0) {
+	if (user_auth)
+		;
+	else if (process_euid != 0) {
 		/* we're non-root. get our username and possibly our home. */
 		struct passwd *pw;
 
 		pw = getpwuid(process_euid);
 		if (pw != NULL) {
-			authuser = t_strdup(pw->pw_name);
+			user = t_strdup(pw->pw_name);
 			if (getenv("HOME") == NULL)
 				env_put(t_strconcat("HOME=", pw->pw_dir, NULL));
 		} else {
@@ -705,7 +698,7 @@ int main(int argc, char *argv[])
 	}
 
 	config_file_init(config_path);
-	open_logfile(authuser);
+	open_logfile(user);
 
 	if (getenv("MAIL_DEBUG") != NULL)
 		env_put("DEBUG=1");
@@ -726,21 +719,21 @@ int main(int argc, char *argv[])
 	}
 
 	t_array_init(&extra_fields, 64);
-	if (authuser != NULL) {
+	if (user_auth) {
 		auth_socket = getenv("AUTH_SOCKET_PATH");
 		if (auth_socket == NULL)
 			auth_socket = DEFAULT_AUTH_SOCKET_PATH;
 
 		ret = auth_client_lookup_and_restrict(ioloop, auth_socket,
-						      authuser, process_euid,
+						      user, process_euid,
 						      &extra_fields);
 		if (ret != 0)
 			return ret;
-	} else {
-		destaddr = authuser;
-	}
-
-	expand_envs(authuser);
+	}
+	if (destaddr == NULL)
+		destaddr = user;
+
+	expand_envs(user);
 	putenv_extra_fields(&extra_fields);
 
 	/* If possible chdir to home directory, so that core file
@@ -755,7 +748,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	env_put(t_strconcat("USER=", authuser, NULL));
+	env_put(t_strconcat("USER=", user, NULL));
 
 	value = getenv("UMASK");
 	if (value == NULL || sscanf(value, "%i", &i) != 1 || i < 0)
@@ -789,12 +782,12 @@ int main(int argc, char *argv[])
 	module_dir_init(modules);
 
 	namespace_pool = pool_alloconly_create("namespaces", 1024);
-	if (mail_namespaces_init(namespace_pool, authuser, &ns) < 0)
+	if (mail_namespaces_init(namespace_pool, user, &ns) < 0)
 		exit(EX_TEMPFAIL);
 
 	mbox_ns = mail_namespaces_init_empty(namespace_pool);
 	mbox_ns->flags |= NAMESPACE_FLAG_INTERNAL;
-	if (mail_storage_create(mbox_ns, "mbox", "/tmp", authuser,
+	if (mail_storage_create(mbox_ns, "mbox", "/tmp", user,
 				0, FILE_LOCK_METHOD_FCNTL, &error) < 0)
 		i_fatal("Couldn't create internal mbox storage: %s", error);
 	input = create_mbox_stream(0, envelope_sender, &input_first);
@@ -867,7 +860,7 @@ int main(int argc, char *argv[])
 			fprintf(stderr, "%s\n", error_string);
 			return EX_NOPERM;
 		}
-		ret = mail_send_rejection(mail, authuser, error_string);
+		ret = mail_send_rejection(mail, user, error_string);
 		if (ret != 0)
 			return ret < 0 ? EX_TEMPFAIL : ret;
 		/* ok, rejection sent */


More information about the dovecot-cvs mailing list