const char *val_1_arr[2];
string_t *var, *debug;
+ bool skip_null_values;
bool iter_dn_values;
};
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)
{
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",
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;
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)
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)
*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);
}
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', "
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);
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: "