diff options
author | Gerald Carter <jerry@samba.org> | 2007-05-06 19:17:30 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:21:47 -0500 |
commit | 9cf6068f1e0a1063d331af17aa493140497b96ef (patch) | |
tree | 2b68947c90dfe1c1084c46778aaf4f64e51b05c7 /source/nsswitch/winbindd_misc.c | |
parent | d12b8147d6bd34fad680cb8705dc6d7bbea1db12 (diff) | |
download | samba-9cf6068f1e0a1063d331af17aa493140497b96ef.tar.gz samba-9cf6068f1e0a1063d331af17aa493140497b96ef.tar.xz samba-9cf6068f1e0a1063d331af17aa493140497b96ef.zip |
r22704: Implement three step method for enumerating domain trusts.
(a) Query our primary domain for trusts
(b) Query all tree roots in our forest
(c) Query all forest roots in trusted forests.
This will give us a complete trust topology including
domains via transitive Krb5 trusts. We also store the
trust type, flags, and attributes so we can determine
one-way trusted domains (outgoing only trust path).
Patch for one-way trusts coming in a later check-in.
"wbinfo -m" now lists all domains in the domain_list() as held
by the main winbindd process.
Diffstat (limited to 'source/nsswitch/winbindd_misc.c')
-rw-r--r-- | source/nsswitch/winbindd_misc.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/source/nsswitch/winbindd_misc.c b/source/nsswitch/winbindd_misc.c index f5363cad1a2..ac751bf2a85 100644 --- a/source/nsswitch/winbindd_misc.c +++ b/source/nsswitch/winbindd_misc.c @@ -100,10 +100,41 @@ enum winbindd_result winbindd_dual_check_machine_acct(struct winbindd_domain *do void winbindd_list_trusted_domains(struct winbindd_cli_state *state) { + struct winbindd_domain *d = NULL; + int extra_data_len = 0; + char *extra_data = NULL; + DEBUG(3, ("[%5lu]: list trusted domains\n", (unsigned long)state->pid)); - sendto_domain(state, find_our_domain()); + for ( d=domain_list(); d; d=d->next ) { + if ( !extra_data ) { + extra_data = talloc_asprintf(state->mem_ctx, "%s\\%s\\%s", + d->name, + d->alt_name ? d->alt_name : d->name, + sid_string_static(&d->sid)); + } else { + extra_data = talloc_asprintf(state->mem_ctx, "%s\n%s\\%s\\%s", + extra_data, + d->name, + d->alt_name ? d->alt_name : d->name, + sid_string_static(&d->sid)); + } + } + + extra_data_len = 0; + if (extra_data != NULL) { + extra_data_len = strlen(extra_data); + } + + if (extra_data_len > 0) { + state->response.extra_data.data = SMB_STRDUP(extra_data); + state->response.length += extra_data_len+1; + } + + TALLOC_FREE( extra_data ); + + request_ok(state); } enum winbindd_result winbindd_dual_list_trusted_domains(struct winbindd_domain *domain, |