From fd79bc9a58ccb06f59cda1f42fe9067f3f8af473 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 17 Jun 2010 19:31:51 +0200 Subject: s3-winbind: Added a common rpc_rids_to_names function. --- source3/winbindd/winbindd_rpc.c | 79 +++++++++++++++++++++++++++++++++++++++++ source3/winbindd/winbindd_rpc.h | 12 +++++++ 2 files changed, 91 insertions(+) (limited to 'source3') diff --git a/source3/winbindd/winbindd_rpc.c b/source3/winbindd/winbindd_rpc.c index 7dc67b8398..cfc9d996c9 100644 --- a/source3/winbindd/winbindd_rpc.c +++ b/source3/winbindd/winbindd_rpc.c @@ -366,3 +366,82 @@ NTSTATUS rpc_sid_to_name(TALLOC_CTX *mem_ctx, return NT_STATUS_OK; } + +/* Convert a bunch of rids to user or group names */ +NTSTATUS rpc_rids_to_names(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *lsa_pipe, + struct policy_handle *lsa_policy, + struct winbindd_domain *domain, + const struct dom_sid *sid, + uint32_t *rids, + size_t num_rids, + char **pdomain_name, + char ***pnames, + enum lsa_SidType **ptypes) +{ + enum lsa_SidType *types = NULL; + char *domain_name = NULL; + char **domains = NULL; + char **names = NULL; + struct dom_sid *sids; + size_t i; + NTSTATUS status; + + if (num_rids > 0) { + sids = TALLOC_ARRAY(mem_ctx, struct dom_sid, num_rids); + if (sids == NULL) { + return NT_STATUS_NO_MEMORY; + } + } else { + sids = NULL; + } + + for (i = 0; i < num_rids; i++) { + if (!sid_compose(&sids[i], sid, rids[i])) { + return NT_STATUS_INTERNAL_ERROR; + } + } + + status = rpccli_lsa_lookup_sids(lsa_pipe, + mem_ctx, + lsa_policy, + num_rids, + sids, + &domains, + &names, + &types); + if (!NT_STATUS_IS_OK(status) && + !NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED)) { + DEBUG(2,("rids_to_names: failed to lookup sids: %s\n", + nt_errstr(status))); + return status; + } + + for (i = 0; i < num_rids; i++) { + char *mapped_name = NULL; + NTSTATUS map_status; + + if (types[i] != SID_NAME_UNKNOWN) { + map_status = normalize_name_map(mem_ctx, + domain, + names[i], + &mapped_name); + if (NT_STATUS_IS_OK(map_status) || + NT_STATUS_EQUAL(map_status, NT_STATUS_FILE_RENAMED)) { + TALLOC_FREE(names[i]); + names[i] = talloc_strdup(names, mapped_name); + if (names[i] == NULL) { + return NT_STATUS_NO_MEMORY; + } + } + + domain_name = domains[i]; + } + } + + *pdomain_name = domain_name; + *ptypes = types; + *pnames = names; + + return NT_STATUS_OK; +} diff --git a/source3/winbindd/winbindd_rpc.h b/source3/winbindd/winbindd_rpc.h index e0658a3505..15ad6dab89 100644 --- a/source3/winbindd/winbindd_rpc.h +++ b/source3/winbindd/winbindd_rpc.h @@ -67,4 +67,16 @@ NTSTATUS rpc_sid_to_name(TALLOC_CTX *mem_ctx, char **pname, enum lsa_SidType *ptype); +/* Convert a bunch of rids to user or group names */ +NTSTATUS rpc_rids_to_names(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *lsa_pipe, + struct policy_handle *lsa_policy, + struct winbindd_domain *domain, + const struct dom_sid *sid, + uint32_t *rids, + size_t num_rids, + char **pdomain_name, + char ***pnames, + enum lsa_SidType **ptypes); + #endif /* _WINBINDD_RPC_H_ */ -- cgit