]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Pass through mail_storage_service_input fields in doveadm_cmd_attributes
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 26 Feb 2016 12:58:33 +0000 (14:58 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 26 Feb 2016 12:58:33 +0000 (14:58 +0200)
src/doveadm/client-connection-http.c
src/doveadm/client-connection.c
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-mail.c
src/doveadm/doveadm-mail.h

index e5dff733f2e5dce6b874959f984329c0d1d45d19..0a7fd1ff30b5a05edec8b026664c61d06a183f2b 100644 (file)
@@ -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);
index 3492a78e8038a67078314dd67badb66d2e5bcbf0..ce08f7a66c417e4492adf4207cff824f33cee8b0 100644 (file)
@@ -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);
 
index a7f4b2854afaacb7e1dd42773d1481b5c538c28b..13570769eadb08fadaf37a16a2fbc65cc6d42ca7 100644 (file)
@@ -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);
index d94bfd0d440425b50f9c5e9fab285a124ace2abe..f1066994a7c1896f6470fc6f3b309b047b755e1b 100644 (file)
@@ -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;
index c6368c8d1b4602c3944f6306f5e8ff01f5bbd6eb..3bd74cbb29778203eb4b7b6a6a6981096dd759e0 100644 (file)
@@ -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,