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)
{
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;
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)
{