wb-ndr: implement NDR_WINBIND_LOOKUP_LEVEL_RIDS2NAMES in winbindd_ndr_domain_child_lo...
[metze/samba/wb-ndr.git] / source / winbindd / winbindd_async.c
index 72b86eca96b9056eb78add7ea9906c4177cb21f4..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;
@@ -551,46 +605,6 @@ nomem:
        return;
 }
 
-enum winbindd_result winbindd_dual_lookupname(struct winbindd_domain *domain,
-                                             struct winbindd_cli_state *state)
-{
-       enum lsa_SidType type;
-       char *name_domain, *name_user;
-       DOM_SID sid;
-       char *p;
-
-       /* Ensure null termination */
-       state->request.data.name.dom_name[sizeof(state->request.data.name.dom_name)-1]='\0';
-
-       /* Ensure null termination */
-       state->request.data.name.name[sizeof(state->request.data.name.name)-1]='\0';
-
-       /* cope with the name being a fully qualified name */
-       p = strstr(state->request.data.name.name, lp_winbind_separator());
-       if (p) {
-               *p = 0;
-               name_domain = state->request.data.name.name;
-               name_user = p+1;
-       } else {
-               name_domain = state->request.data.name.dom_name;
-               name_user = state->request.data.name.name;
-       }
-
-       DEBUG(3, ("[%5lu]: lookupname %s%s%s\n", (unsigned long)state->pid,
-                 name_domain, lp_winbind_separator(), name_user));
-
-       /* Lookup name from DC using lsa_lookup_names() */
-       if (!winbindd_lookup_sid_by_name(state->mem_ctx, state->request.original_cmd, domain, name_domain,
-                                        name_user, &sid, &type)) {
-               return WINBINDD_ERROR;
-       }
-
-       sid_to_fstring(state->response.data.sid.sid, &sid);
-       state->response.data.sid.type = type;
-
-       return WINBINDD_OK;
-}
-
 bool print_sidlist(TALLOC_CTX *mem_ctx, const DOM_SID *sids,
                   size_t num_sids, char **result, ssize_t *len)
 {