summaryrefslogtreecommitdiffstats
path: root/bind-9.4.1-ldap-new-api.patch
diff options
context:
space:
mode:
authorAdam Tkac <atkac@fedoraproject.org>2007-05-22 14:39:30 +0000
committerAdam Tkac <atkac@fedoraproject.org>2007-05-22 14:39:30 +0000
commit45783cc5d4c8ddf7c461f49344af8553355efd74 (patch)
tree8bbd6afe5f324bdee62b8efd305b7a75840469ee /bind-9.4.1-ldap-new-api.patch
parent1820066703d5c14e815f6ac38ad49072e1fb8da1 (diff)
- fixed bind-chroot-admin dynamic zone update handling
- rewrited ldap backend to latest api
Diffstat (limited to 'bind-9.4.1-ldap-new-api.patch')
-rw-r--r--bind-9.4.1-ldap-new-api.patch351
1 files changed, 351 insertions, 0 deletions
diff --git a/bind-9.4.1-ldap-new-api.patch b/bind-9.4.1-ldap-new-api.patch
new file mode 100644
index 0000000..66412af
--- /dev/null
+++ b/bind-9.4.1-ldap-new-api.patch
@@ -0,0 +1,351 @@
+--- bind-9.4.1/contrib/sdb/ldap/ldapdb.c.new-api 2004-08-27 02:10:25.000000000 +0200
++++ bind-9.4.1/contrib/sdb/ldap/ldapdb.c 2007-05-21 15:22:10.000000000 +0200
+@@ -58,9 +58,13 @@
+ static dns_sdbimplementation_t *ldapdb = NULL;
+
+ struct ldapdb_data {
++#if LDAP_API_VERSION >= 3001
++ LDAPURLDesc *lud;
++#else
+ char *hostport;
+ char *hostname;
+ int portno;
++#endif
+ char *base;
+ int defaultttl;
+ char *filterall;
+@@ -135,7 +139,11 @@ ldapdb_getconn(struct ldapdb_data *data)
+ conndata = threaddata->data;
+ free(conndata->index);
+ if (conndata->data != NULL)
++#if LDAP_API_VERSION < 3001
+ ldap_unbind((LDAP *)conndata->data);
++#else
++ ldap_unbind_ext((LDAP *)conndata->data, NULL, NULL);
++#endif
+ threaddata->data = conndata->next;
+ free(conndata);
+ }
+@@ -172,14 +180,14 @@ ldapdb_getconn(struct ldapdb_data *data)
+ /* threaddata points at the connection list for current thread */
+ /* look for existing connection to our server */
+ conndata = ldapdb_find((struct ldapdb_entry *)threaddata->data,
+- data->hostport, strlen(data->hostport));
++ data->lud->lud_host, strlen(data->lud->lud_host));
+ if (conndata == NULL) {
+ /* no connection data structure for this server, create one */
+ conndata = malloc(sizeof(*conndata));
+ if (conndata == NULL)
+ return (NULL);
+- conndata->index = data->hostport;
+- conndata->size = strlen(data->hostport);
++ conndata->index = data->lud->lud_host;
++ conndata->size = strlen(data->lud->lud_host);
+ conndata->data = NULL;
+ ldapdb_insert((struct ldapdb_entry **)&threaddata->data,
+ conndata);
+@@ -196,9 +204,15 @@ ldapdb_bind(struct ldapdb_data *data, LD
+ #endif
+
+ if (*ldp != NULL)
++#if LDAP_API_VERSION < 3001
+ ldap_unbind(*ldp);
+ *ldp = ldap_open(data->hostname, data->portno);
+ if (*ldp == NULL)
++#else
++ ldap_unbind_ext (*ldp, NULL, NULL);
++ int res = ldap_initialize(ldp, ldap_url_desc2str(data->lud));
++ if (res != LDAP_SUCCESS)
++#endif
+ return;
+
+ #ifndef LDAPDB_RFC1823API
+@@ -211,8 +225,17 @@ ldapdb_bind(struct ldapdb_data *data, LD
+ }
+ #endif
+
++#if LDAP_API_VERSION < 3001
+ if (ldap_simple_bind_s(*ldp, data->bindname, data->bindpw) != LDAP_SUCCESS) {
+ ldap_unbind(*ldp);
++#else
++ struct berval ber;
++ ber.bv_val = data->bindpw;
++ ber.bv_len = (data->bindpw == NULL) ? 0 : strlen(data->bindpw);
++
++ if (ldap_sasl_bind_s(*ldp, data->base, LDAP_SASL_SIMPLE, &ber, NULL, NULL, NULL) != LDAP_SUCCESS) {
++ ldap_unbind_ext(*ldp, NULL, NULL);
++#endif
+ *ldp = NULL;
+ }
+ }
+@@ -224,14 +247,19 @@ ldapdb_search(const char *zone, const ch
+ isc_result_t result = ISC_R_NOTFOUND;
+ LDAP **ldp;
+ LDAPMessage *res, *e;
+- char *fltr, *a, **vals = NULL, **names = NULL;
++ char *fltr, *a;
++#if LDAP_API_VERSION < 3001
++ char **names, **vals;
++#else
++ struct berval **names, **vals;
++#endif
+ char type[64];
+ #ifdef LDAPDB_RFC1823API
+ void *ptr;
+ #else
+ BerElement *ptr;
+ #endif
+- int i, j, errno, msgid;
++ int i, j, errno, msgid, ldap_res;
+
+ ldp = ldapdb_getconn(data);
+ if (ldp == NULL)
+@@ -256,12 +284,21 @@ ldapdb_search(const char *zone, const ch
+ sprintf(data->filtername, "%s))", name);
+ fltr = data->filterone;
+ }
+-
++#if LDAP_API_VERSION < 3001
+ msgid = ldap_search(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0);
++#else
++ ldap_res = ldap_search_ext(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0,
++ NULL, NULL, NULL, 65535, &msgid);
++#endif
+ if (msgid == -1) {
+ ldapdb_bind(data, ldp);
+ if (*ldp != NULL)
++#if LDAP_API_VERSION < 3001
+ msgid = ldap_search(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0);
++#else
++ ldap_res = ldap_search_ext(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0,
++ NULL, NULL, NULL, 65535, &msgid);
++#endif
+ }
+
+ if (*ldp == NULL || msgid == -1) {
+@@ -293,15 +330,27 @@ ldapdb_search(const char *zone, const ch
+ }
+
+ if (name == NULL) {
++#if LDAP_API_VERSION < 3001
+ names = ldap_get_values(ld, e, "relativeDomainName");
++#else
++ names = ldap_get_values_len(ld, e, "relativeDomainName");
++#endif
+ if (names == NULL)
+ continue;
+ }
+-
++#if LDAP_API_VERSION < 3001
+ vals = ldap_get_values(ld, e, "dNSTTL");
++#else
++ vals = ldap_get_values_len(ld, e, "dNSTTL");
++#endif
+ if (vals != NULL) {
++#if LDAP_API_VERSION < 3001
+ ttl = atoi(vals[0]);
+ ldap_value_free(vals);
++#else
++ ttl = atoi(vals[0]->bv_val);
++ ldap_value_free_len(vals);
++#endif
+ }
+
+ for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; a = ldap_next_attribute(ld, e, ptr)) {
+@@ -319,34 +368,60 @@ ldapdb_search(const char *zone, const ch
+
+ strncpy(type, a, s - a);
+ type[s - a] = '\0';
++#if LDAP_API_VERSION < 3001
+ vals = ldap_get_values(ld, e, a);
++#else
++ vals = ldap_get_values_len(ld, e, a);
++#endif
+ if (vals != NULL) {
+ for (i = 0; vals[i] != NULL; i++) {
+ if (name != NULL) {
++#if LDAP_API_VERSION < 3001
+ result = dns_sdb_putrr(retdata, type, ttl, vals[i]);
++#else
++ result = dns_sdb_putrr(retdata, type, ttl, vals[i]->bv_val);
++#endif
+ } else {
+ for (j = 0; names[j] != NULL; j++) {
++#if LDAP_API_VERSION < 3001
+ result = dns_sdb_putnamedrr(retdata, names[j], type, ttl, vals[i]);
++#else
++ result = dns_sdb_putnamedrr(retdata, names[j]->bv_val, type, ttl, vals[i]->bv_val);
++#endif
+ if (result != ISC_R_SUCCESS)
+ break;
+ }
+ }
+-; if (result != ISC_R_SUCCESS) {
++ if (result != ISC_R_SUCCESS) {
++#if LDAP_API_VERSION < 3001
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "LDAP sdb zone '%s': dns_sdb_put... failed for %s", zone, vals[i]);
+ ldap_value_free(vals);
++#else
++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
++ "LDAP sdb zone '%s': dns_sdb_put... failed for %s", zone, vals[i]->bv_val);
++ ldap_value_free_len(vals);
++#endif
+ #ifndef LDAPDB_RFC1823API
+ ldap_memfree(a);
+ if (ptr != NULL)
+ ber_free(ptr, 0);
+ #endif
+ if (name == NULL)
++#if LDAP_API_VERSION < 3001
+ ldap_value_free(names);
++#else
++ ldap_value_free_len(names);
++#endif
+ ldap_msgfree(res);
+ return (ISC_R_FAILURE);
+ }
+ }
++#if LDAP_API_VERSION < 3001
+ ldap_value_free(vals);
++#else
++ ldap_value_free_len(vals);
++#endif
+ }
+ #ifndef LDAPDB_RFC1823API
+ ldap_memfree(a);
+@@ -357,7 +432,11 @@ ldapdb_search(const char *zone, const ch
+ ber_free(ptr, 0);
+ #endif
+ if (name == NULL)
++#if LDAP_API_VERSION < 3001
+ ldap_value_free(names);
++#else
++ ldap_value_free_len(names);
++#endif
+
+ /* free this result */
+ ldap_msgfree(res);
+@@ -460,10 +539,15 @@ parseextensions(char *extensions, struct
+ static void
+ free_data(struct ldapdb_data *data)
+ {
++#if LDAP_API_VERSION < 3001
+ if (data->hostport != NULL)
+ isc_mem_free(ns_g_mctx, data->hostport);
+ if (data->hostname != NULL)
+ isc_mem_free(ns_g_mctx, data->hostname);
++#else
++ if (data->lud != NULL)
++ ldap_free_urldesc(data->lud);
++#endif
+ if (data->filterall != NULL)
+ isc_mem_put(ns_g_mctx, data->filterall, data->filteralllen);
+ if (data->filterone != NULL)
+@@ -478,7 +562,7 @@ ldapdb_create(const char *zone, int argc
+ {
+ struct ldapdb_data *data;
+ char *s, *filter = NULL, *extensions = NULL;
+- int defaultttl;
++ int defaultttl, i;
+
+ UNUSED(driverdata);
+
+@@ -486,7 +570,10 @@ ldapdb_create(const char *zone, int argc
+ /* want to do this only once for all instances */
+
+ if ((argc < 2)
++#if LDAP_API_VERSION < 3001
++ /* Could be ldap[is]:// */
+ || (argv[0] != strstr( argv[0], "ldap://"))
++#endif
+ || ((defaultttl = atoi(argv[1])) < 1))
+ return (ISC_R_FAILURE);
+ data = isc_mem_get(ns_g_mctx, sizeof(struct ldapdb_data));
+@@ -494,14 +581,15 @@ ldapdb_create(const char *zone, int argc
+ return (ISC_R_NOMEMORY);
+
+ memset(data, 0, sizeof(struct ldapdb_data));
++
++ data->defaultttl = defaultttl;
++#if LDAP_API_VERSION < 3001
+ data->hostport = isc_mem_strdup(ns_g_mctx, argv[0] + strlen("ldap://"));
+ if (data->hostport == NULL) {
+ free_data(data);
+ return (ISC_R_NOMEMORY);
+ }
+
+- data->defaultttl = defaultttl;
+-
+ s = strchr(data->hostport, '/');
+ if (s != NULL) {
+ *s++ = '\0';
+@@ -544,11 +632,26 @@ ldapdb_create(const char *zone, int argc
+ }
+ }
+
++#else
++ if (ldap_url_parse (argv[0], &data->lud) != LDAP_URL_SUCCESS) {
++ free_data (data);
++ return (ISC_R_FAILURE);
++ }
++
++ data->base = data->lud->lud_dn;
++
++ for (i = 0; data->lud->lud_exts[i] != NULL; i++) {
++ extensions = strdup (data->lud->lud_exts[i]);
++#endif
++
+ /* parse extensions */
+ if (extensions != NULL) {
+ int err;
+
+ err = parseextensions(extensions, data);
++#if LDAP_API_VERSION >= 3001
++ free (extensions);
++#endif
+ if (err < 0) {
+ /* err should be -1 or -2 */
+ free_data(data);
+@@ -562,6 +665,14 @@ ldapdb_create(const char *zone, int argc
+ return (ISC_R_FAILURE);
+ }
+ }
++#if LDAP_API_VERSION >= 3001
++ else {
++ free_data (data);
++ return (ISC_R_NOMEMORY);
++ }
++ }
++ filter = data->lud->lud_filter;
++#else
+
+ if ((data->base != NULL && unhex(data->base) == NULL) ||
+ (filter != NULL && unhex(filter) == NULL) ||
+@@ -572,6 +683,7 @@ ldapdb_create(const char *zone, int argc
+ "LDAP sdb zone '%s': URL: bad hex values", zone);
+ return (ISC_R_FAILURE);
+ }
++#endif
+
+ /* compute filterall and filterone once and for all */
+ if (filter == NULL) {
+@@ -602,6 +714,7 @@ ldapdb_create(const char *zone, int argc
+ }
+ data->filtername = data->filterone + strlen(data->filterone);
+
++#if LDAP_API_VERSION < 3001
+ /* support URLs with literal IPv6 addresses */
+ data->hostname = isc_mem_strdup(ns_g_mctx, data->hostport + (*data->hostport == '[' ? 1 : 0));
+ if (data->hostname == NULL) {
+@@ -620,8 +733,10 @@ ldapdb_create(const char *zone, int argc
+ data->portno = atoi(s);
+ } else
+ data->portno = LDAP_PORT;
++#endif
+
+ *dbdata = data;
++
+ return (ISC_R_SUCCESS);
+ }
+