]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: If passdb ldap returned no values for userdb_ fields, use userdb prefetch anyway.
authorTimo Sirainen <tss@iki.fi>
Wed, 10 Jul 2013 02:37:01 +0000 (05:37 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 10 Jul 2013 02:37:01 +0000 (05:37 +0300)
src/auth/db-ldap.c
src/auth/db-ldap.h
src/auth/passdb-ldap.c
src/auth/userdb-ldap.c

index 77706f192f65d2c7e57022f9e4af462eabe7924d..9db7b0a8734e8bcdbdb8e43f0394db8dbeb67fa4 100644 (file)
@@ -68,6 +68,7 @@ struct db_ldap_result_iterate_context {
        const char *val_1_arr[2];
        string_t *var, *debug;
 
+       bool skip_null_values;
        bool iter_dn_values;
 };
 
@@ -159,7 +160,8 @@ static void db_ldap_conn_close(struct ldap_connection *conn);
 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 @@ static int db_ldap_fields_get_dn(struct ldap_connection *conn,
        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 @@ get_ldap_fields(struct db_ldap_result_iterate_context *ctx,
 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 @@ db_ldap_result_iterate_init_full(struct ldap_connection *conn,
        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 @@ db_ldap_result_iterate_init_full(struct ldap_connection *conn,
 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 @@ bool db_ldap_result_iterate_next(struct db_ldap_result_iterate_context *ctx,
        *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);
        }
index 8bb0f3855aebaa03fd86d34ccdede7a70c260fff..f6fa8708abc3a7b209d681dbe66a78bbc174ea76 100644 (file)
@@ -199,7 +199,7 @@ const char *ldap_get_error(struct ldap_connection *conn);
 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);
index 535a3ba3c9d209b9383f0db22f3b31b7260ceaa9..15d392c163aeb6fbae14f2970362db2fc14b2a87 100644 (file)
@@ -47,8 +47,12 @@ ldap_query_save_result(struct ldap_connection *conn,
        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', "
index 9ef6243622c69ab8d5f7e933c40ece8debb9298e..f009c88695994d6faa2afe1e26770fa045821383 100644 (file)
@@ -52,7 +52,7 @@ ldap_query_get_result(struct ldap_connection *conn,
 
        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 @@ static void userdb_ldap_iterate_callback(struct ldap_connection *conn,
        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: "