s3-winbind: Added a common rpc_sid_to_name function.
authorAndreas Schneider <asn@samba.org>
Thu, 17 Jun 2010 14:25:07 +0000 (16:25 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Jul 2010 13:59:11 +0000 (15:59 +0200)
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h

index a699fc2e143a345eda392f6306b9ac58a82f3b5b..7dc67b8398ae5b99648a660680a3effffe7b3fe3 100644 (file)
@@ -310,3 +310,59 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
 
        return NT_STATUS_OK;
 }
+
+/* Convert a domain SID to a user or group name */
+NTSTATUS rpc_sid_to_name(TALLOC_CTX *mem_ctx,
+                        struct rpc_pipe_client *lsa_pipe,
+                        struct policy_handle *lsa_policy,
+                        struct winbindd_domain *domain,
+                        const struct dom_sid *sid,
+                        char **pdomain_name,
+                        char **pname,
+                        enum lsa_SidType *ptype)
+{
+       char *mapped_name = NULL;
+       char **domains = NULL;
+       char **names = NULL;
+       enum lsa_SidType *types = NULL;
+       NTSTATUS map_status;
+       NTSTATUS status;
+
+       status = rpccli_lsa_lookup_sids(lsa_pipe,
+                                       mem_ctx,
+                                       lsa_policy,
+                                       1, /* num_sids */
+                                       sid,
+                                       &domains,
+                                       &names,
+                                       &types);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(2,("sid_to_name: failed to lookup sids: %s\n",
+                       nt_errstr(status)));
+               return status;
+       }
+
+       *ptype = (enum lsa_SidType) types[0];
+
+       map_status = normalize_name_map(mem_ctx,
+                                       domain,
+                                       *pname,
+                                       &mapped_name);
+       if (NT_STATUS_IS_OK(map_status) ||
+           NT_STATUS_EQUAL(map_status, NT_STATUS_FILE_RENAMED)) {
+               *pname = talloc_strdup(mem_ctx, mapped_name);
+               DEBUG(5,("returning mapped name -- %s\n", *pname));
+       } else {
+               *pname = talloc_strdup(mem_ctx, names[0]);
+       }
+       if (*pname == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       *pdomain_name = talloc_strdup(mem_ctx, domains[0]);
+       if (*pdomain_name == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       return NT_STATUS_OK;
+}
index 99006d465532f7811ad4e7f00bb38e1208a33a0e..e0658a350589f0e032afc6436d92f53ca5209745 100644 (file)
@@ -57,4 +57,14 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
                         struct dom_sid *psid,
                         enum lsa_SidType *ptype);
 
+/* Convert a domain SID to a user or group name */
+NTSTATUS rpc_sid_to_name(TALLOC_CTX *mem_ctx,
+                        struct rpc_pipe_client *lsa_pipe,
+                        struct policy_handle *lsa_policy,
+                        struct winbindd_domain *domain,
+                        const struct dom_sid *sid,
+                        char **pdomain_name,
+                        char **pname,
+                        enum lsa_SidType *ptype);
+
 #endif /* _WINBINDD_RPC_H_ */