summaryrefslogtreecommitdiffstats
path: root/source/nsswitch/winbindd_misc.c
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2007-05-06 19:17:30 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:21:47 -0500
commit9cf6068f1e0a1063d331af17aa493140497b96ef (patch)
tree2b68947c90dfe1c1084c46778aaf4f64e51b05c7 /source/nsswitch/winbindd_misc.c
parentd12b8147d6bd34fad680cb8705dc6d7bbea1db12 (diff)
downloadsamba-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.c33
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,