From b2ea3606a7f7325b0e2f5fae46346f8fbf489177 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 13 Dec 2017 17:11:25 +0100 Subject: [PATCH] winbindd: add set_routing_domain() --- source3/winbindd/winbindd.h | 1 + source3/winbindd/winbindd_proto.h | 2 ++ source3/winbindd/winbindd_util.c | 34 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/source3/winbindd/winbindd.h b/source3/winbindd/winbindd.h index 682040fd1a7d..b60094bafcdd 100644 --- a/source3/winbindd/winbindd.h +++ b/source3/winbindd/winbindd.h @@ -143,6 +143,7 @@ struct winbindd_domain { uint32_t domain_flags; /* Domain flags from netlogon.h */ uint32_t domain_type; /* Domain type from netlogon.h */ uint32_t domain_trust_attribs; /* Trust attribs from netlogon.h */ + const struct winbindd_domain *routing_domain; bool initialized; /* Did we already ask for the domain mode? */ bool native_mode; /* is this a win2k domain in native mode ? */ bool active_directory; /* is this a win2k active directory ? */ diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index 5ab1e8fd590e..4ab52a42ba56 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -438,6 +438,8 @@ NTSTATUS winbind_dual_SamLogon(struct winbindd_domain *domain, struct winbindd_domain *domain_list(void); struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain); +bool set_routing_domain(struct winbindd_domain *domain, + const struct winbindd_domain *routing_domain); bool domain_is_forest_root(const struct winbindd_domain *domain); void rescan_trusted_domains(struct tevent_context *ev, struct tevent_timer *te, struct timeval now, void *private_data); diff --git a/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c index dd3206c01f48..fb1793d250a7 100644 --- a/source3/winbindd/winbindd_util.c +++ b/source3/winbindd/winbindd_util.c @@ -290,6 +290,19 @@ static NTSTATUS add_trusted_domain(const char *domain_name, return NT_STATUS_OK; } +bool set_routing_domain(struct winbindd_domain *domain, + const struct winbindd_domain *routing_domain) +{ + if (domain->routing_domain == NULL) { + domain->routing_domain = routing_domain; + return true; + } + if (domain->routing_domain != routing_domain) { + return false; + } + return true; +} + bool domain_is_forest_root(const struct winbindd_domain *domain) { const uint32_t fr_flags = @@ -1105,6 +1118,8 @@ bool init_domain_list(void) struct ForestTrustInfo fti; uint32_t fi; enum ndr_err_code ndr_err; + struct winbindd_domain *routing_domain = NULL; + bool ok; if (domains[i]->trust_type != LSA_TRUST_TYPE_UPLEVEL) { continue; @@ -1118,6 +1133,14 @@ bool init_domain_list(void) continue; } + routing_domain = find_domain_from_name_noinit( + domains[i]->netbios_name); + if (routing_domain == NULL) { + DBG_ERR("Can't find winbindd domain [%s]\n", + domains[i]->netbios_name); + return false; + } + ndr_err = ndr_pull_struct_blob_all( &domains[i]->trust_forest_trust_info, talloc_tos(), &fti, @@ -1171,6 +1194,17 @@ bool init_domain_list(void) nt_errstr(status)); return false; } + if (domain == NULL) { + continue; + } + ok = set_routing_domain(domain, routing_domain); + if (!ok) { + DBG_ERR("set_routing_domain on [%s] to " + "[%s] failed\n", + domain->name, + routing_domain->name); + return false; + } } } } else if (IS_DC) { -- 2.34.1