dovecot-2.1: doveadm server now returns unknown users with -NOUS...

dovecot at dovecot.org dovecot at dovecot.org
Sun Mar 4 10:12:07 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/9693521aa153
changeset: 14226:9693521aa153
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Mar 04 10:11:55 2012 +0200
description:
doveadm server now returns unknown users with -NOUSER error.

diffstat:

 src/doveadm/client-connection.c                 |  57 ++++++++++++++++--------
 src/doveadm/doveadm-mail.c                      |  24 ++++-----
 src/doveadm/doveadm-mail.h                      |   5 +-
 src/replication/replicator/doveadm-connection.c |   6 +-
 4 files changed, 56 insertions(+), 36 deletions(-)

diffs (211 lines):

diff -r 14ff849dc266 -r 9693521aa153 src/doveadm/client-connection.c
--- a/src/doveadm/client-connection.c	Sun Mar 04 09:50:21 2012 +0200
+++ b/src/doveadm/client-connection.c	Sun Mar 04 10:11:55 2012 +0200
@@ -35,22 +35,22 @@
 	unsigned int authenticated:1;
 };
 
-static bool
-doveadm_mail_cmd_server(const char *cmd_name,
-			const struct doveadm_settings *set,
-			const struct mail_storage_service_input *input,
-			int argc, char *argv[])
+static struct doveadm_mail_cmd_context *
+doveadm_mail_cmd_server_parse(const char *cmd_name,
+			      const struct doveadm_settings *set,
+			      const struct mail_storage_service_input *input,
+			      int argc, char *argv[])
 {
 	struct doveadm_mail_cmd_context *ctx;
 	const struct doveadm_mail_cmd *cmd;
 	const char *getopt_args;
-	bool ret, add_username_header = FALSE;
+	bool add_username_header = FALSE;
 	int c;
 
 	cmd = doveadm_mail_cmd_find(cmd_name);
 	if (cmd == NULL) {
 		i_error("doveadm: Client sent unknown command: %s", cmd_name);
-		return FALSE;
+		return NULL;
 	}
 
 	ctx = doveadm_mail_cmd_init(cmd, set);
@@ -83,7 +83,7 @@
 					"Client sent unknown parameter: %c",
 					cmd->name, c);
 				ctx->v.deinit(ctx);
-				return FALSE;
+				return NULL;
 			}
 		}
 	}
@@ -95,8 +95,9 @@
 		i_error("doveadm %s: Client sent unknown parameter: %s",
 			cmd->name, argv[0]);
 		ctx->v.deinit(ctx);
-		return FALSE;
+		return NULL;
 	}
+	ctx->args = (const void *)argv;
 
 	if (doveadm_print_is_initialized() && add_username_header) {
 		doveadm_print_header("username", "Username",
@@ -104,20 +105,38 @@
 				     DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
 		doveadm_print_sticky("username", input->username);
 	}
+	return ctx;
+}
 
-	ctx->args = (const void *)argv;
+static void
+doveadm_mail_cmd_server_run(struct client_connection *conn,
+			    struct doveadm_mail_cmd_context *ctx,
+			    const struct mail_storage_service_input *input)
+{
+	const char *error;
+	int ret;
+
 	if (ctx->v.preinit != NULL)
 		ctx->v.preinit(ctx);
 
-	doveadm_mail_single_user(ctx, input);
+	ret = doveadm_mail_single_user(ctx, input, &error);
 	doveadm_mail_server_flush();
 	ctx->v.deinit(ctx);
 	doveadm_print_flush();
 	mail_storage_service_deinit(&ctx->storage_service);
-	ret = ctx->exit_code == 0;
+
+	if (ret < 0) {
+		i_error("%s: %s", ctx->cmd->name, error);
+		o_stream_send(conn->output, "\n-\n", 3);
+	} else if (ret == 0) {
+		o_stream_send_str(conn->output, "\n-NOUSER\n");
+	} else if (ctx->exit_code != 0) {
+		/* maybe not an error, but not a full success either */
+		o_stream_send(conn->output, "\n-\n", 3);
+	} else {
+		o_stream_send(conn->output, "\n+\n", 3);
+	}
 	pool_unref(&ctx->pool);
-
-	return ret;
 }
 
 static bool client_is_allowed_command(const struct doveadm_settings *set,
@@ -144,9 +163,9 @@
 static bool client_handle_command(struct client_connection *conn, char **args)
 {
 	struct mail_storage_service_input input;
+	struct doveadm_mail_cmd_context *ctx;
 	const char *flags, *cmd_name;
 	unsigned int argc;
-	bool ret;
 
 	memset(&input, 0, sizeof(input));
 	input.service = "doveadm";
@@ -190,11 +209,11 @@
 	}
 
 	o_stream_cork(conn->output);
-	ret = doveadm_mail_cmd_server(cmd_name, conn->set, &input, argc, args);
-	if (ret)
-		o_stream_send(conn->output, "\n+\n", 3);
+	ctx = doveadm_mail_cmd_server_parse(cmd_name, conn->set, &input, argc, args);
+	if (ctx == NULL)
+		o_stream_send(conn->output, "\n-\n", 3);
 	else
-		o_stream_send(conn->output, "\n-\n", 3);
+		doveadm_mail_cmd_server_run(conn, ctx, &input);
 	o_stream_uncork(conn->output);
 
 	/* flush the output and disconnect */
diff -r 14ff849dc266 -r 9693521aa153 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Sun Mar 04 09:50:21 2012 +0200
+++ b/src/doveadm/doveadm-mail.c	Sun Mar 04 10:11:55 2012 +0200
@@ -316,12 +316,10 @@
 	return 1;
 }
 
-void doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
-			      const struct mail_storage_service_input *input)
+int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
+			     const struct mail_storage_service_input *input,
+			     const char **error_r)
 {
-	const char *error;
-	int ret;
-
 	i_assert(input->username != NULL);
 
 	ctx->cur_username = input->username;
@@ -331,11 +329,7 @@
 	if (hook_doveadm_mail_init != NULL)
 		hook_doveadm_mail_init(ctx);
 
-	ret = doveadm_mail_next_user(ctx, input, &error);
-	if (ret < 0)
-		i_fatal("%s", error);
-	else if (ret == 0)
-		i_fatal_status(EX_NOUSER, "User doesn't exist");
+	return doveadm_mail_next_user(ctx, input, error_r);
 }
 
 static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
@@ -453,8 +447,8 @@
 doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
 {
 	struct doveadm_mail_cmd_context *ctx;
-	const char *getopt_args, *wildcard_user;
-	int c;
+	const char *getopt_args, *wildcard_user, *error;
+	int ret, c;
 
 	ctx = doveadm_mail_cmd_init(cmd, doveadm_settings);
 	ctx->full_args = (const void *)(argv + 1);
@@ -521,7 +515,11 @@
 		memset(&input, 0, sizeof(input));
 		input.service = "doveadm";
 		input.username = ctx->cur_username;
-		doveadm_mail_single_user(ctx, &input);
+		ret = doveadm_mail_single_user(ctx, &input, &error);
+		if (ret < 0)
+			i_fatal("%s", error);
+		else if (ret == 0)
+			i_fatal_status(EX_NOUSER, "User doesn't exist");
 	} else {
 		ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
 		doveadm_mail_all_users(ctx, argv, wildcard_user);
diff -r 14ff849dc266 -r 9693521aa153 src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h	Sun Mar 04 09:50:21 2012 +0200
+++ b/src/doveadm/doveadm-mail.h	Sun Mar 04 10:11:55 2012 +0200
@@ -95,8 +95,9 @@
 struct doveadm_mail_cmd_context *
 doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
 		      const struct doveadm_settings *set);
-void doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
-			      const struct mail_storage_service_input *input);
+int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
+			     const struct mail_storage_service_input *input,
+			     const char **error_r);
 int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
 			     const struct mail_storage_service_input *input,
 			     const char **error_r);
diff -r 14ff849dc266 -r 9693521aa153 src/replication/replicator/doveadm-connection.c
--- a/src/replication/replicator/doveadm-connection.c	Sun Mar 04 09:50:21 2012 +0200
+++ b/src/replication/replicator/doveadm-connection.c	Sun Mar 04 10:11:55 2012 +0200
@@ -105,8 +105,10 @@
 	if (line[0] == '+')
 		doveadm_callback(conn, DOVEADM_REPLY_OK);
 	else if (line[0] == '-') {
-		/* FIXME: handle DOVEADM_REPLY_NOUSER */
-		doveadm_callback(conn, DOVEADM_REPLY_FAIL);
+		if (strcmp(line+1, "NOUSER") == 0)
+			doveadm_callback(conn, DOVEADM_REPLY_NOUSER);
+		else
+			doveadm_callback(conn, DOVEADM_REPLY_FAIL);
 	} else {
 		i_error("%s: Invalid input: %s", conn->path, line);
 		return -1;


More information about the dovecot-cvs mailing list