Mercurial > dovecot > core-2.2
changeset 14262:9693521aa153
doveadm server now returns unknown users with -NOUSER error.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 04 Mar 2012 10:11:55 +0200 |
parents | 14ff849dc266 |
children | b44922333957 |
files | src/doveadm/client-connection.c src/doveadm/doveadm-mail.c src/doveadm/doveadm-mail.h src/replication/replicator/doveadm-connection.c |
diffstat | 4 files changed, 56 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- 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 */
--- 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);
--- 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);
--- 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;