Mercurial > dovecot > original-hg > dovecot-2.2
changeset 16771:5a334879572b
doveadm: Added "auth lookup" command to do a passdb lookup.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Sep 2013 22:44:20 +0300 |
parents | ed1f5b4f38be |
children | e35be66003e2 |
files | src/doveadm/doveadm-auth.c |
diffstat | 1 files changed, 64 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/doveadm-auth.c Thu Sep 19 22:43:45 2013 +0300 +++ b/src/doveadm/doveadm-auth.c Thu Sep 19 22:44:20 2013 +0300 @@ -31,8 +31,9 @@ static int cmd_user_input(const char *auth_socket_path, const struct authtest_input *input, - const char *show_field) + 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; @@ -46,18 +47,23 @@ pool = pool_alloconly_create("auth master lookup", 1024); conn = auth_master_init(auth_socket_path, 0); - ret = auth_master_user_lookup(conn, input->username, &input->info, - pool, &username, &fields); + if (userdb) { + ret = auth_master_user_lookup(conn, input->username, &input->info, + pool, &username, &fields); + } else { + ret = auth_master_pass_lookup(conn, input->username, &input->info, + pool, &fields); + } if (ret < 0) { if (fields[0] == NULL) - i_error("userdb lookup failed for %s", input->username); + i_error("%s failed for %s", lookup_name, input->username); else { - i_error("userdb lookup failed for %s: %s", + i_error("%s failed for %s: %s", lookup_name, input->username, fields[0]); } } else if (ret == 0) { fprintf(show_field == NULL ? stdout : stderr, - "userdb lookup: user %s doesn't exist\n", + "%s: user %s doesn't exist\n", lookup_name, input->username); } else if (show_field != NULL) { unsigned int show_field_len = strlen(show_field); @@ -68,7 +74,7 @@ printf("%s\n", *fields + show_field_len + 1); } } else { - printf("userdb: %s\n", input->username); + printf("%s: %s\n", userdb ? "userdb" : "passdb", input->username); for (; *fields; fields++) { p = strchr(*fields, '='); @@ -284,6 +290,54 @@ doveadm_exit_code = EX_NOPERM; } +static void cmd_auth_lookup(int argc, char *argv[]) +{ + const char *auth_socket_path = NULL; + struct authtest_input input; + const char *show_field = NULL; + bool first = TRUE; + int c, ret; + + memset(&input, 0, sizeof(input)); + input.info.service = "doveadm"; + + while ((c = getopt(argc, argv, "a:f:x:")) > 0) { + switch (c) { + case 'a': + auth_socket_path = optarg; + break; + case 'f': + show_field = optarg; + break; + case 'x': + auth_user_info_parse(&input.info, optarg); + break; + default: + auth_cmd_help(cmd_auth_lookup); + } + } + + if (optind == argc) + auth_cmd_help(cmd_auth_lookup); + + while ((input.username = argv[optind++]) != NULL) { + if (first) + first = FALSE; + else + putchar('\n'); + + ret = cmd_user_input(auth_socket_path, &input, show_field, FALSE); + switch (ret) { + case -1: + doveadm_exit_code = EX_TEMPFAIL; + break; + case 0: + doveadm_exit_code = EX_NOUSER; + break; + } + } +} + static void cmd_user_mail_input_field(const char *key, const char *value, const char *show_field) { @@ -435,7 +489,7 @@ ret = !userdb_only ? cmd_user_mail_input(storage_service, &input, show_field) : - cmd_user_input(auth_socket_path, &input, show_field); + cmd_user_input(auth_socket_path, &input, show_field, TRUE); switch (ret) { case -1: doveadm_exit_code = EX_TEMPFAIL; @@ -452,6 +506,8 @@ struct doveadm_cmd doveadm_cmd_auth[] = { { cmd_auth_test, "auth test", "[-a <auth socket path>] [-x <auth info>] <user> [<password>]" }, + { cmd_auth_lookup, "auth lookup", + "[-a <userdb socket path>] [-x <auth info>] [-f field] <user> [...]" }, { cmd_auth_cache_flush, "auth cache flush", "[-a <master socket path>] [<user> [...]]" }, { cmd_user, "user",