s4-samr: merge samr_EnumDomainUsers from s3 idl. (fixme: python)
authorGünther Deschner <gd@samba.org>
Fri, 7 Nov 2008 10:25:01 +0000 (11:25 +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_user.c
source4/rpc_server/samr/dcesrv_samr.c
source4/torture/rpc/samr.c

index 23fce8dfd9f32b45c7b9ce71d239b568f43451e2..55c95a9bdce7b4eb7745524ba219136178b3408f 100644 (file)
@@ -468,12 +468,12 @@ import "misc.idl", "lsa.idl", "security.idl";
        const int SAMR_ENUM_USERS_MULTIPLIER = 54;
 
        NTSTATUS samr_EnumDomainUsers(
-               [in,ref]      policy_handle *domain_handle,
+               [in]          policy_handle *domain_handle,
                [in,out,ref]  uint32 *resume_handle,
                [in]          samr_AcctFlags acct_flags,
+               [out,ref]     samr_SamArray **sam,
                [in]          uint32 max_size,
-               [out,unique]  samr_SamArray *sam,
-               [out]         uint32 num_entries
+               [out,ref]     uint32 *num_entries
                );
 
        /************************/
index c76831945218211dbbe591520850a4c7be6b4192..8606d0856e20cc73fc29faa7d79078a48db04d88 100644 (file)
@@ -1032,6 +1032,10 @@ static void continue_domain_queried(struct rpc_request *req)
        s->user_list.in.resume_handle = &s->resume_index;
        s->user_list.in.acct_flags = ACB_NORMAL;
        s->user_list.out.resume_handle = &s->resume_index;
+       s->user_list.out.num_entries = talloc(s, uint32_t);
+       if (composite_nomem(s->user_list.out.num_entries, c)) return;
+       s->user_list.out.sam = talloc(s, struct samr_SamArray *);
+       if (composite_nomem(s->user_list.out.sam, c)) return;
 
        /* send the request */
        enum_req = dcerpc_samr_EnumDomainUsers_send(s->ctx->samr.pipe, c, &s->user_list);
@@ -1064,6 +1068,10 @@ static void continue_samr_domain_opened(struct composite_context *ctx)
        s->user_list.in.resume_handle = &s->resume_index;
        s->user_list.in.acct_flags = ACB_NORMAL;
        s->user_list.out.resume_handle = &s->resume_index;
+       s->user_list.out.sam = talloc(s, struct samr_SamArray *);
+       if (composite_nomem(s->user_list.out.sam, c)) return;
+       s->user_list.out.num_entries = talloc(s, uint32_t);
+       if (composite_nomem(s->user_list.out.num_entries, c)) return;
        
        /* send the request */
        enum_req = dcerpc_samr_EnumDomainUsers_send(s->ctx->samr.pipe, c, &s->user_list);
@@ -1102,15 +1110,15 @@ static void continue_users_enumerated(struct rpc_request *req)
                /* get enumerated accounts counter and resume handle (the latter allows
                   making subsequent call to continue enumeration) */
                s->resume_index = *s->user_list.out.resume_handle;
-               s->count        = s->user_list.out.num_entries;
+               s->count        = *s->user_list.out.num_entries;
                
                /* prepare returned user accounts array */
-               s->users        = talloc_array(c, struct userlist, s->user_list.out.sam->count);
+               s->users        = talloc_array(c, struct userlist, (*s->user_list.out.sam)->count);
                if (composite_nomem(s->users, c)) return;
 
-               for (i = 0; i < s->user_list.out.sam->count; i++) {
+               for (i = 0; i < (*s->user_list.out.sam)->count; i++) {
                        struct dom_sid *user_sid;
-                       struct samr_SamEntry *entry = &s->user_list.out.sam->entries[i];
+                       struct samr_SamEntry *entry = &(*s->user_list.out.sam)->entries[i];
                        struct dom_sid *domain_sid = (*s->query_domain.out.info)->domain.sid;
                        
                        /* construct user sid from returned rid and queried domain sid */
index c91e66a55b4d028da171e553d21513f2eac82d1d..f6691a5a6d919a4f3630447f70c59c09be9092a9 100644 (file)
@@ -1507,10 +1507,11 @@ static NTSTATUS dcesrv_samr_EnumDomainUsers(struct dcesrv_call_state *dce_call,
        int ret, num_filtered_entries, i, first;
        struct samr_SamEntry *entries;
        const char * const attrs[] = { "objectSid", "sAMAccountName", "userAccountControl", NULL };
+       struct samr_SamArray *sam;
 
        *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.domain_handle, SAMR_HANDLE_DOMAIN);
 
@@ -1554,24 +1555,26 @@ static NTSTATUS dcesrv_samr_EnumDomainUsers(struct dcesrv_call_state *dce_call,
 
        /* return the rest, limit by max_size. Note that we 
           use the w2k3 element size value of 54 */
-       r->out.num_entries = num_filtered_entries - first;
-       r->out.num_entries = MIN(r->out.num_entries, 
+       *r->out.num_entries = num_filtered_entries - first;
+       *r->out.num_entries = MIN(*r->out.num_entries,
                                 1+(r->in.max_size/SAMR_ENUM_USERS_MULTIPLIER));
 
-       r->out.sam = talloc(mem_ctx, struct samr_SamArray);
-       if (!r->out.sam) {
+       sam = talloc(mem_ctx, struct samr_SamArray);
+       if (!sam) {
                return NT_STATUS_NO_MEMORY;
        }
 
-       r->out.sam->entries = entries+first;
-       r->out.sam->count = r->out.num_entries;
+       sam->entries = entries+first;
+       sam->count = *r->out.num_entries;
+
+       *r->out.sam = sam;
 
        if (first == num_filtered_entries) {
                return NT_STATUS_OK;
        }
 
-       if (r->out.num_entries < num_filtered_entries - first) {
-               *r->out.resume_handle = entries[first+r->out.num_entries-1].idx;
+       if (*r->out.num_entries < num_filtered_entries - first) {
+               *r->out.resume_handle = entries[first+*r->out.num_entries-1].idx;
                return STATUS_MORE_ENTRIES;
        }
 
index 66b3dec618efec5d2db111d56416a015152998bb..4eb5b39ce035c14ef5c0eb88f010d1d29b26141c 100644 (file)
@@ -3311,6 +3311,8 @@ static bool test_EnumDomainUsers(struct dcerpc_pipe *p, struct torture_context *
        struct samr_LookupRids  lr ;
        struct lsa_Strings names;
        struct samr_Ids rids, types;
+       struct samr_SamArray *sam = NULL;
+       uint32_t num_entries = 0;
 
        uint32_t masks[] = {ACB_NORMAL, ACB_DOMTRUST, ACB_WSTRUST, 
                            ACB_DISABLED, ACB_NORMAL | ACB_DISABLED, 
@@ -3325,6 +3327,8 @@ static bool test_EnumDomainUsers(struct dcerpc_pipe *p, struct torture_context *
                r.in.acct_flags = mask = masks[mask_idx];
                r.in.max_size = (uint32_t)-1;
                r.out.resume_handle = &resume_handle;
+               r.out.num_entries = &num_entries;
+               r.out.sam = &sam;
 
                status = dcerpc_samr_EnumDomainUsers(p, tctx, &r);
                if (!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES) &&  
@@ -3333,18 +3337,18 @@ static bool test_EnumDomainUsers(struct dcerpc_pipe *p, struct torture_context *
                        return false;
                }
        
-               torture_assert(tctx, r.out.sam, "EnumDomainUsers failed: r.out.sam unexpectedly NULL");
+               torture_assert(tctx, sam, "EnumDomainUsers failed: r.out.sam unexpectedly NULL");
 
-               if (r.out.sam->count == 0) {
+               if (sam->count == 0) {
                        continue;
                }
 
-               for (i=0;i<r.out.sam->count;i++) {
+               for (i=0;i<sam->count;i++) {
                        if (mask) {
-                               if (!check_mask(p, tctx, handle, r.out.sam->entries[i].idx, mask)) {
+                               if (!check_mask(p, tctx, handle, sam->entries[i].idx, mask)) {
                                        ret = false;
                                }
-                       } else if (!test_OpenUser(p, tctx, handle, r.out.sam->entries[i].idx)) {
+                       } else if (!test_OpenUser(p, tctx, handle, sam->entries[i].idx)) {
                                ret = false;
                        }
                }
@@ -3352,12 +3356,12 @@ static bool test_EnumDomainUsers(struct dcerpc_pipe *p, struct torture_context *
 
        printf("Testing LookupNames\n");
        n.in.domain_handle = handle;
-       n.in.num_names = r.out.sam->count;
-       n.in.names = talloc_array(tctx, struct lsa_String, r.out.sam->count);
+       n.in.num_names = sam->count;
+       n.in.names = talloc_array(tctx, struct lsa_String, sam->count);
        n.out.rids = &rids;
        n.out.types = &types;
-       for (i=0;i<r.out.sam->count;i++) {
-               n.in.names[i].string = r.out.sam->entries[i].name.string;
+       for (i=0;i<sam->count;i++) {
+               n.in.names[i].string = sam->entries[i].name.string;
        }
        status = dcerpc_samr_LookupNames(p, tctx, &n);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3368,12 +3372,12 @@ static bool test_EnumDomainUsers(struct dcerpc_pipe *p, struct torture_context *
 
        printf("Testing LookupRids\n");
        lr.in.domain_handle = handle;
-       lr.in.num_rids = r.out.sam->count;
-       lr.in.rids = talloc_array(tctx, uint32_t, r.out.sam->count);
+       lr.in.num_rids = sam->count;
+       lr.in.rids = talloc_array(tctx, uint32_t, sam->count);
        lr.out.names = &names;
        lr.out.types = &types;
-       for (i=0;i<r.out.sam->count;i++) {
-               lr.in.rids[i] = r.out.sam->entries[i].idx;
+       for (i=0;i<sam->count;i++) {
+               lr.in.rids[i] = sam->entries[i].idx;
        }
        status = dcerpc_samr_LookupRids(p, tctx, &lr);
        torture_assert_ntstatus_ok(tctx, status, "LookupRids");