svn commit: samba r24952 - in branches: SAMBA_3_2/source/nsswitch SAMBA_3_2_0/source/nsswitch

gd at samba.org gd at samba.org
Tue Sep 4 14:06:34 GMT 2007


Author: gd
Date: 2007-09-04 14:06:33 +0000 (Tue, 04 Sep 2007)
New Revision: 24952

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24952

Log:
Set the kdc locator env vars. This makes the krb5 locator plugin fully
operational (from within winbindd and outside).

Guenther

Modified:
   branches/SAMBA_3_2/source/nsswitch/winbindd_cm.c
   branches/SAMBA_3_2/source/nsswitch/winbindd_util.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_cm.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_util.c


Changeset:
Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_cm.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_cm.c	2007-09-04 13:21:24 UTC (rev 24951)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_cm.c	2007-09-04 14:06:33 UTC (rev 24952)
@@ -395,6 +395,8 @@
 		return;
 	}
 
+	winbindd_set_locator_kdc_envs(domain);
+
 	/* If we are waiting to get a krb5 ticket, trigger immediately. */
 	GetTimeOfDay(&now);
 	set_event_dispatch_time(winbind_event_context(),
@@ -520,6 +522,7 @@
 		add_failed_connection_entry(domain->alt_name, server, result);
 		saf_delete(domain->alt_name);
 	}
+	winbindd_unset_locator_kdc_env(domain);
 }
 
 /* Choose between anonymous or authenticated connections.  We need to use
@@ -741,6 +744,8 @@
 				  "[%s]\n", controller, global_myname(),
 				  machine_krb5_principal));
 
+			winbindd_set_locator_kdc_envs(domain);
+
 			ads_status = cli_session_setup_spnego(*cli,
 							      machine_krb5_principal, 
 							      machine_password, 
@@ -837,6 +842,8 @@
 		saf_store( domain->alt_name, (*cli)->desthost );
 	}
 
+	winbindd_set_locator_kdc_envs(domain);
+
 	if (!cli_send_tconX(*cli, "IPC$", "IPC", "", 0)) {
 
 		result = cli_nt_error(*cli);
@@ -1089,6 +1096,8 @@
 								sitename,
 								ip);
 
+				winbindd_set_locator_kdc_envs(domain);
+
 				SAFE_FREE(sitename);
 				/* Ensure we contact this DC also. */
 				saf_store( domain->name, name);
@@ -1394,6 +1403,9 @@
 	}
 
 	if (NT_STATUS_IS_OK(result)) {
+
+		winbindd_set_locator_kdc_envs(domain);
+
 		if (domain->online == False) {
 			/* We're changing state from offline to online. */
 			set_global_winbindd_state_online();

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_util.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_util.c	2007-09-04 13:21:24 UTC (rev 24951)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_util.c	2007-09-04 14:06:33 UTC (rev 24952)
@@ -1366,24 +1366,40 @@
 	return False;
 }
 
+void winbindd_set_locator_kdc_envs(const struct winbindd_domain *domain);
+void winbindd_unset_locator_kdc_env(const struct winbindd_domain *domain);
+
+#ifdef HAVE_KRB5_LOCATE_PLUGIN_H
+
 /*********************************************************************
  ********************************************************************/
 
-void winbindd_set_locator_kdc_env(const struct winbindd_domain *domain)
+static void winbindd_set_locator_kdc_env(const struct winbindd_domain *domain)
 {
 	char *var = NULL;
 	const char *kdc = NULL;
+	int lvl = 11;
 
-	if (!domain) {
+	if (!domain || !domain->alt_name || !*domain->alt_name) {
 		return;
 	}
 
+	if (domain->initialized && !domain->active_directory) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s not AD\n",
+			domain->alt_name));
+		return;
+	}
+
 	kdc = inet_ntoa(domain->dcaddr.sin_addr);
 	if (!kdc) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s no DC IP\n",
+			domain->alt_name));
 		kdc = domain->dcname;
 	}
 
 	if (!kdc || !*kdc) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s no DC at all\n",
+			domain->alt_name));
 		return;
 	}
 
@@ -1392,9 +1408,45 @@
 		return;
 	}
 
-	DEBUG(10,("winbindd_set_locator_kdc_env: setting var: %s to: %s\n",
+	DEBUG(lvl,("winbindd_set_locator_kdc_env: setting var: %s to: %s\n",
 		var, kdc));
 
 	setenv(var, kdc, 1);
 	free(var);
 }
+
+/*********************************************************************
+ ********************************************************************/
+
+void winbindd_set_locator_kdc_envs(const struct winbindd_domain *domain)
+{
+	struct winbindd_domain *our_dom = find_our_domain();
+
+	winbindd_set_locator_kdc_env(domain);
+
+	if (domain != our_dom) {
+		winbindd_set_locator_kdc_env(our_dom);
+	}
+}
+
+/*********************************************************************
+ ********************************************************************/
+
+void winbindd_unset_locator_kdc_env(const struct winbindd_domain *domain)
+{
+	char *var = NULL;
+
+	if (!domain || !domain->alt_name || !*domain->alt_name) {
+		return;
+	}
+
+	if (asprintf(&var, "%s_%s", WINBINDD_LOCATOR_KDC_ADDRESS,
+		     strupper_static(domain->alt_name)) == -1) {
+		return;
+	}
+
+	unsetenv(var);
+	free(var);
+}
+
+#endif /* HAVE_KRB5_LOCATE_PLUGIN_H */

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_cm.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_cm.c	2007-09-04 13:21:24 UTC (rev 24951)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_cm.c	2007-09-04 14:06:33 UTC (rev 24952)
@@ -395,6 +395,8 @@
 		return;
 	}
 
+	winbindd_set_locator_kdc_envs(domain);
+
 	/* If we are waiting to get a krb5 ticket, trigger immediately. */
 	GetTimeOfDay(&now);
 	set_event_dispatch_time(winbind_event_context(),
@@ -520,6 +522,7 @@
 		add_failed_connection_entry(domain->alt_name, server, result);
 		saf_delete(domain->alt_name);
 	}
+	winbindd_unset_locator_kdc_env(domain);
 }
 
 /* Choose between anonymous or authenticated connections.  We need to use
@@ -741,6 +744,8 @@
 				  "[%s]\n", controller, global_myname(),
 				  machine_krb5_principal));
 
+			winbindd_set_locator_kdc_envs(domain);
+
 			ads_status = cli_session_setup_spnego(*cli,
 							      machine_krb5_principal, 
 							      machine_password, 
@@ -837,6 +842,8 @@
 		saf_store( domain->alt_name, (*cli)->desthost );
 	}
 
+	winbindd_set_locator_kdc_envs(domain);
+
 	if (!cli_send_tconX(*cli, "IPC$", "IPC", "", 0)) {
 
 		result = cli_nt_error(*cli);
@@ -1089,6 +1096,8 @@
 								sitename,
 								ip);
 
+				winbindd_set_locator_kdc_envs(domain);
+
 				SAFE_FREE(sitename);
 				/* Ensure we contact this DC also. */
 				saf_store( domain->name, name);
@@ -1394,6 +1403,9 @@
 	}
 
 	if (NT_STATUS_IS_OK(result)) {
+
+		winbindd_set_locator_kdc_envs(domain);
+
 		if (domain->online == False) {
 			/* We're changing state from offline to online. */
 			set_global_winbindd_state_online();

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_util.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_util.c	2007-09-04 13:21:24 UTC (rev 24951)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_util.c	2007-09-04 14:06:33 UTC (rev 24952)
@@ -1414,24 +1414,40 @@
 	return False;
 }
 
+void winbindd_set_locator_kdc_envs(const struct winbindd_domain *domain);
+void winbindd_unset_locator_kdc_env(const struct winbindd_domain *domain);
+
+#ifdef HAVE_KRB5_LOCATE_PLUGIN_H
+
 /*********************************************************************
  ********************************************************************/
 
-void winbindd_set_locator_kdc_env(const struct winbindd_domain *domain)
+static void winbindd_set_locator_kdc_env(const struct winbindd_domain *domain)
 {
 	char *var = NULL;
 	const char *kdc = NULL;
+	int lvl = 11;
 
-	if (!domain) {
+	if (!domain || !domain->alt_name || !*domain->alt_name) {
 		return;
 	}
 
+	if (domain->initialized && !domain->active_directory) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s not AD\n",
+			domain->alt_name));
+		return;
+	}
+
 	kdc = inet_ntoa(domain->dcaddr.sin_addr);
 	if (!kdc) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s no DC IP\n",
+			domain->alt_name));
 		kdc = domain->dcname;
 	}
 
 	if (!kdc || !*kdc) {
+		DEBUG(lvl,("winbindd_set_locator_kdc_env: %s no DC at all\n",
+			domain->alt_name));
 		return;
 	}
 
@@ -1440,9 +1456,45 @@
 		return;
 	}
 
-	DEBUG(10,("winbindd_set_locator_kdc_env: setting var: %s to: %s\n",
+	DEBUG(lvl,("winbindd_set_locator_kdc_env: setting var: %s to: %s\n",
 		var, kdc));
 
 	setenv(var, kdc, 1);
 	free(var);
 }
+
+/*********************************************************************
+ ********************************************************************/
+
+void winbindd_set_locator_kdc_envs(const struct winbindd_domain *domain)
+{
+	struct winbindd_domain *our_dom = find_our_domain();
+
+	winbindd_set_locator_kdc_env(domain);
+
+	if (domain != our_dom) {
+		winbindd_set_locator_kdc_env(our_dom);
+	}
+}
+
+/*********************************************************************
+ ********************************************************************/
+
+void winbindd_unset_locator_kdc_env(const struct winbindd_domain *domain)
+{
+	char *var = NULL;
+
+	if (!domain || !domain->alt_name || !*domain->alt_name) {
+		return;
+	}
+
+	if (asprintf(&var, "%s_%s", WINBINDD_LOCATOR_KDC_ADDRESS,
+		     strupper_static(domain->alt_name)) == -1) {
+		return;
+	}
+
+	unsetenv(var);
+	free(var);
+}
+
+#endif /* HAVE_KRB5_LOCATE_PLUGIN_H */



More information about the samba-cvs mailing list