s3: Pass netr_DomainTrustList instead of names and sids through (*trusted_domains)
[samba.git] / source3 / winbindd / winbindd_rpc.c
index ac5c3d2d93a66339406c82b8c97c68fa63e26373..ffe488ac7153b6a148ac44efa1b76aab1ff4ce31 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "includes.h"
 #include "winbindd.h"
+#include "../librpc/gen_ndr/cli_samr.h"
+#include "../librpc/gen_ndr/cli_lsa.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
@@ -99,14 +101,19 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain,
                for (j = 0; j < num_dom_users; i++, j++) {
 
                        uint32_t rid = disp_info.info1.entries[j].rid;
+                       struct samr_DispEntryGeneral *src;
+                       struct wbint_userinfo *dst;
 
-                       (*info)[i].acct_name = talloc_strdup(mem_ctx,
-                               disp_info.info1.entries[j].account_name.string);
-                       (*info)[i].full_name = talloc_strdup(mem_ctx,
-                               disp_info.info1.entries[j].full_name.string);
-                       (*info)[i].homedir = NULL;
-                       (*info)[i].shell = NULL;
-                       sid_compose(&(*info)[i].user_sid, &domain->sid, rid);
+                       src = &(disp_info.info1.entries[j]);
+                       dst = &((*info)[i]);
+
+                       dst->acct_name = talloc_strdup(
+                               mem_ctx, src->account_name.string);
+                       dst->full_name = talloc_strdup(
+                               mem_ctx, src->full_name.string);
+                       dst->homedir = NULL;
+                       dst->shell = NULL;
+                       sid_compose(&dst->user_sid, &domain->sid, rid);
 
                        /* For the moment we set the primary group for
                           every user to be the Domain Users group.
@@ -116,7 +123,7 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain,
                           force group' smb.conf parameter or
                           something like that. */
 
-                       sid_compose(&(*info)[i].group_sid, &domain->sid, 
+                       sid_compose(&dst->group_sid, &domain->sid,
                                    DOMAIN_GROUP_RID_USERS);
                }
 
@@ -1025,10 +1032,7 @@ static NTSTATUS sequence_number(struct winbindd_domain *domain, uint32 *seq)
 /* get a list of trusted domains */
 static NTSTATUS trusted_domains(struct winbindd_domain *domain,
                                TALLOC_CTX *mem_ctx,
-                               uint32 *num_domains,
-                               char ***names,
-                               char ***alt_names,
-                               DOM_SID **dom_sids)
+                               struct netr_DomainTrustList *trusts)
 {
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        uint32 enum_ctx = 0;
@@ -1037,10 +1041,7 @@ static NTSTATUS trusted_domains(struct winbindd_domain *domain,
 
        DEBUG(3,("rpc: trusted_domains\n"));
 
-       *num_domains = 0;
-       *names = NULL;
-       *alt_names = NULL;
-       *dom_sids = NULL;
+       ZERO_STRUCTP(trusts);
 
        result = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy);
        if (!NT_STATUS_IS_OK(result))
@@ -1063,22 +1064,33 @@ static NTSTATUS trusted_domains(struct winbindd_domain *domain,
                    !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES))
                        break;
 
-               start_idx = *num_domains;
-               *num_domains += dom_list.count;
-               *names = TALLOC_REALLOC_ARRAY(mem_ctx, *names,
-                                             char *, *num_domains);
-               *dom_sids = TALLOC_REALLOC_ARRAY(mem_ctx, *dom_sids,
-                                                DOM_SID, *num_domains);
-               *alt_names = TALLOC_REALLOC_ARRAY(mem_ctx, *alt_names,
-                                                char *, *num_domains);
-               if ((*names == NULL) || (*dom_sids == NULL) ||
-                   (*alt_names == NULL))
+               start_idx = trusts->count;
+               trusts->count += dom_list.count;
+
+               trusts->array = talloc_realloc(
+                       mem_ctx, trusts->array, struct netr_DomainTrust,
+                       trusts->count);
+               if (trusts->array == NULL) {
                        return NT_STATUS_NO_MEMORY;
+               }
 
                for (i=0; i<dom_list.count; i++) {
-                       (*names)[start_idx+i] = CONST_DISCARD(char *, dom_list.domains[i].name.string);
-                       (*dom_sids)[start_idx+i] = *dom_list.domains[i].sid;
-                       (*alt_names)[start_idx+i] = talloc_strdup(mem_ctx, "");
+                       struct netr_DomainTrust *trust = &trusts->array[i];
+                       struct dom_sid *sid;
+
+                       ZERO_STRUCTP(trust);
+
+                       trust->netbios_name = talloc_move(
+                               trusts->array,
+                               &dom_list.domains[i].name.string);
+                       trust->dns_name = NULL;
+
+                       sid = talloc(trusts->array, struct dom_sid);
+                       if (sid == NULL) {
+                               return NT_STATUS_NO_MEMORY;
+                       }
+                       sid_copy(sid, dom_list.domains[i].sid);
+                       trust->sid = sid;
                }
        }
        return result;
@@ -1251,7 +1263,7 @@ NTSTATUS winbindd_lookup_names(TALLOC_CTX *mem_ctx,
        NTSTATUS status;
        struct rpc_pipe_client *cli = NULL;
        struct policy_handle lsa_policy;
-       unsigned int orig_timeout;
+       unsigned int orig_timeout = 0;
        lookup_names_fn_t lookup_names_fn = rpccli_lsa_lookup_names;
 
        if (domain->can_do_ncacn_ip_tcp) {
@@ -1274,8 +1286,12 @@ NTSTATUS winbindd_lookup_names(TALLOC_CTX *mem_ctx,
         * This call can take a long time
         * allow the server to time out.
         * 35 seconds should do it.
+        * NB
+        * only do this when the undelying transport is named pipe.
         */
-       orig_timeout = rpccli_set_timeout(cli, 35000);
+       if (cli->transport->transport == NCACN_NP) {
+               orig_timeout = rpccli_set_timeout(cli, 35000);
+       }
 
        status = lookup_names_fn(cli,
                                 mem_ctx,
@@ -1288,7 +1304,9 @@ NTSTATUS winbindd_lookup_names(TALLOC_CTX *mem_ctx,
                                 types);
 
        /* And restore our original timeout. */
-       rpccli_set_timeout(cli, orig_timeout);
+       if (cli->transport->transport == NCACN_NP) {
+               rpccli_set_timeout(cli, orig_timeout);
+       }
 
        if (!NT_STATUS_IS_OK(status)) {
                return status;