dovecot: Added -a parameter to specify authentication username. ...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 30 17:32:18 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/95eb92b49d9c
changeset: 6515:95eb92b49d9c
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 30 17:32:12 2007 +0300
description:
Added -a parameter to specify authentication username. It can be used to
override -d parameter which specifies the destination address (e.g.
user+detail at domain). The destination address is now passed to plugins
instead of the username.

diffstat:

2 files changed, 34 insertions(+), 26 deletions(-)
src/deliver/deliver.c |   58 +++++++++++++++++++++++++++----------------------
src/deliver/deliver.h |    2 -

diffs (181 lines):

diff -r b058f43c77e2 -r 95eb92b49d9c src/deliver/deliver.c
--- a/src/deliver/deliver.c	Sun Sep 30 17:08:14 2007 +0300
+++ b/src/deliver/deliver.c	Sun Sep 30 17:32:12 2007 +0300
@@ -535,7 +535,7 @@ void deliver_env_clean(void)
 	if (home != NULL) env_put(home);
 }
 
-static void expand_envs(const char *destination)
+static void expand_envs(const char *user)
 {
         const struct var_expand_table *table;
 	const char *mail_env, *const *envs, *home;
@@ -545,7 +545,7 @@ static void expand_envs(const char *dest
 	home = getenv("HOME");
 
 	str = t_str_new(256);
-	table = get_var_expand_table(destination, home);
+	table = get_var_expand_table(user, home);
 	envs = array_get(&plugin_envs, &count);
 	for (i = 0; i < count; i++) {
 		str_truncate(str, 0);
@@ -559,7 +559,7 @@ static void expand_envs(const char *dest
 		   directory (yea, kludgy) */
 		if (home == NULL)
 			home = getenv("HOME");
-		table = get_var_expand_table(destination, home);
+		table = get_var_expand_table(user, home);
 		mail_env = expand_mail_env(mail_env, table);
 	}
 	env_put(t_strconcat("MAIL=", mail_env, NULL));
@@ -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, *destination, *user, *value, *error;
+	const char *home, *destaddr, *authuser, *value, *error;
 	ARRAY_TYPE(string) extra_fields;
 	struct mail_namespace *ns, *mbox_ns;
 	struct mail_storage *storage;
@@ -619,16 +619,24 @@ int main(int argc, char *argv[])
         lib_signals_ignore(SIGXFSZ, TRUE);
 #endif
 
-	destination = NULL;
+	destaddr = authuser = NULL;
 	for (i = 1; i < argc; i++) {
-		if (strcmp(argv[i], "-d") == 0) {
-			/* destination user */
+		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");
 			}
-			destination = argv[i];
+			destaddr = argv[i];
 		} else if (strcmp(argv[i], "-e") == 0) {
 			stderr_rejection = TRUE;
 		} else if (strcmp(argv[i], "-c") == 0) {
@@ -675,15 +683,16 @@ int main(int argc, char *argv[])
 		deliver_env_clean();
 
 	process_euid = geteuid();
-	if (destination != NULL)
-		user = destination;
-	else if (process_euid != 0) {
+	if (destaddr != NULL) {
+		if (authuser == NULL)
+			authuser = destaddr;
+	} 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) {
-			user = t_strdup(pw->pw_name);
+			authuser = t_strdup(pw->pw_name);
 			if (getenv("HOME") == NULL)
 				env_put(t_strconcat("HOME=", pw->pw_dir, NULL));
 		} else {
@@ -696,7 +705,7 @@ int main(int argc, char *argv[])
 	}
 
 	config_file_init(config_path);
-	open_logfile(user);
+	open_logfile(authuser);
 
 	if (getenv("MAIL_DEBUG") != NULL)
 		env_put("DEBUG=1");
@@ -717,21 +726,21 @@ int main(int argc, char *argv[])
 	}
 
 	t_array_init(&extra_fields, 64);
-	if (destination != NULL) {
+	if (authuser != NULL) {
 		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,
-						      destination, process_euid,
+						      authuser, process_euid,
 						      &extra_fields);
 		if (ret != 0)
 			return ret;
 	} else {
-		destination = user;
-	}
-
-	expand_envs(destination);
+		destaddr = authuser;
+	}
+
+	expand_envs(authuser);
 	putenv_extra_fields(&extra_fields);
 
 	/* If possible chdir to home directory, so that core file
@@ -746,7 +755,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	env_put(t_strconcat("USER=", destination, NULL));
+	env_put(t_strconcat("USER=", authuser, NULL));
 
 	value = getenv("UMASK");
 	if (value == NULL || sscanf(value, "%i", &i) != 1 || i < 0)
@@ -780,12 +789,12 @@ int main(int argc, char *argv[])
 	module_dir_init(modules);
 
 	namespace_pool = pool_alloconly_create("namespaces", 1024);
-	if (mail_namespaces_init(namespace_pool, destination, &ns) < 0)
+	if (mail_namespaces_init(namespace_pool, authuser, &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", destination,
+	if (mail_storage_create(mbox_ns, "mbox", "/tmp", authuser,
 				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);
@@ -806,8 +815,7 @@ int main(int argc, char *argv[])
 	if (deliver_mail == NULL)
 		ret = -1;
 	else {
-		if (deliver_mail(ns, &storage, mail,
-				 destination, mailbox) <= 0) {
+		if (deliver_mail(ns, &storage, mail, authuser, mailbox) <= 0) {
 			/* if message was saved, don't bounce it even though
 			   the script failed later. */
 			ret = saved_mail ? 0 : -1;
@@ -859,7 +867,7 @@ int main(int argc, char *argv[])
 			fprintf(stderr, "%s\n", error_string);
 			return EX_NOPERM;
 		}
-		ret = mail_send_rejection(mail, destination, error_string);
+		ret = mail_send_rejection(mail, authuser, error_string);
 		if (ret != 0)
 			return ret < 0 ? EX_TEMPFAIL : ret;
 		/* ok, rejection sent */
diff -r b058f43c77e2 -r 95eb92b49d9c src/deliver/deliver.h
--- a/src/deliver/deliver.h	Sun Sep 30 17:08:14 2007 +0300
+++ b/src/deliver/deliver.h	Sun Sep 30 17:32:12 2007 +0300
@@ -21,7 +21,7 @@ typedef int deliver_mail_func_t(struct m
 typedef int deliver_mail_func_t(struct mail_namespace *namespaces,
 				struct mail_storage **storage_r,
 				struct mail *mail,
-				const char *username, const char *mailbox);
+				const char *destaddr, const char *mailbox);
 
 extern deliver_mail_func_t *deliver_mail;
 


More information about the dovecot-cvs mailing list