dovecot-2.2: doveadm server now returns unknown users with -NOUS...
dovecot at dovecot.org
dovecot at dovecot.org
Sun May 20 03:26:24 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/9693521aa153
changeset: 14262: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