wb-ndr: implement NDR_WINBIND_LOOKUP_LEVEL_RIDS2NAMES in winbindd_ndr_domain_child_lo...
authorStefan Metzmacher <metze@sernet.de>
Fri, 25 Jan 2008 13:28:42 +0000 (14:28 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:13:20 +0000 (16:13 +0200)
metze

source/winbindd/winbindd_async.c

index e4308a7e6868984315c14a4e44e27e0230613377..888c697aeaedbd69ac0b55ff5c228f9e7b61bbbe 100644 (file)
@@ -396,6 +396,56 @@ static void ndr_child_lookup_name2sid(struct winbindd_domain *domain,
        r->out.result = WINBIND_STATUS_OK;
 }
 
+static void ndr_child_lookup_rids2names(struct winbindd_domain *domain,
+                                       struct winbindd_cli_state *state,
+                                       struct winbind_lookup *r)
+{
+       char *domain_name;
+       char **names;
+       enum lsa_SidType *types;
+       NTSTATUS status;
+       uint32_t i;
+       struct winbind_lookup_name_info *n;
+
+       DEBUG(3, ("lookup rids2name domain:%s  num %u\n",
+                 sid_string_dbg(r->in.req.rids.domain_sid),
+                 r->in.req.rids.num_rids));
+
+
+       status = domain->methods->rids_to_names(domain, state->mem_ctx,
+                                               r->in.req.rids.domain_sid,
+                                               r->in.req.rids.rids,
+                                               r->in.req.rids.num_rids,
+                                               &domain_name,
+                                               &names, &types);
+
+       if (!NT_STATUS_IS_OK(status) &&
+           !NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED)) {
+               DEBUG(1, ("Can't lookup names by rids: %s\n",
+                         nt_errstr(status)));
+               r->out.result = WINBIND_STATUS_FOOBAR;
+               return;
+       }
+
+       r->out.rep->name_array.num_names = r->in.req.rids.num_rids;
+       n = talloc_array(r,
+                        struct winbind_lookup_name_info,
+                        r->out.rep->name_array.num_names);
+       if (!n) {
+               r->out.result = WINBIND_STATUS_NO_MEMORY;
+               return;
+       }
+       r->out.rep->name_array.names = n;
+
+       for (i=0; i < r->out.rep->name_array.num_names; i++) {
+               n[i].domain_name        = domain_name;
+               n[i].account_name       = names[i];
+               n[i].type               = types[i];
+       }
+
+       r->out.result = WINBIND_STATUS_OK;
+}
+
 void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
                                      struct winbindd_cli_state *state)
 {
@@ -412,6 +462,10 @@ void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
        case WINBIND_LOOKUP_LEVEL_NAME2SID:
                ndr_child_lookup_name2sid(domain, state, r);
                return;
+
+       case WINBIND_LOOKUP_LEVEL_RIDS2NAMES:
+               ndr_child_lookup_rids2names(domain, state, r);
+               return;
        }
 
        r->out.result = WINBIND_STATUS_UNKNOWN_LEVEL;