Mercurial > dovecot > core-2.2
changeset 16583:939aa051e3f1
auth: If passdb ldap returned no values for userdb_ fields, use userdb prefetch anyway.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 10 Jul 2013 05:37:01 +0300 |
parents | 9091d0f2d971 |
children | 673648c6fb4b |
files | src/auth/db-ldap.c src/auth/db-ldap.h src/auth/passdb-ldap.c src/auth/userdb-ldap.c |
diffstat | 4 files changed, 21 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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);
--- 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', "
--- 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: "