1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-26 21:57:41 +03:00

r24952: Set the kdc locator env vars. This makes the krb5 locator plugin fully

operational (from within winbindd and outside).

Guenther
(This used to be commit 800645d5388d7df1f8cf31b4218bfc7dd5b4d12a)
This commit is contained in:
Günther Deschner 2007-09-04 14:06:33 +00:00 committed by Gerald (Jerry) Carter
parent 6de1b0b65b
commit be3fdd8b62
2 changed files with 67 additions and 3 deletions

View File

@ -395,6 +395,8 @@ static void set_domain_online(struct winbindd_domain *domain)
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 @@ void winbind_add_failed_connection_entry(const struct winbindd_domain *domain,
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 @@ static NTSTATUS cm_prepare_connection(const struct winbindd_domain *domain,
"[%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 @@ static NTSTATUS cm_prepare_connection(const struct winbindd_domain *domain,
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 @@ static BOOL dcip_to_name(const struct winbindd_domain *domain, struct in_addr ip
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 @@ static NTSTATUS cm_open_connection(struct winbindd_domain *domain,
}
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();

View File

@ -1366,24 +1366,40 @@ BOOL winbindd_internal_child(struct winbindd_child *child)
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 @@ void winbindd_set_locator_kdc_env(const struct winbindd_domain *domain)
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 */