]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm auth/user: Fixes to auth_socket_path handling.
authorTimo Sirainen <tss@iki.fi>
Mon, 18 Nov 2013 14:18:53 +0000 (16:18 +0200)
committerTimo Sirainen <tss@iki.fi>
Mon, 18 Nov 2013 14:18:53 +0000 (16:18 +0200)
doveadm user (without -u parameter) was ignoring "-a" parameter entirely.
Others weren't using auth_socket_path setting.

src/doveadm/doveadm-auth.c
src/doveadm/doveadm-settings.c
src/doveadm/doveadm-settings.h

index ad2f2f09c53e2c0a078a09fa60c1b480e98d8bbc..5a7c14c818829905fa8767b9e63164fd6f48a916 100644 (file)
@@ -7,7 +7,9 @@
 #include "base64.h"
 #include "str.h"
 #include "wildcard-match.h"
+#include "settings-parser.h"
 #include "master-service.h"
+#include "master-service-settings.h"
 #include "auth-client.h"
 #include "auth-master.h"
 #include "auth-server-connection.h"
@@ -29,24 +31,28 @@ struct authtest_input {
 
 static void auth_cmd_help(doveadm_command_t *cmd);
 
+static struct auth_master_connection *
+doveadm_get_auth_master_conn(const char *auth_socket_path)
+{
+       enum auth_master_flags flags = 0;
+
+       if (doveadm_debug)
+               flags |= AUTH_MASTER_FLAG_DEBUG;
+       return auth_master_init(auth_socket_path, flags);
+}
+
 static int
-cmd_user_input(const char *auth_socket_path, const struct authtest_input *input,
+cmd_user_input(struct auth_master_connection *conn,
+              const struct authtest_input *input,
               const char *show_field, bool userdb)
 {
        const char *lookup_name = userdb ? "userdb lookup" : "passdb lookup";
-       struct auth_master_connection *conn;
        pool_t pool;
        const char *username, *const *fields, *p;
        int ret;
 
-       if (auth_socket_path == NULL) {
-               auth_socket_path = t_strconcat(doveadm_settings->base_dir,
-                                              "/auth-userdb", NULL);
-       }
-
        pool = pool_alloconly_create("auth master lookup", 1024);
 
-       conn = auth_master_init(auth_socket_path, 0);
        if (userdb) {
                ret = auth_master_user_lookup(conn, input->username, &input->info,
                                              pool, &username, &fields);
@@ -86,7 +92,6 @@ cmd_user_input(const char *auth_socket_path, const struct authtest_input *input,
                        }
                }
        }
-       auth_master_deinit(&conn);
        return ret;
 }
 
@@ -191,23 +196,17 @@ static void auth_user_info_parse(struct auth_user_info *info, const char *arg)
 }
 
 static void
-cmd_user_list(const char *auth_socket_path, const struct authtest_input *input,
+cmd_user_list(struct auth_master_connection *conn,
+             const struct authtest_input *input,
              char *const *users)
 {
        struct auth_master_user_list_ctx *ctx;
-       struct auth_master_connection *conn;
        const char *username, *user_mask = NULL;
        unsigned int i;
 
-       if (auth_socket_path == NULL) {
-               auth_socket_path = t_strconcat(doveadm_settings->base_dir,
-                                              "/auth-userdb", NULL);
-       }
-
        if (users[0] != NULL && users[1] == NULL)
                user_mask = users[0];
 
-       conn = auth_master_init(auth_socket_path, 0);
        ctx = auth_master_user_list_init(conn, user_mask, &input->info);
        while ((username = auth_master_user_list_next(ctx)) != NULL) {
                for (i = 0; users[i] != NULL; i++) {
@@ -219,12 +218,11 @@ cmd_user_list(const char *auth_socket_path, const struct authtest_input *input,
        }
        if (auth_master_user_list_deinit(&ctx) < 0)
                i_fatal("user listing failed");
-       auth_master_deinit(&conn);
 }
 
 static void cmd_auth_cache_flush(int argc, char *argv[])
 {
-       const char *auth_socket_path = NULL;
+       const char *master_socket_path = NULL;
        struct auth_master_connection *conn;
        unsigned int count;
        int c;
@@ -232,7 +230,7 @@ static void cmd_auth_cache_flush(int argc, char *argv[])
        while ((c = getopt(argc, argv, "a:")) > 0) {
                switch (c) {
                case 'a':
-                       auth_socket_path = optarg;
+                       master_socket_path = optarg;
                        break;
                default:
                        auth_cmd_help(cmd_auth_cache_flush);
@@ -240,12 +238,12 @@ static void cmd_auth_cache_flush(int argc, char *argv[])
        }
        argv += optind;
 
-       if (auth_socket_path == NULL) {
-               auth_socket_path = t_strconcat(doveadm_settings->base_dir,
-                                              "/auth-master", NULL);
+       if (master_socket_path == NULL) {
+               master_socket_path = t_strconcat(doveadm_settings->base_dir,
+                                                "auth-master", NULL);
        }
 
-       conn = auth_master_init(auth_socket_path, 0);
+       conn = doveadm_get_auth_master_conn(master_socket_path);
        if (auth_master_cache_flush(conn, (void *)argv, &count) < 0) {
                i_error("Cache flush failed");
                doveadm_exit_code = EX_TEMPFAIL;
@@ -292,7 +290,8 @@ static void cmd_auth_test(int argc, char *argv[])
 
 static void cmd_auth_lookup(int argc, char *argv[])
 {
-       const char *auth_socket_path = NULL;
+       const char *auth_socket_path = doveadm_settings->auth_socket_path;
+       struct auth_master_connection *conn;
        struct authtest_input input;
        const char *show_field = NULL;
        bool first = TRUE;
@@ -320,13 +319,14 @@ static void cmd_auth_lookup(int argc, char *argv[])
        if (optind == argc)
                auth_cmd_help(cmd_auth_lookup);
 
+       conn = doveadm_get_auth_master_conn(auth_socket_path);
        while ((input.username = argv[optind++]) != NULL) {
                if (first)
                        first = FALSE;
                else
                        putchar('\n');
 
-               ret = cmd_user_input(auth_socket_path, &input, show_field, FALSE);
+               ret = cmd_user_input(conn, &input, show_field, FALSE);
                switch (ret) {
                case -1:
                        doveadm_exit_code = EX_TEMPFAIL;
@@ -336,6 +336,7 @@ static void cmd_auth_lookup(int argc, char *argv[])
                        break;
                }
        }
+       auth_master_deinit(&conn);
 }
 
 static void cmd_user_mail_input_field(const char *key, const char *value,
@@ -425,7 +426,8 @@ static int cmd_user_mail_input(struct mail_storage_service_ctx *storage_service,
 
 static void cmd_user(int argc, char *argv[])
 {
-       const char *auth_socket_path = NULL;
+       const char *auth_socket_path = doveadm_settings->auth_socket_path;
+       struct auth_master_connection *conn;
        struct authtest_input input;
        const char *show_field = NULL;
        struct mail_storage_service_ctx *storage_service = NULL;
@@ -458,6 +460,8 @@ static void cmd_user(int argc, char *argv[])
        if (optind == argc)
                auth_cmd_help(cmd_user);
 
+       conn = doveadm_get_auth_master_conn(auth_socket_path);
+
        have_wildcards = FALSE;
        for (i = optind; argv[i] != NULL; i++) {
                if (strchr(argv[i], '*') != NULL ||
@@ -468,7 +472,8 @@ static void cmd_user(int argc, char *argv[])
        }
 
        if (have_wildcards) {
-               cmd_user_list(auth_socket_path, &input, argv + optind);
+               cmd_user_list(conn, &input, argv + optind);
+               auth_master_deinit(&conn);
                return;
        }
 
@@ -480,6 +485,8 @@ static void cmd_user(int argc, char *argv[])
                        MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |
                        MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES |
                        MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP);
+               mail_storage_service_set_auth_conn(storage_service, conn);
+               conn = NULL;
        }
 
        while ((input.username = argv[optind++]) != NULL) {
@@ -490,7 +497,7 @@ static void cmd_user(int argc, char *argv[])
 
                ret = !userdb_only ?
                        cmd_user_mail_input(storage_service, &input, show_field) :
-                       cmd_user_input(auth_socket_path, &input, show_field, TRUE);
+                       cmd_user_input(conn, &input, show_field, TRUE);
                switch (ret) {
                case -1:
                        doveadm_exit_code = EX_TEMPFAIL;
@@ -502,6 +509,8 @@ static void cmd_user(int argc, char *argv[])
        }
        if (storage_service != NULL)
                mail_storage_service_deinit(&storage_service);
+       if (conn != NULL)
+               auth_master_deinit(&conn);
 }
 
 struct doveadm_cmd doveadm_cmd_auth[] = {
index d40cda10021a9da901a45cbf4533d69e7438871b..643be06d66249b29961af3ca268cc536b3746cce 100644 (file)
@@ -56,6 +56,7 @@ static const struct setting_define doveadm_setting_defines[] = {
        DEF(SET_STR, libexec_dir),
        DEF(SET_STR, mail_plugins),
        DEF(SET_STR, mail_plugin_dir),
+       DEF(SET_STR, auth_socket_path),
        DEF(SET_STR, doveadm_socket_path),
        DEF(SET_UINT, doveadm_worker_count),
        DEF(SET_UINT, doveadm_port),
@@ -77,6 +78,7 @@ const struct doveadm_settings doveadm_default_settings = {
        .libexec_dir = PKG_LIBEXECDIR,
        .mail_plugins = "",
        .mail_plugin_dir = MODULEDIR,
+       .auth_socket_path = "auth-userdb",
        .doveadm_socket_path = "doveadm-server",
        .doveadm_worker_count = 0,
        .doveadm_port = 0,
@@ -125,6 +127,7 @@ static bool doveadm_settings_check(void *_set, pool_t pool ATTR_UNUSED,
        struct doveadm_settings *set = _set;
 
 #ifndef CONFIG_BINARY
+       fix_base_path(set, pool, &set->auth_socket_path);
        fix_base_path(set, pool, &set->doveadm_socket_path);
 #endif
        if (*set->dsync_alt_char == '\0') {
index 1eb99f51598e9d5ce2dc92bb6c9d452df420e6c4..7018aaeb329dd9da372a549c5875be564246144f 100644 (file)
@@ -6,6 +6,7 @@ struct doveadm_settings {
        const char *libexec_dir;
        const char *mail_plugins;
        const char *mail_plugin_dir;
+       const char *auth_socket_path;
        const char *doveadm_socket_path;
        unsigned int doveadm_worker_count;
        unsigned int doveadm_port;