Mercurial > dovecot > core-2.2
view src/lib-ldap/ldap-entry.c @ 22633:9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Recreate it only when the timeout should change.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 04 Nov 2017 01:34:02 +0200 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
line wrap: on
line source
/* Copyright (c) 2016-2017 Dovecot authors, see the included COPYING file */ #include "lib.h" #include "array.h" #include "ldap-private.h" int ldap_entry_init(struct ldap_entry *obj, struct ldap_result *result, LDAPMessage *message) { ARRAY_TYPE(const_string) attr_names; struct berval **values; int count; BerElement *bptr; char *tmp; tmp = ldap_get_dn(result->conn->conn, message); obj->dn = p_strdup(result->pool, tmp); obj->result = result; ldap_memfree(tmp); tmp = ldap_first_attribute(result->conn->conn, message, &bptr); p_array_init(&attr_names, result->pool, 8); p_array_init(&(obj->attributes), result->pool, 8); while(tmp != NULL) { struct ldap_attribute *attr = p_new(result->pool, struct ldap_attribute, 1); attr->name = p_strdup(result->pool, tmp); array_append(&attr_names, &(attr->name), 1); values = ldap_get_values_len(result->conn->conn, message, tmp); if (values != NULL) { count = ldap_count_values_len(values); p_array_init(&(attr->values), result->pool, count); for(int i = 0; i < count; i++) { const char *ptr = p_strndup(result->pool, values[i]->bv_val, values[i]->bv_len); array_append(&(attr->values), &ptr, 1); } ldap_value_free_len(values); } array_append_zero(&(attr->values)); ldap_memfree(tmp); array_append(&(obj->attributes), attr, 1); tmp = ldap_next_attribute(result->conn->conn, message, bptr); } ber_free(bptr, 0); array_append_zero(&attr_names); obj->attr_names = array_idx(&attr_names, 0); return 0; } const char *ldap_entry_dn(const struct ldap_entry *entry) { return entry->dn; } const char *const *ldap_entry_get_attributes(const struct ldap_entry *entry) { return entry->attr_names; } const char *const *ldap_entry_get_attribute(const struct ldap_entry *entry, const char *attribute) { const struct ldap_attribute *attr; array_foreach(&(entry->attributes), attr) { if (strcasecmp(attr->name, attribute) == 0) { return array_idx(&(attr->values), 0); } } return NULL; }