samba-3.6.12/source3/winbindd/winbindd_util.c @@ -89,7 +89,10 @@ } -/* Add a trusted domain to our list of domains */ +/* Add a trusted domain to our list of domains. + If the domain already exists in the list, + return it and don't re-initialize. */ + static struct winbindd_domain *add_trusted_domain(const char *domain_name, const char *alt_name, struct winbindd_methods *methods, const struct dom_sid *sid) @@ -99,6 +102,7 @@ char *idmap_config_option; const char *param; const char **ignored_domains, **dom; + int role = lp_server_role(); ignored_domains = lp_parm_string_list(-1, "winbind", "ignore domains", NULL); for (dom=ignored_domains; dom && *dom; dom++) { @@ -146,7 +150,10 @@ if (domain != NULL) { /* - * We found a match. Possibly update the SID + * We found a match on domain->name or + * domain->alt_name. Possibly update the SID + * if the stored SID was the NULL SID + * and return the matching entry. */ if ((sid != NULL) && dom_sid_equal(&domain->sid, &global_sid_NULL)) { @@ -192,6 +199,15 @@ sid_copy(&domain->sid, sid); } + /* Is this our primary domain ? */ + if (strequal(domain_name, get_global_sam_name()) && + (role != ROLE_DOMAIN_MEMBER)) { + domain->primary = true; + } else if (strequal(domain_name, lp_workgroup()) && + (role == ROLE_DOMAIN_MEMBER)) { + domain->primary = true; + } + /* Link to domain list */ DLIST_ADD_END(_domain_list, domain, struct winbindd_domain *); @@ -228,6 +244,8 @@ done: + setup_domain_child(domain); + DEBUG(2,("Added domain %s %s %s\n", domain->name, domain->alt_name, &domain->sid?sid_string_dbg(&domain->sid):"")); @@ -341,18 +359,10 @@ necessary. This is important because we need the SID for sibling domains */ - if ( find_domain_from_name_noinit(p) != NULL ) { - domain = add_trusted_domain(p, alternate_name, - &cache_methods, - &sid); - } else { - domain = add_trusted_domain(p, alternate_name, - &cache_methods, - &sid); - if (domain) { - setup_domain_child(domain); - } - } + (void)add_trusted_domain(p, alternate_name, + &cache_methods, + &sid); + p=q; if (p != NULL) p += 1; @@ -413,6 +423,12 @@ the domain_list() as our primary domain may not have been initialized. */ + DEBUG(10, ("Entry[%02d]: name: %s, DNS: %s, SID: %s," + " trust_flags: %x, trust_type: %u\n", + i, dom_list[i].domain_name, dom_list[i].dns_name, + &dom_list[i].sid?sid_string_dbg(&dom_list[i].sid):"", + dom_list[i].trust_flags, dom_list[i].trust_type)); + if ( !(dom_list[i].trust_flags & NETR_TRUST_FLAG_TREEROOT) ) { continue; } @@ -422,13 +438,10 @@ d = find_domain_from_name_noinit( dom_list[i].domain_name ); if ( !d ) { - d = add_trusted_domain( dom_list[i].domain_name, + (void)add_trusted_domain( dom_list[i].domain_name, dom_list[i].dns_name, &cache_methods, &dom_list[i].sid ); - if (d != NULL) { - setup_domain_child(d); - } } if (d == NULL) { @@ -479,6 +492,12 @@ uint32 type = dom_list[i].trust_type; uint32 attribs = dom_list[i].trust_attribs; + DEBUG(10, ("Entry[%02d]: name: %s, DNS: %s, SID: %s," + " trust_flags: %x, trust_type: %u\n", + i, dom_list[i].domain_name, dom_list[i].dns_name, + &dom_list[i].sid?sid_string_dbg(&dom_list[i].sid):"", + dom_list[i].trust_flags, dom_list[i].trust_type)); + d = find_domain_from_name_noinit( dom_list[i].domain_name ); /* ignore our primary and internal domains */ @@ -494,13 +513,10 @@ about it */ if ( !d ) { - d = add_trusted_domain( dom_list[i].domain_name, + (void)add_trusted_domain( dom_list[i].domain_name, dom_list[i].dns_name, &cache_methods, &dom_list[i].sid ); - if (d != NULL) { - setup_domain_child(d); - } } if (d == NULL) { @@ -601,7 +617,6 @@ /* Look up global info for the winbind daemon */ bool init_domain_list(void) { - struct winbindd_domain *domain; int role = lp_server_role(); /* Free existing list */ @@ -609,26 +624,18 @@ /* BUILTIN domain */ - domain = add_trusted_domain("BUILTIN", NULL, &cache_methods, + (void)add_trusted_domain("BUILTIN", NULL, &cache_methods, &global_sid_Builtin); - if (domain) { - setup_domain_child(domain); - } /* Local SAM */ - domain = add_trusted_domain(get_global_sam_name(), NULL, + (void)add_trusted_domain(get_global_sam_name(), NULL, &cache_methods, get_global_sam_sid()); - if (domain) { - if ( role != ROLE_DOMAIN_MEMBER ) { - domain->primary = True; - } - setup_domain_child(domain); - } /* Add ourselves as the first entry. */ if ( role == ROLE_DOMAIN_MEMBER ) { + struct winbindd_domain *domain; struct dom_sid our_sid; if (!secrets_fetch_domain_sid(lp_workgroup(), &our_sid)) { @@ -639,9 +646,6 @@ domain = add_trusted_domain( lp_workgroup(), lp_realm(), &cache_methods, &our_sid); if (domain) { - domain->primary = True; - setup_domain_child(domain); - /* Even in the parent winbindd we'll need to talk to the DC, so try and see if we can contact it. Theoretically this isn't neccessary