s4-samr: merge samr_EnumDomains from s3 idl. (fixme: python)
authorGünther Deschner <gd@samba.org>
Fri, 7 Nov 2008 01:57:58 +0000 (02:57 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 10 Nov 2008 20:46:30 +0000 (21:46 +0100)
Guenther

librpc/idl/samr.idl
source4/libnet/libnet_domain.c
source4/rpc_server/samr/dcesrv_samr.c
source4/torture/rpc/samba3rpc.c
source4/torture/rpc/samr.c
source4/torture/rpc/samr_accessmask.c

index 3ad4cd602fd24ea585361b377a9fe8d66f372fe7..23fce8dfd9f32b45c7b9ce71d239b568f43451e2 100644 (file)
@@ -284,11 +284,11 @@ import "misc.idl", "lsa.idl", "security.idl";
        } samr_SamArray;
 
        NTSTATUS samr_EnumDomains (
-               [in,ref]      policy_handle *connect_handle,
+               [in]          policy_handle *connect_handle,
                [in,out,ref]  uint32 *resume_handle,
+               [out,ref]     samr_SamArray **sam,
                [in]          uint32 buf_size,
-               [out,unique]  samr_SamArray *sam,
-               [out]         uint32 num_entries
+               [out,ref]     uint32 *num_entries
                );
 
 
index adb826a2d17cab183d45a66eda7d13b730dab0d9..eb6920d88ef62ac68c68a1ab58d5201e41b28110 100644 (file)
@@ -1001,6 +1001,10 @@ static void continue_samr_connect(struct rpc_request *req)
        s->enumdom.in.resume_handle  = &s->resume_handle;
        s->enumdom.in.buf_size       = s->buf_size;
        s->enumdom.out.resume_handle = &s->resume_handle;
+       s->enumdom.out.num_entries   = talloc(s, uint32_t);
+       if (composite_nomem(s->enumdom.out.num_entries, c)) return;
+       s->enumdom.out.sam           = talloc(s, struct samr_SamArray *);
+       if (composite_nomem(s->enumdom.out.sam, c)) return;
 
        enumdom_req = dcerpc_samr_EnumDomains_send(s->ctx->samr.pipe, c, &s->enumdom);
        if (composite_nomem(enumdom_req, c)) return;
@@ -1116,16 +1120,16 @@ static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_lis
        /* prepare domains array */
        if (s->domains == NULL) {
                s->domains = talloc_array(mem_ctx, struct domainlist,
-                                         s->enumdom.out.num_entries);
+                                         *s->enumdom.out.num_entries);
        } else {
                s->domains = talloc_realloc(mem_ctx, s->domains, struct domainlist,
-                                           s->count + s->enumdom.out.num_entries);
+                                           s->count + *s->enumdom.out.num_entries);
        }
 
        /* copy domain names returned from samr_EnumDomains call */
-       for (i = s->count; i < s->count + s->enumdom.out.num_entries; i++)
+       for (i = s->count; i < s->count + *s->enumdom.out.num_entries; i++)
        {
-               struct lsa_String *domain_name = &s->enumdom.out.sam->entries[i - s->count].name;
+               struct lsa_String *domain_name = &(*s->enumdom.out.sam)->entries[i - s->count].name;
 
                /* strdup name as a child of allocated array to make it follow the array
                   in case of talloc_steal or talloc_free */
@@ -1134,7 +1138,7 @@ static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_lis
        }
 
        /* number of entries returned (domains enumerated) */
-       s->count += s->enumdom.out.num_entries;
+       s->count += *s->enumdom.out.num_entries;
        
        return s->domains;
 }
index 106767c8ae96808ed1ec30d6177a3804c38e9421..c91e66a55b4d028da171e553d21513f2eac82d1d 100644 (file)
@@ -344,8 +344,8 @@ static NTSTATUS dcesrv_samr_EnumDomains(struct dcesrv_call_state *dce_call, TALL
        struct ldb_dn *partitions_basedn;
 
        *r->out.resume_handle = 0;
-       r->out.sam = NULL;
-       r->out.num_entries = 0;
+       *r->out.sam = NULL;
+       *r->out.num_entries = 0;
 
        DCESRV_PULL_HANDLE(h, r->in.connect_handle, SAMR_HANDLE_CONNECT);
 
@@ -401,9 +401,9 @@ static NTSTATUS dcesrv_samr_EnumDomains(struct dcesrv_call_state *dce_call, TALL
                }
        }
 
-       r->out.sam = array;
-       r->out.num_entries = i;
-       array->count = r->out.num_entries;
+       *r->out.sam = array;
+       *r->out.num_entries = i;
+       array->count = *r->out.num_entries;
 
        return NT_STATUS_OK;
 }
index bf61054b54e75056f87f8aee9d1fbc9cb236b5ae..3b26799021028ca2b62080b2a57a402e9dc4ff51 100644 (file)
@@ -365,6 +365,8 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
        struct samr_Connect2 conn;
        struct samr_EnumDomains enumdom;
        uint32_t resume_handle = 0;
+       uint32_t num_entries = 0;
+       struct samr_SamArray *sam = NULL;
        struct samr_LookupDomain l;
        struct dom_sid2 *sid = NULL;
        int dom_idx;
@@ -424,6 +426,8 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
        enumdom.in.resume_handle = &resume_handle;
        enumdom.in.buf_size = (uint32_t)-1;
        enumdom.out.resume_handle = &resume_handle;
+       enumdom.out.num_entries = &num_entries;
+       enumdom.out.sam = &sam;
 
        status = dcerpc_samr_EnumDomains(samr_pipe, mem_ctx, &enumdom);
        if (!NT_STATUS_IS_OK(status)) {
@@ -431,18 +435,18 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
                goto fail;
        }
 
-       if (enumdom.out.num_entries != 2) {
+       if (*enumdom.out.num_entries != 2) {
                d_printf("samr_EnumDomains returned %d entries, expected 2\n",
-                        enumdom.out.num_entries);
+                        *enumdom.out.num_entries);
                status = NT_STATUS_UNSUCCESSFUL;
                goto fail;
        }
 
-       dom_idx = strequal(enumdom.out.sam->entries[0].name.string,
+       dom_idx = strequal(sam->entries[0].name.string,
                           "builtin") ? 1:0;
 
        l.in.connect_handle = &conn_handle;
-       domain_name.string = enumdom.out.sam->entries[dom_idx].name.string;
+       domain_name.string = sam->entries[dom_idx].name.string;
        *domain = talloc_strdup(mem_ctx, domain_name.string);
        l.in.domain_name = &domain_name;
        l.out.sid = &sid;
index 874eba74d1ea7f49996a66847176a41bc0520791..66b3dec618efec5d2db111d56416a015152998bb 100644 (file)
@@ -4585,6 +4585,8 @@ static bool test_EnumDomains(struct dcerpc_pipe *p, struct torture_context *tctx
        NTSTATUS status;
        struct samr_EnumDomains r;
        uint32_t resume_handle = 0;
+       uint32_t num_entries = 0;
+       struct samr_SamArray *sam = NULL;
        int i;
        bool ret = true;
 
@@ -4592,17 +4594,19 @@ static bool test_EnumDomains(struct dcerpc_pipe *p, struct torture_context *tctx
        r.in.resume_handle = &resume_handle;
        r.in.buf_size = (uint32_t)-1;
        r.out.resume_handle = &resume_handle;
+       r.out.num_entries = &num_entries;
+       r.out.sam = &sam;
 
        status = dcerpc_samr_EnumDomains(p, tctx, &r);
        torture_assert_ntstatus_ok(tctx, status, "EnumDomains");
 
-       if (!r.out.sam) {
+       if (!*r.out.sam) {
                return false;
        }
 
-       for (i=0;i<r.out.sam->count;i++) {
+       for (i=0;i<sam->count;i++) {
                if (!test_LookupDomain(p, tctx, handle, 
-                                      r.out.sam->entries[i].name.string, which_ops)) {
+                                      sam->entries[i].name.string, which_ops)) {
                        ret = false;
                }
        }
index 6b60b8314f2c87a5b406c2d338858b96e0bd637f..9a8e44201940a8eb3c81f5d4553288329304a7b2 100644 (file)
@@ -149,6 +149,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
        int i;
        uint32_t mask;
        uint32_t resume_handle = 0;
+       struct samr_SamArray *sam = NULL;
+       uint32_t num_entries = 0;
 
        printf("testing which bits in Connect5 accessmask allows us to EnumDomains\n");
        mask = 1;
@@ -172,6 +174,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
                        ed.in.resume_handle = &resume_handle;
                        ed.in.buf_size = (uint32_t)-1;
                        ed.out.resume_handle = &resume_handle;
+                       ed.out.num_entries = &num_entries;
+                       ed.out.sam = &sam;
 
                        status = dcerpc_samr_EnumDomains(p, tctx, &ed);
                        if (!NT_STATUS_IS_OK(status)) {
@@ -197,6 +201,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
                        ed.in.resume_handle = &resume_handle;
                        ed.in.buf_size = (uint32_t)-1;
                        ed.out.resume_handle = &resume_handle;
+                       ed.out.num_entries = &num_entries;
+                       ed.out.sam = &sam;
 
                        status = dcerpc_samr_EnumDomains(p, tctx, &ed);
                        if(!NT_STATUS_EQUAL(NT_STATUS_ACCESS_DENIED, status)) {