summaryrefslogtreecommitdiff
path: root/source3/libads/ads_struct.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/libads/ads_struct.c')
-rw-r--r--source3/libads/ads_struct.c107
1 files changed, 82 insertions, 25 deletions
diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c
index b68c822ce3..638dc0b22e 100644
--- a/source3/libads/ads_struct.c
+++ b/source3/libads/ads_struct.c
@@ -72,6 +72,47 @@ char *ads_build_dn(const char *realm)
}
+#ifdef HAVE_LDAP
+/*
+ find the ldap server from DNS
+*/
+static char *find_ldap_server(ADS_STRUCT *ads)
+{
+ 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));
+ }
+
+ /* or a BDC ... */
+ if (resolve_name(ads->workgroup, &ip, 0x1C)) {
+ return strdup(inet_ntoa(ip));
+ }
+
+ return NULL;
+}
+
+#else
+
+static char *find_ldap_server(ADS_STRUCT *ads)
+{
+ /* Without LDAP this doesn't make much sense */
+ return NULL;
+}
+
+#endif
+
#ifndef LDAP_PORT
#define LDAP_PORT 389
#endif
@@ -81,24 +122,46 @@ char *ads_build_dn(const char *realm)
*/
ADS_STRUCT *ads_init(const char *realm,
const char *workgroup,
- const char *ldap_server)
+ const char *ldap_server,
+ const char *bind_path,
+ const char *password)
{
ADS_STRUCT *ads;
ads = (ADS_STRUCT *)smb_xmalloc(sizeof(*ads));
ZERO_STRUCTP(ads);
- ads->server.realm = realm? strdup(realm) : NULL;
- ads->server.workgroup = workgroup ? strdup(workgroup) : NULL;
- ads->server.ldap_server = ldap_server? strdup(ldap_server) : NULL;
-
- /* we need to know if this is a foreign realm to know if we can
- use lp_ads_server() */
- if (realm && strcasecmp(lp_realm(), realm) != 0) {
- ads->server.foreign = 1;
+ if (!workgroup) {
+ workgroup = lp_workgroup();
}
- if (workgroup && strcasecmp(lp_workgroup(), workgroup) != 0) {
- ads->server.foreign = 1;
+
+ 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);
+ }
+ }
+ 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]) {
+ 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;
}
return ads;
@@ -107,7 +170,7 @@ ADS_STRUCT *ads_init(const char *realm,
/* a simpler ads_init() interface using all defaults */
ADS_STRUCT *ads_init_simple(void)
{
- return ads_init(NULL, NULL, NULL);
+ return ads_init(NULL, NULL, NULL, NULL, NULL);
}
/*
@@ -119,19 +182,13 @@ void ads_destroy(ADS_STRUCT **ads)
#if HAVE_LDAP
if ((*ads)->ld) ldap_unbind((*ads)->ld);
#endif
- 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)->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);
ZERO_STRUCTP(*ads);
SAFE_FREE(*ads);
}