s3-winbindd: add and use winbindd_lookup_sids().
authorGünther Deschner <gd@samba.org>
Thu, 17 Sep 2009 05:59:25 +0000 (07:59 +0200)
committerGünther Deschner <gd@samba.org>
Thu, 17 Sep 2009 06:54:19 +0000 (08:54 +0200)
Guenther

source3/winbindd/winbindd_ads.c
source3/winbindd/winbindd_proto.h
source3/winbindd/winbindd_rpc.c

index 450d2ee3e5dd918fa5c273183bda279845f390de..119e81d3e2e7f61cd132a35a2777b5b79a0d1ad1 100644 (file)
@@ -983,8 +983,6 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain,
        int i;
        size_t num_members = 0;
        ads_control args;
-        struct rpc_pipe_client *cli;
-        struct policy_handle lsa_policy;
        DOM_SID *sid_mem_nocache = NULL;
        char **names_nocache = NULL;
        enum lsa_SidType *name_types_nocache = NULL;
@@ -1126,31 +1124,14 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain,
 
        /* handle sids not resolved from cache by lsa_lookup_sids */
        if (num_nocache > 0) {
-               unsigned int orig_timeout;
 
-               status = cm_connect_lsa(domain, tmp_ctx, &cli, &lsa_policy);
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       goto done;
-               }
-
-               /*
-                * This call can take a long time
-                * allow the server to time out.
-                * 35 seconds should do it.
-                */
-               orig_timeout = rpccli_set_timeout(cli, 35000);
-
-               status = rpccli_lsa_lookup_sids(cli, tmp_ctx,
-                                               &lsa_policy,
-                                               num_nocache,
-                                               sid_mem_nocache,
-                                               &domains_nocache,
-                                               &names_nocache,
-                                               &name_types_nocache);
-
-               /* And restore our original timeout. */
-               rpccli_set_timeout(cli, orig_timeout);
+               status = winbindd_lookup_sids(tmp_ctx,
+                                             domain,
+                                             num_nocache,
+                                             sid_mem_nocache,
+                                             &domains_nocache,
+                                             &names_nocache,
+                                             &name_types_nocache);
 
                if (!(NT_STATUS_IS_OK(status) ||
                      NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED) ||
@@ -1159,30 +1140,13 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain,
                        DEBUG(1, ("lsa_lookupsids call failed with %s "
                                  "- retrying...\n", nt_errstr(status)));
 
-                       status = cm_connect_lsa(domain, tmp_ctx, &cli,
-                                               &lsa_policy);
-
-                       if (!NT_STATUS_IS_OK(status)) {
-                               goto done;
-                       }
-
-                       /*
-                        * This call can take a long time
-                        * allow the server to time out.
-                        * 35 seconds should do it.
-                        */
-                       orig_timeout = rpccli_set_timeout(cli, 35000);
-
-                       status = rpccli_lsa_lookup_sids(cli, tmp_ctx,
-                                                       &lsa_policy,
-                                                       num_nocache,
-                                                       sid_mem_nocache,
-                                                       &domains_nocache,
-                                                       &names_nocache,
-                                                       &name_types_nocache);
-
-                       /* And restore our original timeout. */
-                       rpccli_set_timeout(cli, orig_timeout);
+                       status = winbindd_lookup_sids(tmp_ctx,
+                                                     domain,
+                                                     num_nocache,
+                                                     sid_mem_nocache,
+                                                     &domains_nocache,
+                                                     &names_nocache,
+                                                     &name_types_nocache);
                }
 
                if (NT_STATUS_IS_OK(status) ||
index f1fc0f6a2a158d041668d2302b9eb88ca10edfb5..19224255e9db6674efd6ce08dea8cd9d31ef2598 100644 (file)
@@ -63,6 +63,15 @@ int main(int argc, char **argv, char **envp);
 
 /* The following definitions come from winbindd/winbindd_ads.c  */
 
+/* The following definitions come from winbindd/winbindd_rpc.c  */
+
+NTSTATUS winbindd_lookup_sids(TALLOC_CTX *mem_ctx,
+                             struct winbindd_domain *domain,
+                             uint32_t num_sids,
+                             const struct dom_sid *sids,
+                             char ***domains,
+                             char ***names,
+                             enum lsa_SidType **types);
 
 /* The following definitions come from winbindd/winbindd_async.c  */
 
index f664f222322f056d1f0026c6b9c781479baa18b4..259ebc77c07542625b6f8620335ae533a3913257 100644 (file)
@@ -354,42 +354,26 @@ static NTSTATUS msrpc_sid_to_name(struct winbindd_domain *domain,
        char **names;
        enum lsa_SidType *types = NULL;
        NTSTATUS result;
-       struct rpc_pipe_client *cli;
-       struct policy_handle lsa_policy;
        NTSTATUS name_map_status = NT_STATUS_UNSUCCESSFUL;
        char *mapped_name = NULL;
-       unsigned int orig_timeout;
 
        DEBUG(3,("sid_to_name [rpc] %s for domain %s\n", sid_string_dbg(sid),
                 domain->name ));
 
-       result = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy);
+       result = winbindd_lookup_sids(mem_ctx,
+                                     domain,
+                                     1,
+                                     sid,
+                                     &domains,
+                                     &names,
+                                     &types);
        if (!NT_STATUS_IS_OK(result)) {
-               DEBUG(2,("msrpc_sid_to_name: cm_connect_lsa() failed (%s)\n",
-                        nt_errstr(result)));           
+               DEBUG(2,("msrpc_sid_to_name: failed to lookup sids: %s\n",
+                       nt_errstr(result)));
                return result;
        }
 
 
-       /*
-        * This call can take a long time
-        * allow the server to time out.
-        * 35 seconds should do it.
-        */
-       orig_timeout = rpccli_set_timeout(cli, 35000);
-
-       result = rpccli_lsa_lookup_sids(cli, mem_ctx, &lsa_policy,
-                                       1, sid, &domains, &names, &types);
-
-       /* And restore our original timeout. */
-       rpccli_set_timeout(cli, orig_timeout);
-
-       if (!NT_STATUS_IS_OK(result)) {         
-               DEBUG(2,("msrpc_sid_to_name: rpccli_lsa_lookup_sids()  failed (%s)\n",
-                        nt_errstr(result)));           
-               return result;
-       }
-
        *type = (enum lsa_SidType)types[0];
        *domain_name = domains[0];
        *name = names[0];
@@ -419,12 +403,9 @@ static NTSTATUS msrpc_rids_to_names(struct winbindd_domain *domain,
 {
        char **domains;
        NTSTATUS result;
-       struct rpc_pipe_client *cli;
-       struct policy_handle lsa_policy;
        DOM_SID *sids;
        size_t i;
        char **ret_names;
-       unsigned int orig_timeout;
 
        DEBUG(3, ("rids_to_names [rpc] for domain %s\n", domain->name ));
 
@@ -443,24 +424,13 @@ static NTSTATUS msrpc_rids_to_names(struct winbindd_domain *domain,
                }
        }
 
-       result = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy);
-       if (!NT_STATUS_IS_OK(result)) {
-               return result;
-       }
-
-       /*
-        * This call can take a long time
-        * allow the server to time out.
-        * 35 seconds should do it.
-        */
-       orig_timeout = rpccli_set_timeout(cli, 35000);
-
-       result = rpccli_lsa_lookup_sids(cli, mem_ctx, &lsa_policy,
-                                       num_rids, sids, &domains,
-                                       names, types);
-
-       /* And restore our original timeout. */
-       rpccli_set_timeout(cli, orig_timeout);
+       result = winbindd_lookup_sids(mem_ctx,
+                                     domain,
+                                     num_rids,
+                                     sids,
+                                     &domains,
+                                     names,
+                                     types);
 
        if (!NT_STATUS_IS_OK(result) &&
            !NT_STATUS_EQUAL(result, STATUS_SOME_UNMAPPED)) {
@@ -1225,6 +1195,45 @@ static NTSTATUS msrpc_password_policy(struct winbindd_domain *domain,
        return result;
 }
 
+NTSTATUS winbindd_lookup_sids(TALLOC_CTX *mem_ctx,
+                             struct winbindd_domain *domain,
+                             uint32_t num_sids,
+                             const struct dom_sid *sids,
+                             char ***domains,
+                             char ***names,
+                             enum lsa_SidType **types)
+{
+       NTSTATUS status;
+       struct rpc_pipe_client *cli = NULL;
+       struct policy_handle lsa_policy;
+       unsigned int orig_timeout;
+
+       status = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       /*
+        * This call can take a long time
+        * allow the server to time out.
+        * 35 seconds should do it.
+        */
+       orig_timeout = rpccli_set_timeout(cli, 35000);
+
+       status = rpccli_lsa_lookup_sids(cli, mem_ctx, &lsa_policy,
+                                       num_sids, sids, domains,
+                                       names, types);
+
+       /* And restore our original timeout. */
+       rpccli_set_timeout(cli, orig_timeout);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       return status;
+}
+
 
 /* the rpc backend methods are exposed via this structure */
 struct winbindd_methods msrpc_methods = {