From: Timo Sirainen Date: Fri, 26 Feb 2016 12:58:33 +0000 (+0200) Subject: doveadm: Pass through mail_storage_service_input fields in doveadm_cmd_attributes X-Git-Tag: 2.2.22.rc1~52 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=50e4970035d1278597d13cac6c5ae26e7af93025;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Pass through mail_storage_service_input fields in doveadm_cmd_attributes --- diff --git a/src/doveadm/client-connection-http.c b/src/doveadm/client-connection-http.c index e5dff733f2..0a7fd1ff30 100644 --- a/src/doveadm/client-connection-http.c +++ b/src/doveadm/client-connection-http.c @@ -276,7 +276,8 @@ static int doveadm_http_server_json_parse_next(struct client_connection_http *co static void doveadm_http_server_command_execute(struct client_connection_http *conn) { - const struct doveadm_cmd_param *cpar; + const struct doveadm_cmd_param *cpar; + struct doveadm_cmd_attributes attrs; /* final preflight check */ if (!doveadm_client_is_allowed_command(conn->client.set, conn->cmd->name)) @@ -307,6 +308,12 @@ doveadm_http_server_command_execute(struct client_connection_http *conn) ioloop = io_loop_create(); lib_signals_reset_ioloop(); doveadm_exit_code = 0; + memset(&attrs, 0, sizeof(attrs)); + attrs.local_ip = conn->client.local_ip; + attrs.local_port = conn->client.local_port; + attrs.remote_ip = conn->client.remote_ip; + attrs.remote_port = conn->client.remote_port; + conn->cmd->cmd(conn->cmd,pargc, cpar); io_loop_set_current(prev_ioloop); diff --git a/src/doveadm/client-connection.c b/src/doveadm/client-connection.c index 3492a78e80..ce08f7a66c 100644 --- a/src/doveadm/client-connection.c +++ b/src/doveadm/client-connection.c @@ -92,7 +92,6 @@ doveadm_cmd_server_run(struct client_connection *conn, static int doveadm_mail_cmd_server_parse(const struct doveadm_mail_cmd *cmd, const struct doveadm_settings *set, - const struct mail_storage_service_input *input, const struct doveadm_cmd_attributes *attrs, struct doveadm_mail_cmd_context **ctx_r) { @@ -153,7 +152,7 @@ doveadm_mail_cmd_server_parse(const struct doveadm_mail_cmd *cmd, doveadm_print_header("username", "Username", DOVEADM_PRINT_HEADER_FLAG_STICKY | DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE); - doveadm_print_sticky("username", input->username); + doveadm_print_sticky("username", attrs->username); } *ctx_r = ctx; return 0; @@ -162,7 +161,7 @@ doveadm_mail_cmd_server_parse(const struct doveadm_mail_cmd *cmd, 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 struct doveadm_cmd_attributes *attrs) { const char *error; int ret; @@ -173,7 +172,7 @@ doveadm_mail_cmd_server_run(struct client_connection *conn, if (ctx->v.preinit != NULL) ctx->v.preinit(ctx); - ret = doveadm_mail_single_user(ctx, input, &error); + ret = doveadm_mail_single_user(ctx, attrs, &error); doveadm_mail_server_flush(); ctx->v.deinit(ctx); doveadm_print_flush(); @@ -218,7 +217,6 @@ bool doveadm_client_is_allowed_command(const struct doveadm_settings *set, static int doveadm_cmd_handle(struct client_connection *conn, const char *cmd_name, - const struct mail_storage_service_input *input, const struct doveadm_cmd_attributes *attrs) { struct ioloop *ioloop, *prev_ioloop = current_ioloop; @@ -238,7 +236,7 @@ static int doveadm_cmd_handle(struct client_connection *conn, return -1; } if (doveadm_mail_cmd_server_parse(mail_cmd, conn->set, - input, attrs, &ctx) < 0) + attrs, &ctx) < 0) return -1; } else { attrs = &cmd_attrs; @@ -256,7 +254,7 @@ static int doveadm_cmd_handle(struct client_connection *conn, else if (cmd != NULL) doveadm_cmd_server_run(conn, cmd, attrs); else - doveadm_mail_cmd_server_run(conn, ctx, input); + doveadm_mail_cmd_server_run(conn, ctx, attrs); io_loop_set_current(prev_ioloop); lib_signals_reset_ioloop(); @@ -273,17 +271,9 @@ static int doveadm_cmd_handle(struct client_connection *conn, static bool client_handle_command(struct client_connection *conn, char **args) { struct doveadm_cmd_attributes attrs; - struct mail_storage_service_input input; const char *flags, *cmd_name; unsigned int argc; - memset(&input, 0, sizeof(input)); - input.service = "doveadm"; - input.local_ip = conn->local_ip; - input.remote_ip = conn->remote_ip; - input.local_port = conn->local_port; - input.remote_port = conn->remote_port; - for (argc = 0; args[argc] != NULL; argc++) args[argc] = str_tabunescape(args[argc]); @@ -295,8 +285,14 @@ static bool client_handle_command(struct client_connection *conn, char **args) attrs.argv = (const char **)args; attrs.argc = argc; + attrs.local_ip = conn->local_ip; + attrs.remote_ip = conn->remote_ip; + attrs.local_port = conn->local_port; + attrs.remote_port = conn->remote_port; + flags = args[0]; - input.username = args[1]; + attrs.username = args[1]; + cmd_name = args[2]; /* leave the command name as args[0] so getopt() works */ args += 2; @@ -327,7 +323,7 @@ static bool client_handle_command(struct client_connection *conn, char **args) } o_stream_cork(conn->output); - if (doveadm_cmd_handle(conn, cmd_name, &input, &attrs) < 0) + if (doveadm_cmd_handle(conn, cmd_name, &attrs) < 0) o_stream_nsend(conn->output, "\n-\n", 3); o_stream_uncork(conn->output); diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index a7f4b2854a..13570769ea 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -1,6 +1,8 @@ #ifndef DOVEADM_CMD_H #define DOVEADM_CMD_H +#include "net.h" + #define DOVEADM_CMD_PARAMS_START .parameters = (const struct doveadm_cmd_param[]){ #define DOVEADM_CMD_PARAM(optP, nameP, typeP, flagP ) { .short_opt = optP, .name = nameP, .type = typeP, .flags = flagP }, #define DOVEADM_CMD_PARAMS_END { .short_opt = '\0', .name = NULL, .type = CMD_PARAM_BOOL, .flags = CMD_PARAM_FLAG_NONE } } @@ -69,6 +71,10 @@ struct doveadm_cmd_ver2 { struct doveadm_cmd_attributes { int argc; const char **argv; + + const char *username; + struct ip_addr local_ip, remote_ip; + in_port_t local_port, remote_port; }; ARRAY_DEFINE_TYPE(doveadm_cmd, struct doveadm_cmd); diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index d94bfd0d44..f1066994a7 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -334,27 +334,42 @@ static struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void) return ctx; } +static void +doveadm_attrs_to_storage_service_input(const struct doveadm_cmd_attributes *attrs, + struct mail_storage_service_input *input_r) +{ + memset(input_r, 0, sizeof(*input_r)); + input_r->service = "doveadm"; + input_r->remote_ip = attrs->remote_ip; + input_r->remote_port = attrs->remote_port; + input_r->local_ip = attrs->local_ip; + input_r->local_port = attrs->local_port; + input_r->username = attrs->username; +} + static int doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx, - const struct mail_storage_service_input *input, + const struct doveadm_cmd_attributes *attrs, const char **error_r) { + struct mail_storage_service_input input; const char *error, *ip; int ret; - ip = net_ip2addr(&input->remote_ip); + ip = net_ip2addr(&attrs->remote_ip); if (ip[0] == '\0') - i_set_failure_prefix("doveadm(%s): ", input->username); + i_set_failure_prefix("doveadm(%s): ", attrs->username); else - i_set_failure_prefix("doveadm(%s,%s): ", ip, input->username); + i_set_failure_prefix("doveadm(%s,%s): ", ip, attrs->username); + doveadm_attrs_to_storage_service_input(attrs, &input); /* see if we want to execute this command via (another) doveadm server */ - ret = doveadm_mail_server_user(ctx, input, error_r); + ret = doveadm_mail_server_user(ctx, &input, error_r); if (ret != 0) return ret; - ret = mail_storage_service_lookup(ctx->storage_service, input, + ret = mail_storage_service_lookup(ctx->storage_service, &input, &ctx->cur_service_user, &error); if (ret <= 0) { if (ret < 0) { @@ -396,14 +411,14 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) } int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx, - const struct mail_storage_service_input *input, + const struct doveadm_cmd_attributes *attrs, const char **error_r) { - i_assert(input->username != NULL); + i_assert(attrs->username != NULL); - ctx->cur_client_ip = input->remote_ip; - ctx->cur_username = input->username; - ctx->storage_service_input = *input; + doveadm_attrs_to_storage_service_input(attrs, &ctx->storage_service_input); + ctx->cur_client_ip = attrs->remote_ip; + ctx->cur_username = attrs->username; ctx->storage_service = mail_storage_service_init(master_service, NULL, ctx->service_flags); ctx->v.init(ctx, ctx->args); @@ -413,24 +428,23 @@ int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx, lib_signals_set_handler(SIGINT, 0, sig_die, NULL); lib_signals_set_handler(SIGTERM, 0, sig_die, NULL); - return doveadm_mail_next_user(ctx, input, error_r); + return doveadm_mail_next_user(ctx, attrs, error_r); } static void doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, const char *wildcard_user) { - struct mail_storage_service_input input; + struct doveadm_cmd_attributes attrs; unsigned int user_idx; const char *ip, *user, *error; int ret; ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP; - memset(&input, 0, sizeof(input)); - input.service = "doveadm"; + memset(&attrs, 0, sizeof(attrs)); - ctx->storage_service_input = input; + doveadm_attrs_to_storage_service_input(&attrs, &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); @@ -449,11 +463,11 @@ doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, if (!wildcard_match_icase(user, wildcard_user)) continue; } - input.username = user; + attrs.username = user; ctx->cur_username = user; doveadm_print_sticky("username", user); T_BEGIN { - ret = doveadm_mail_next_user(ctx, &input, &error); + ret = doveadm_mail_next_user(ctx, &attrs, &error); if (ret < 0) i_error("%s", error); else if (ret == 0) @@ -566,15 +580,14 @@ doveadm_mail_cmd_exec(struct doveadm_mail_cmd_context *ctx, } if (ctx->iterate_single_user) { - struct mail_storage_service_input input; + struct doveadm_cmd_attributes attrs; if (ctx->cur_username == NULL) i_fatal_status(EX_USAGE, "USER environment is missing and -u option not used"); - memset(&input, 0, sizeof(input)); - input.service = "doveadm"; - input.username = ctx->cur_username; - ret = doveadm_mail_single_user(ctx, &input, &error); + memset(&attrs, 0, sizeof(attrs)); + attrs.username = ctx->cur_username; + ret = doveadm_mail_single_user(ctx, &attrs, &error); if (ret < 0) { /* user lookup/init failed somehow */ doveadm_exit_code = EX_TEMPFAIL; diff --git a/src/doveadm/doveadm-mail.h b/src/doveadm/doveadm-mail.h index c6368c8d1b..3bd74cbb29 100644 --- a/src/doveadm/doveadm-mail.h +++ b/src/doveadm/doveadm-mail.h @@ -134,7 +134,7 @@ struct doveadm_mail_cmd_context * doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd, const struct doveadm_settings *set); int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx, - const struct mail_storage_service_input *input, + const struct doveadm_cmd_attributes *attrs, const char **error_r); int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx, const struct mail_storage_service_input *input,