X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source3%2Flibads%2Fads_struct.c;h=b01e0879ef9cab970a7537b33064abd87656ccb7;hb=5e54558c6dea67b56bbfaba5698f3a434d3dffb6;hp=af0b5d4143100ac95c1ba8f600c427428b2c3de0;hpb=55c978d85ea9b2fbd3eeb597d4b383399c5106a7;p=vlendec%2Fsamba-autobuild%2F.git diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c index af0b5d41431..b01e0879ef9 100644 --- a/source3/libads/ads_struct.c +++ b/source3/libads/ads_struct.c @@ -6,7 +6,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" @@ -31,34 +30,38 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int char *ret; int len; - r = strdup(realm); + r = SMB_STRDUP(realm); - if (!r || !*r) return r; + if (!r || !*r) + return r; - for (p=r; *p; p++) { - if (strchr(sep, *p)) numbits++; - } + for (p=r; *p; p++) + if (strchr(sep, *p)) + numbits++; len = (numbits+1)*(strlen(field)+1) + strlen(r) + 1; - ret = malloc(len); + ret = (char *)SMB_MALLOC(len); + if (!ret) + return NULL; + strlcpy(ret,field, len); p=strtok(r,sep); - strlcat(ret, p, len); - - while ((p=strtok(NULL,sep))) { - char *s; - if (reverse) { - asprintf(&s, "%s%s,%s", field, p, ret); - } else { - asprintf(&s, "%s,%s%s", ret, field, p); + if (p) { + strlcat(ret, p, len); + + while ((p=strtok(NULL,sep))) { + char *s; + if (reverse) + asprintf(&s, "%s%s,%s", field, p, ret); + else + asprintf(&s, "%s,%s%s", ret, field, p); + free(ret); + ret = s; } - free(ret); - ret = s; } free(r); - return ret; } @@ -71,47 +74,28 @@ char *ads_build_dn(const char *realm) return ads_build_path(realm, ".", "dc=", 0); } - -#ifdef HAVE_LDAP -/* - find the ldap server from DNS +/* return a DNS name in the for aa.bb.cc from the DN + "dc=AA,dc=BB,dc=CC". caller must free */ -static char *find_ldap_server(ADS_STRUCT *ads) +char *ads_build_domain(const char *dn) { - char *list = NULL; - struct in_addr ip; - - if (ads->realm && - strcasecmp(ads->workgroup, lp_workgroup()) == 0 && - ldap_domain2hostlist(ads->realm, &list) == LDAP_SUCCESS) { - char *p; - p = strchr(list, ':'); - if (p) *p = 0; - return list; - } - - /* get desperate, find the domain controller IP */ - if (resolve_name(ads->workgroup, &ip, 0x1B)) { - return strdup(inet_ntoa(ip)); - } + char *dnsdomain = NULL; - /* or a BDC ... */ - if (resolve_name(ads->workgroup, &ip, 0x1C)) { - return strdup(inet_ntoa(ip)); - } + /* result should always be shorter than the DN */ - return NULL; -} + if ( (dnsdomain = SMB_STRDUP( dn )) == NULL ) { + DEBUG(0,("ads_build_domain: malloc() failed!\n")); + return NULL; + } -#else + strlower_m( dnsdomain ); + all_string_sub( dnsdomain, "dc=", "", 0); + all_string_sub( dnsdomain, ",", ".", 0 ); -static char *find_ldap_server(ADS_STRUCT *ads) -{ - /* Without LDAP this doesn't make much sense */ - return NULL; + return dnsdomain; } -#endif + #ifndef LDAP_PORT #define LDAP_PORT 389 @@ -122,86 +106,63 @@ static char *find_ldap_server(ADS_STRUCT *ads) */ ADS_STRUCT *ads_init(const char *realm, const char *workgroup, - const char *ldap_server, - const char *bind_path, - const char *password) + const char *ldap_server) { ADS_STRUCT *ads; - ads = (ADS_STRUCT *)smb_xmalloc(sizeof(*ads)); + ads = SMB_XMALLOC_P(ADS_STRUCT); ZERO_STRUCTP(ads); - if (!workgroup) { - workgroup = lp_workgroup(); - } + ads->server.realm = realm? SMB_STRDUP(realm) : NULL; + ads->server.workgroup = workgroup ? SMB_STRDUP(workgroup) : NULL; + ads->server.ldap_server = ldap_server? SMB_STRDUP(ldap_server) : NULL; - ads->realm = realm? strdup(realm) : NULL; - ads->workgroup = strdup(workgroup); - ads->ldap_server = ldap_server? strdup(ldap_server) : NULL; - ads->bind_path = bind_path? strdup(bind_path) : NULL; - ads->ldap_port = LDAP_PORT; - if (password) ads->password = strdup(password); - - if (!ads->realm) { - ads->realm = strdup(lp_realm()); - if (!ads->realm[0]) { - SAFE_FREE(ads->realm); - } + /* we need to know if this is a foreign realm */ + if (realm && *realm && !strequal(lp_realm(), realm)) { + ads->server.foreign = 1; } - - if (!ads->realm && strchr_m(ads->workgroup, '.')) { - /* the smb.conf has specified the realm in 'workgroup =' */ - ads->realm = strdup(ads->workgroup); - } - - if (!ads->bind_path && ads->realm) { - ads->bind_path = ads_build_dn(ads->realm); - } - if (!ads->ldap_server) { - if (strcasecmp(ads->workgroup, lp_workgroup()) == 0) { - ads->ldap_server = strdup(lp_ads_server()); - } - if (!ads->ldap_server || !ads->ldap_server[0]) { - SAFE_FREE(ads->ldap_server); - ads->ldap_server = find_ldap_server(ads); - } - } - if (!ads->kdc_server) { - /* assume its the same as LDAP */ - ads->kdc_server = ads->ldap_server? strdup(ads->ldap_server) : NULL; + if (workgroup && *workgroup && !strequal(lp_workgroup(), workgroup)) { + ads->server.foreign = 1; } - if (ads->ldap_server) { - /* its very useful knowing the IP of the ldap server */ - ads->ldap_ip = *interpret_addr2(ads->ldap_server); - } + /* the caller will own the memory by default */ + ads->is_mine = 1; return ads; } -/* a simpler ads_init() interface using all defaults */ -ADS_STRUCT *ads_init_simple(void) -{ - return ads_init(NULL, NULL, NULL, NULL, NULL); -} - /* free the memory used by the ADS structure initialized with 'ads_init(...)' */ void ads_destroy(ADS_STRUCT **ads) { if (ads && *ads) { + BOOL is_mine; + + is_mine = (*ads)->is_mine; #if HAVE_LDAP - if ((*ads)->ld) ldap_unbind((*ads)->ld); + if ((*ads)->ld) { + ldap_unbind((*ads)->ld); + } #endif - SAFE_FREE((*ads)->realm); - SAFE_FREE((*ads)->ldap_server); - SAFE_FREE((*ads)->ldap_server_name); - SAFE_FREE((*ads)->kdc_server); - SAFE_FREE((*ads)->bind_path); - SAFE_FREE((*ads)->password); - SAFE_FREE((*ads)->user_name); + SAFE_FREE((*ads)->server.realm); + SAFE_FREE((*ads)->server.workgroup); + SAFE_FREE((*ads)->server.ldap_server); + + SAFE_FREE((*ads)->auth.realm); + SAFE_FREE((*ads)->auth.password); + SAFE_FREE((*ads)->auth.user_name); + SAFE_FREE((*ads)->auth.kdc_server); + + SAFE_FREE((*ads)->config.realm); + SAFE_FREE((*ads)->config.bind_path); + SAFE_FREE((*ads)->config.ldap_server_name); + SAFE_FREE((*ads)->config.server_site_name); + SAFE_FREE((*ads)->config.client_site_name); + ZERO_STRUCTP(*ads); - SAFE_FREE(*ads); + + if ( is_mine ) + SAFE_FREE(*ads); } }