📄 ldapdb.c
字号:
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);#ifndef LDAPDB_RFC1823API ldap_memfree(a); if (ptr != NULL) ber_free(ptr, 0);#endif if (name == NULL) ldap_value_free(names); ldap_msgfree(res); return (ISC_R_FAILURE); } } ldap_value_free(vals); }#ifndef LDAPDB_RFC1823API ldap_memfree(a);#endif }#ifndef LDAPDB_RFC1823API if (ptr != NULL) ber_free(ptr, 0);#endif if (name == NULL) ldap_value_free(names); /* free this result */ ldap_msgfree(res); } /* free final result */ ldap_msgfree(res); return (result);}/* callback routines */static isc_result_tldapdb_lookup(const char *zone, const char *name, void *dbdata, dns_sdblookup_t *lookup){ return ldapdb_search(zone, name, dbdata, lookup);}static isc_result_tldapdb_allnodes(const char *zone, void *dbdata, dns_sdballnodes_t *allnodes){ return ldapdb_search(zone, NULL, dbdata, allnodes);}static char *unhex(char *in){ static const char hexdigits[] = "0123456789abcdef"; char *p, *s = in; int d1, d2; while ((s = strchr(s, '%'))) { if (!(s[1] && s[2])) return NULL; if ((p = strchr(hexdigits, tolower(s[1]))) == NULL) return NULL; d1 = p - hexdigits; if ((p = strchr(hexdigits, tolower(s[2]))) == NULL) return NULL; d2 = p - hexdigits; *s++ = d1 << 4 | d2; memmove(s, s + 2, strlen(s) - 1); } return in;}/* returns 0 for ok, -1 for bad syntax, -2 for unknown critical extension */static intparseextensions(char *extensions, struct ldapdb_data *data){ char *s, *next, *name, *value; int critical; while (extensions != NULL) { s = strchr(extensions, ','); if (s != NULL) { *s++ = '\0'; next = s; } else { next = NULL; } if (*extensions != '\0') { s = strchr(extensions, '='); if (s != NULL) { *s++ = '\0'; value = *s != '\0' ? s : NULL; } else { value = NULL; } name = extensions; critical = *name == '!'; if (critical) { name++; } if (*name == '\0') { return -1; } if (!strcasecmp(name, "bindname")) { data->bindname = value; } else if (!strcasecmp(name, "x-bindpw")) { data->bindpw = value;#ifdef LDAPDB_TLS } else if (!strcasecmp(name, "x-tls")) { data->tls = value == NULL || !strcasecmp(value, "true");#endif } else if (critical) { return -2; } } extensions = next; } return 0;}static voidfree_data(struct ldapdb_data *data){ if (data->hostport != NULL) isc_mem_free(ns_g_mctx, data->hostport); if (data->hostname != NULL) isc_mem_free(ns_g_mctx, data->hostname); if (data->filterall != NULL) isc_mem_put(ns_g_mctx, data->filterall, data->filteralllen); if (data->filterone != NULL) isc_mem_put(ns_g_mctx, data->filterone, data->filteronelen); isc_mem_put(ns_g_mctx, data, sizeof(struct ldapdb_data));}static isc_result_tldapdb_create(const char *zone, int argc, char **argv, void *driverdata, void **dbdata){ struct ldapdb_data *data; char *s, *filter = NULL, *extensions = NULL; int defaultttl; UNUSED(driverdata); /* we assume that only one thread will call create at a time */ /* want to do this only once for all instances */ if ((argc < 2) || (argv[0] != strstr( argv[0], "ldap://")) || ((defaultttl = atoi(argv[1])) < 1)) return (ISC_R_FAILURE); data = isc_mem_get(ns_g_mctx, sizeof(struct ldapdb_data)); if (data == NULL) return (ISC_R_NOMEMORY); memset(data, 0, sizeof(struct ldapdb_data)); 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'; data->base = s; /* attrs, scope, filter etc? */ s = strchr(s, '?'); if (s != NULL) { *s++ = '\0'; /* ignore attributes */ s = strchr(s, '?'); if (s != NULL) { *s++ = '\0'; /* ignore scope */ s = strchr(s, '?'); if (s != NULL) { *s++ = '\0'; /* filter */ filter = s; s = strchr(s, '?'); if (s != NULL) { *s++ = '\0'; /* extensions */ extensions = s; s = strchr(s, '?'); if (s != NULL) { *s++ = '\0'; } if (*extensions == '\0') { extensions = NULL; } } if (*filter == '\0') { filter = NULL; } } } } if (*data->base == '\0') { data->base = NULL; } } /* parse extensions */ if (extensions != NULL) { int err; err = parseextensions(extensions, data); if (err < 0) { /* err should be -1 or -2 */ free_data(data); if (err == -1) { isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR, "LDAP sdb zone '%s': URL: extension syntax error", zone); } else if (err == -2) { isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR, "LDAP sdb zone '%s': URL: unknown critical extension", zone); } return (ISC_R_FAILURE); } } if ((data->base != NULL && unhex(data->base) == NULL) || (filter != NULL && unhex(filter) == NULL) || (data->bindname != NULL && unhex(data->bindname) == NULL) || (data->bindpw != NULL && unhex(data->bindpw) == NULL)) { free_data(data); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR, "LDAP sdb zone '%s': URL: bad hex values", zone); return (ISC_R_FAILURE); } /* compute filterall and filterone once and for all */ if (filter == NULL) { data->filteralllen = strlen(zone) + strlen("(zoneName=)") + 1; data->filteronelen = strlen(zone) + strlen("(&(zoneName=)(relativeDomainName=))") + MAXNAMELEN + 1; } else { data->filteralllen = strlen(filter) + strlen(zone) + strlen("(&(zoneName=))") + 1; data->filteronelen = strlen(filter) + strlen(zone) + strlen("(&(zoneName=)(relativeDomainName=))") + MAXNAMELEN + 1; } data->filterall = isc_mem_get(ns_g_mctx, data->filteralllen); if (data->filterall == NULL) { free_data(data); return (ISC_R_NOMEMORY); } data->filterone = isc_mem_get(ns_g_mctx, data->filteronelen); if (data->filterone == NULL) { free_data(data); return (ISC_R_NOMEMORY); } if (filter == NULL) { sprintf(data->filterall, "(zoneName=%s)", zone); sprintf(data->filterone, "(&(zoneName=%s)(relativeDomainName=", zone); } else { sprintf(data->filterall, "(&%s(zoneName=%s))", filter, zone); sprintf(data->filterone, "(&%s(zoneName=%s)(relativeDomainName=", filter, zone); } data->filtername = data->filterone + strlen(data->filterone); /* support URLs with literal IPv6 addresses */ data->hostname = isc_mem_strdup(ns_g_mctx, data->hostport + (*data->hostport == '[' ? 1 : 0)); if (data->hostname == NULL) { free_data(data); return (ISC_R_NOMEMORY); } if (*data->hostport == '[' && (s = strchr(data->hostname, ']')) != NULL ) *s++ = '\0'; else s = data->hostname; s = strchr(s, ':'); if (s != NULL) { *s++ = '\0'; data->portno = atoi(s); } else data->portno = LDAP_PORT; *dbdata = data; return (ISC_R_SUCCESS);}static voidldapdb_destroy(const char *zone, void *driverdata, void **dbdata) { struct ldapdb_data *data = *dbdata; UNUSED(zone); UNUSED(driverdata); free_data(data);}static dns_sdbmethods_t ldapdb_methods = { ldapdb_lookup, NULL, /* authority */ ldapdb_allnodes, ldapdb_create, ldapdb_destroy};/* Wrapper around dns_sdb_register() */isc_result_tldapdb_init(void) { unsigned int flags = DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA | DNS_SDBFLAG_THREADSAFE; ldapdb_lock(0); return (dns_sdb_register("ldap", &ldapdb_methods, NULL, flags, ns_g_mctx, &ldapdb));}/* Wrapper around dns_sdb_unregister() */voidldapdb_clear(void) { if (ldapdb != NULL) { /* clean up thread data */ ldapdb_getconn(NULL); dns_sdb_unregister(&ldapdb); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -