changeset 19974:1961d9555bdd

doveadm-mail: Don't lose rip/lip/lport/rport in passdb lookups for doveadm TCP connections
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Wed, 30 Mar 2016 10:34:06 +0300
parents 0b5aeb95924a
children ed5df0ed7aa1
files src/doveadm/doveadm-mail.c
diffstat 1 files changed, 16 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-mail.c	Wed Mar 30 08:24:51 2016 +0300
+++ b/src/doveadm/doveadm-mail.c	Wed Mar 30 10:34:06 2016 +0300
@@ -433,18 +433,16 @@
 
 static void
 doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
+		       struct doveadm_cmd_context *cctx,
 		       const char *wildcard_user)
 {
-	struct doveadm_cmd_context cctx;
 	unsigned int user_idx;
 	const char *ip, *user, *error;
 	int ret;
 
 	ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
 
-	memset(&cctx, 0, sizeof(cctx));
-
-	doveadm_cctx_to_storage_service_input(&cctx, &ctx->storage_service_input);
+	doveadm_cctx_to_storage_service_input(cctx, &ctx->storage_service_input);
 	ctx->storage_service = mail_storage_service_init(master_service, NULL,
 							 ctx->service_flags);
         lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
@@ -463,11 +461,11 @@
 			if (!wildcard_match_icase(user, wildcard_user))
 				continue;
 		}
-		cctx.username = user;
+		cctx->username = user;
 		ctx->cur_username = user;
 		doveadm_print_sticky("username", user);
 		T_BEGIN {
-			ret = doveadm_mail_next_user(ctx, &cctx, &error);
+			ret = doveadm_mail_next_user(ctx, cctx, &error);
 			if (ret < 0)
 				i_error("%s", error);
 			else if (ret == 0)
@@ -562,6 +560,7 @@
 
 static void
 doveadm_mail_cmd_exec(struct doveadm_mail_cmd_context *ctx,
+		      struct doveadm_cmd_context *cctx,
 		      const char *wildcard_user)
 {
 	int ret;
@@ -579,8 +578,6 @@
 	}
 
 	if (ctx->iterate_single_user) {
-		struct doveadm_cmd_context cctx;
-
 		if (ctx->cur_username == NULL)
 			i_fatal_status(EX_USAGE, "USER environment is missing and -u option not used");
 		if (!ctx->cli) {
@@ -588,9 +585,7 @@
 			ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
 		}
 
-		memset(&cctx, 0, sizeof(cctx));
-		cctx.username = ctx->cur_username;
-		ret = doveadm_mail_single_user(ctx, &cctx, &error);
+		ret = doveadm_mail_single_user(ctx, cctx, &error);
 		if (ret < 0) {
 			/* user lookup/init failed somehow */
 			doveadm_exit_code = EX_TEMPFAIL;
@@ -601,7 +596,7 @@
 		}
 	} else {
 		ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
-		doveadm_mail_all_users(ctx, wildcard_user);
+		doveadm_mail_all_users(ctx, cctx, wildcard_user);
 	}
 	if (ctx->search_args != NULL)
 		mail_search_args_unref(&ctx->search_args);
@@ -628,6 +623,7 @@
 static void
 doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
 {
+	struct doveadm_cmd_context cctx;
 	struct doveadm_mail_cmd_context *ctx;
 	const char *getopt_args, *wildcard_user;
 	int c;
@@ -637,6 +633,9 @@
 	ctx->cli = TRUE;
 	ctx->cur_username = getenv("USER");
 
+	memset(&cctx, 0, sizeof(cctx));
+	cctx.username = ctx->cur_username;
+
 	getopt_args = "AF:S:u:";
 	/* keep context's getopt_args first in case it contains '+' */
 	if (ctx->getopt_args != NULL)
@@ -683,7 +682,7 @@
 			       cmd->name, argv[0]);
 	}
 	ctx->args = (const void *)argv;
-	doveadm_mail_cmd_exec(ctx, wildcard_user);
+	doveadm_mail_cmd_exec(ctx, &cctx, wildcard_user);
 	doveadm_mail_cmd_free(ctx);
 }
 
@@ -933,10 +932,12 @@
 		cctx->cmd->mail_cmd, cctx->cmd->name, cctx->cmd->usage
 	};
 
-	mctx = doveadm_mail_cmdline_init(&mail_cmd);
 	if (!cctx->cli) {
+		mctx = doveadm_mail_cmd_init(&mail_cmd, doveadm_settings);
 		/* doveadm-server always does userdb lookups */
 		mctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
+	} else {
+		mctx = doveadm_mail_cmdline_init(&mail_cmd);
 	}
 	mctx->cur_username = cctx->username;
 	mctx->iterate_all_users = FALSE;
@@ -1023,6 +1024,6 @@
 	mctx->full_args = array_idx(&pargv, 0);
 	mctx->cli = cctx->cli;
 
-	doveadm_mail_cmd_exec(mctx, wildcard_user);
+	doveadm_mail_cmd_exec(mctx, cctx, wildcard_user);
 	doveadm_mail_cmd_free(mctx);
 }