From: Timo Sirainen Date: Wed, 23 Nov 2011 20:08:09 +0000 (+0200) Subject: lib-auth: auth_master_user_list_init() now takes user_mask and info parameters. X-Git-Tag: 2.1.rc1~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=665e9d14c005b65d95eae0baaa471c51e5caca73;p=thirdparty%2Fdovecot%2Fcore.git lib-auth: auth_master_user_list_init() now takes user_mask and info parameters. These are passed to auth process, which may use them to limit what usernames are returned. --- diff --git a/src/doveadm/doveadm-auth.c b/src/doveadm/doveadm-auth.c index c9ade8d558..482ab70b6a 100644 --- a/src/doveadm/doveadm-auth.c +++ b/src/doveadm/doveadm-auth.c @@ -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; diff --git a/src/doveadm/doveadm-director.c b/src/doveadm/doveadm-director.c index de2b770db9..2b9b21e8df 100644 --- a/src/doveadm/doveadm-director.c +++ b/src/doveadm/doveadm-director.c @@ -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) { diff --git a/src/lib-auth/auth-master.c b/src/lib-auth/auth-master.c index 0681caa066..749641013d 100644 --- a/src/lib-auth/auth-master.c +++ b/src/lib-auth/auth-master.c @@ -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; diff --git a/src/lib-auth/auth-master.h b/src/lib-auth/auth-master.h index 1af1525dff..91a3c6ef6a 100644 --- a/src/lib-auth/auth-master.h +++ b/src/lib-auth/auth-master.h @@ -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 */ diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 69acd2c0fa..2a9ca67602 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -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); }