]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-auth: auth_master_user_list_init() now takes user_mask and info parameters.
authorTimo Sirainen <tss@iki.fi>
Wed, 23 Nov 2011 20:08:09 +0000 (22:08 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 23 Nov 2011 20:08:09 +0000 (22:08 +0200)
These are passed to auth process, which may use them to limit what usernames
are returned.

src/doveadm/doveadm-auth.c
src/doveadm/doveadm-director.c
src/lib-auth/auth-master.c
src/lib-auth/auth-master.h
src/lib-storage/mail-storage-service.c

index c9ade8d558051b2055f82cccbc83886359c1b33c..482ab70b6a55c4ecf75617fadd1aa620f6e9d0c6 100644 (file)
@@ -180,11 +180,12 @@ static void auth_user_info_parse(struct auth_user_info *info, const char *arg)
 }
 
 static void
-cmd_user_list(const char *auth_socket_path, char *const *users)
+cmd_user_list(const char *auth_socket_path, const struct authtest_input *input,
+             char *const *users)
 {
        struct auth_master_user_list_ctx *ctx;
        struct auth_master_connection *conn;
-       const char *username;
+       const char *username, *user_mask = NULL;
        unsigned int i;
 
        if (auth_socket_path == NULL) {
@@ -192,8 +193,11 @@ cmd_user_list(const char *auth_socket_path, char *const *users)
                                               "/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);
+       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++) {
                        if (wildcard_match_icase(username, users[i]))
@@ -286,7 +290,7 @@ static void cmd_user(int argc, char *argv[])
        }
 
        if (have_wildcards)
-               cmd_user_list(auth_socket_path, argv + optind);
+               cmd_user_list(auth_socket_path, &input, argv + optind);
        else {
                bool first = TRUE;
                bool notfound = FALSE;
index de2b770db98a37b1de5e4c430f6e71a799950f08..2b9b21e8df306f5aad1ae5247313d15c0dc09f19 100644 (file)
@@ -211,7 +211,7 @@ userdb_get_user_list(const char *auth_socket_path, pool_t pool,
        }
 
        conn = auth_master_init(auth_socket_path, 0);
-       ctx = auth_master_user_list_init(conn);
+       ctx = auth_master_user_list_init(conn, NULL, NULL);
        while ((username = auth_master_user_list_next(ctx)) != NULL)
                user_list_add(username, pool, users);
        if (auth_master_user_list_deinit(&ctx) < 0) {
index 0681caa0662704b132e4594e08207e6b932d9221..749641013d40d07728a89f852fa986c397f04fa5 100644 (file)
@@ -434,8 +434,10 @@ auth_master_next_request_id(struct auth_master_connection *conn)
 static void
 auth_user_info_export(string_t *str, const struct auth_user_info *info)
 {
-       str_append(str, "service=");
-       str_append(str, info->service);
+       if (info->service != NULL) {
+               str_append(str, "\tservice=");
+               str_append(str, info->service);
+       }
 
        if (info->local_ip.family != 0)
                str_printfa(str, "\tlip=%s", net_ip2addr(&info->local_ip));
@@ -473,7 +475,7 @@ int auth_master_user_lookup(struct auth_master_connection *conn,
        conn->reply_context = &ctx;
 
        str = t_str_new(128);
-       str_printfa(str, "USER\t%u\t%s\t",
+       str_printfa(str, "USER\t%u\t%s",
                    auth_master_next_request_id(conn), user);
        auth_user_info_export(str, info);
        str_append_c(str, '\n');
@@ -547,7 +549,7 @@ int auth_master_pass_lookup(struct auth_master_connection *conn,
        conn->reply_context = &ctx;
 
        str = t_str_new(128);
-       str_printfa(str, "PASS\t%u\t%s\t",
+       str_printfa(str, "PASS\t%u\t%s",
                    auth_master_next_request_id(conn), user);
        auth_user_info_export(str, info);
        str_append_c(str, '\n');
@@ -591,10 +593,12 @@ auth_user_list_reply_callback(const char *cmd, const char *const *args,
 }
 
 struct auth_master_user_list_ctx *
-auth_master_user_list_init(struct auth_master_connection *conn)
+auth_master_user_list_init(struct auth_master_connection *conn,
+                          const char *user_mask,
+                          const struct auth_user_info *info)
 {
        struct auth_master_user_list_ctx *ctx;
-       const char *str;
+       string_t *str;
        pool_t pool;
 
        pool = pool_alloconly_create("auth master user list", 10240);
@@ -606,9 +610,17 @@ auth_master_user_list_init(struct auth_master_connection *conn)
        conn->reply_callback = auth_user_list_reply_callback;
        conn->reply_context = ctx;
 
-       str = t_strdup_printf("LIST\t%u\n", auth_master_next_request_id(conn));
+       str = t_str_new(128);
+       str_printfa(str, "LIST\t%u",
+                   auth_master_next_request_id(conn));
+       if (user_mask != NULL && *user_mask != '\0')
+               str_printfa(str, "\tuser=%s", user_mask);
+       if (info != NULL)
+               auth_user_info_export(str, info);
+       str_append_c(str, '\n');
+
        conn->prefix = "userdb list";
-       if (auth_master_run_cmd(conn, str) < 0)
+       if (auth_master_run_cmd(conn, str_c(str)) < 0)
                ctx->failed = TRUE;
        ctx->user_strings = array_get(&ctx->users, &ctx->user_count);
        conn->prefix = DEFAULT_USERDB_LOOKUP_PREFIX;
index 1af1525dffa2f175fa1c3c90f236ec219432e93c..91a3c6ef6a010b014eee05c85985be8a18fe21ea 100644 (file)
@@ -43,9 +43,13 @@ int auth_master_pass_lookup(struct auth_master_connection *conn,
 void auth_user_fields_parse(const char *const *fields, pool_t pool,
                            struct auth_user_reply *reply_r);
 
-/* Iterate through all users. */
+/* Iterate through all users. If user_mask is non-NULL, it contains a string
+   with wildcards ('*', '?') that the auth server MAY use to limit what users
+   are returned (but it may as well return all users anyway). */
 struct auth_master_user_list_ctx *
-auth_master_user_list_init(struct auth_master_connection *conn);
+auth_master_user_list_init(struct auth_master_connection *conn,
+                          const char *user_mask,
+                          const struct auth_user_info *info);
 const char *auth_master_user_list_next(struct auth_master_user_list_ctx *ctx);
 unsigned int auth_master_user_list_count(struct auth_master_user_list_ctx *ctx);
 /* Returns -1 if anything failed, 0 if ok */
index 69acd2c0fa1763fdec4c58b4bc7cac912d3c8045..2a9ca67602c6e1bba02241ad06b6269ee560dcc2 100644 (file)
@@ -1119,7 +1119,7 @@ mail_storage_service_all_init(struct mail_storage_service_ctx *ctx)
                (void)auth_master_user_list_deinit(&ctx->auth_list);
        mail_storage_service_init_settings(ctx, NULL);
 
-       ctx->auth_list = auth_master_user_list_init(ctx->conn);
+       ctx->auth_list = auth_master_user_list_init(ctx->conn, NULL, NULL);
        return auth_master_user_list_count(ctx->auth_list);
 }