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