wb-ndr: implement WINBIND_LOOKUP_LEVEL_SID2DOMGROUPS
authorStefan Metzmacher <metze@sernet.de>
Tue, 11 Mar 2008 08:30:30 +0000 (09:30 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:13:34 +0000 (16:13 +0200)
metze

source/winbindd/winbindd_async.c

index 147b28925cfb551c52baee26ebba1611713a8d85..e559829f3073a7fde1034bc2d30d61952c45421c 100644 (file)
@@ -483,6 +483,45 @@ static void ndr_child_lookup_sid2userinfo(struct winbindd_domain *domain,
        r->out.result = WINBIND_STATUS_OK;
 }
 
+static void ndr_child_lookup_sid2domgroups(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state,
+                                          struct winbind_lookup *r)
+{
+       NTSTATUS status;
+       struct winbind_lookup_sid_info *a;
+       struct dom_sid *groups;
+       uint32_t i, num_groups;
+
+       DEBUG(3, ("lookup sid2domgroups user:%s\n",
+                 sid_string_dbg(r->in.req.sid)));
+
+       status = domain->methods->lookup_usergroups(domain, state->mem_ctx,
+                                                   r->in.req.sid, &num_groups,
+                                                   &groups);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("error getting user domain groups info for sid %s: %s\n",
+                         sid_string_dbg(r->in.req.sid), nt_errstr(status)));
+               r->out.result = WINBIND_STATUS_FOOBAR;
+               return;
+       }
+
+       a = talloc_array(r, struct winbind_lookup_sid_info, num_groups);
+       if (!a) {
+               r->out.result = WINBIND_STATUS_NO_MEMORY;
+               return;
+       }
+
+       for (i=0; i < num_groups; i++) {
+               a[i].sid        = &groups[i];
+               /* TODO: get this from the backend */
+               a[i].type       = SID_NAME_DOM_GRP;
+       }
+
+       r->out.rep->sid_array.num_sids          = num_groups;
+       r->out.rep->sid_array.sids              = a;
+
+       r->out.result = WINBIND_STATUS_OK;
+}
 
 void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
                                      struct winbindd_cli_state *state)
@@ -508,6 +547,10 @@ void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
        case WINBIND_LOOKUP_LEVEL_SID2USERINFO:
                ndr_child_lookup_sid2userinfo(domain, state, r);
                return;
+
+       case WINBIND_LOOKUP_LEVEL_SID2DOMGROUPS:
+               ndr_child_lookup_sid2domgroups(domain, state, r);
+               return;
        }
 
        r->out.result = WINBIND_STATUS_UNKNOWN_LEVEL;