dovecot-2.2: auth: If passdb ldap returned no values for userdb_...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jul 10 05:37:16 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/939aa051e3f1
changeset: 16583:939aa051e3f1
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jul 10 05:37:01 2013 +0300
description:
auth: If passdb ldap returned no values for userdb_ fields, use userdb prefetch anyway.

diffstat:

 src/auth/db-ldap.c     |  18 ++++++++++++------
 src/auth/db-ldap.h     |   2 +-
 src/auth/passdb-ldap.c |   6 +++++-
 src/auth/userdb-ldap.c |   5 +++--
 4 files changed, 21 insertions(+), 10 deletions(-)

diffs (122 lines):

diff -r 9091d0f2d971 -r 939aa051e3f1 src/auth/db-ldap.c
--- a/src/auth/db-ldap.c	Wed Jul 10 05:29:45 2013 +0300
+++ b/src/auth/db-ldap.c	Wed Jul 10 05:37:01 2013 +0300
@@ -68,6 +68,7 @@
 	const char *val_1_arr[2];
 	string_t *var, *debug;
 
+	bool skip_null_values;
 	bool iter_dn_values;
 };
 
@@ -159,7 +160,8 @@
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init_full(struct ldap_connection *conn,
 				 struct ldap_request_search *ldap_request,
-				 LDAPMessage *res, bool iter_dn_values);
+				 LDAPMessage *res, bool skip_null_values,
+				 bool iter_dn_values);
 
 static int deref2str(const char *str)
 {
@@ -556,7 +558,8 @@
 	struct db_ldap_result_iterate_context *ldap_iter;
 	const char *name, *const *values;
 
-	ldap_iter = db_ldap_result_iterate_init_full(conn, request, res, TRUE);
+	ldap_iter = db_ldap_result_iterate_init_full(conn, request, res,
+						     TRUE, TRUE);
 	while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
 		if (values[1] != NULL) {
 			auth_request_log_warning(auth_request, "ldap",
@@ -1476,7 +1479,8 @@
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init_full(struct ldap_connection *conn,
 				 struct ldap_request_search *ldap_request,
-				 LDAPMessage *res, bool iter_dn_values)
+				 LDAPMessage *res, bool skip_null_values,
+				 bool iter_dn_values)
 {
 	struct db_ldap_result_iterate_context *ctx;
 	const struct ldap_request_named_result *named_res;
@@ -1488,6 +1492,7 @@
 	ctx->pool = pool;
 	ctx->auth_request = ldap_request->request.auth_request;
 	ctx->attr_map = ldap_request->attr_map;
+	ctx->skip_null_values = skip_null_values;
 	ctx->iter_dn_values = iter_dn_values;
 	hash_table_create(&ctx->ldap_attrs, pool, 0, strcase_hash, strcasecmp);
 	if (ctx->auth_request->set->debug)
@@ -1507,9 +1512,10 @@
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init(struct ldap_connection *conn,
 			    struct ldap_request_search *ldap_request,
-			    LDAPMessage *res)
+			    LDAPMessage *res, bool skip_null_values)
 {
-	return db_ldap_result_iterate_init_full(conn, ldap_request, res, FALSE);
+	return db_ldap_result_iterate_init_full(conn, ldap_request, res,
+						skip_null_values, FALSE);
 }
 
 static const char *db_ldap_field_get_default(const char *data)
@@ -1644,7 +1650,7 @@
 	*name_r = field->name;
 	*values_r = db_ldap_result_return_value(ctx, field, ldap_value);
 
-	if ((*values_r)[0] == NULL) {
+	if (ctx->skip_null_values && (*values_r)[0] == NULL) {
 		/* no values. don't confuse the caller with this reply. */
 		return db_ldap_result_iterate_next(ctx, name_r, values_r);
 	}
diff -r 9091d0f2d971 -r 939aa051e3f1 src/auth/db-ldap.h
--- a/src/auth/db-ldap.h	Wed Jul 10 05:29:45 2013 +0300
+++ b/src/auth/db-ldap.h	Wed Jul 10 05:37:01 2013 +0300
@@ -199,7 +199,7 @@
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init(struct ldap_connection *conn,
 			    struct ldap_request_search *ldap_request,
-			    LDAPMessage *res);
+			    LDAPMessage *res, bool skip_null_values);
 bool db_ldap_result_iterate_next(struct db_ldap_result_iterate_context *ctx,
 				 const char **name_r,
 				 const char *const **values_r);
diff -r 9091d0f2d971 -r 939aa051e3f1 src/auth/passdb-ldap.c
--- a/src/auth/passdb-ldap.c	Wed Jul 10 05:29:45 2013 +0300
+++ b/src/auth/passdb-ldap.c	Wed Jul 10 05:37:01 2013 +0300
@@ -47,8 +47,12 @@
 	struct db_ldap_result_iterate_context *ldap_iter;
 	const char *name, *const *values;
 
-	ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res);
+	ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res, FALSE);
 	while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
+		if (values[0] == NULL) {
+			auth_request_set_null_field(auth_request, name);
+			continue;
+		}
 		if (values[1] != NULL) {
 			auth_request_log_warning(auth_request, "ldap",
 				"Multiple values found for '%s', "
diff -r 9091d0f2d971 -r 939aa051e3f1 src/auth/userdb-ldap.c
--- a/src/auth/userdb-ldap.c	Wed Jul 10 05:29:45 2013 +0300
+++ b/src/auth/userdb-ldap.c	Wed Jul 10 05:37:01 2013 +0300
@@ -52,7 +52,7 @@
 
 	auth_request_init_userdb_reply(auth_request);
 
-	ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res);
+	ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res, TRUE);
 	while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
 		auth_request_set_userdb_field_values(auth_request,
 						     name, values);
@@ -169,7 +169,8 @@
 	request->create_time = ioloop_time;
 
 	ctx->in_callback = TRUE;
-	ldap_iter = db_ldap_result_iterate_init(conn, &urequest->request, res);
+	ldap_iter = db_ldap_result_iterate_init(conn, &urequest->request,
+						res, TRUE);
 	while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
 		if (strcmp(name, "user") != 0) {
 			i_warning("ldap: iterate: "


More information about the dovecot-cvs mailing list