dovecot-2.2: doveadm: Added "auth lookup" command to do a passdb...

dovecot at dovecot.org dovecot at dovecot.org
Thu Sep 19 22:44:28 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/5a334879572b
changeset: 16771:5a334879572b
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Sep 19 22:44:20 2013 +0300
description:
doveadm: Added "auth lookup" command to do a passdb lookup.

diffstat:

 src/doveadm/doveadm-auth.c |  72 ++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 64 insertions(+), 8 deletions(-)

diffs (125 lines):

diff -r ed1f5b4f38be -r 5a334879572b src/doveadm/doveadm-auth.c
--- 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",


More information about the dovecot-cvs mailing list