s4-samr: merge samr_QueryUserInfo{2} from s3 idl. (fixme: python)
authorGünther Deschner <gd@samba.org>
Mon, 10 Nov 2008 13:42:27 +0000 (14:42 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 10 Nov 2008 20:46:31 +0000 (21:46 +0100)
Guenther

librpc/idl/samr.idl
source4/libnet/libnet_join.c
source4/libnet/userinfo.c
source4/libnet/userman.c
source4/rpc_server/samr/dcesrv_samr.c
source4/torture/rpc/samba3rpc.c
source4/torture/rpc/samr.c
source4/torture/rpc/samsync.c

index 7fc3d2d6091cbdf57ad1f1786b7bf46be8e597c3..ee179407d4e8c8230d223d3071e54caa831d7362 100644 (file)
@@ -1001,7 +1001,7 @@ import "misc.idl", "lsa.idl", "security.idl";
        [public] NTSTATUS samr_QueryUserInfo(
                [in,ref]                  policy_handle *user_handle,
                [in]                      uint16 level,
-               [out,unique,switch_is(level)] samr_UserInfo *info
+               [out,ref,switch_is(level)] samr_UserInfo **info
                );
 
 
@@ -1208,7 +1208,7 @@ import "misc.idl", "lsa.idl", "security.idl";
        NTSTATUS samr_QueryUserInfo2(
                [in,ref]                  policy_handle *user_handle,
                [in]                      uint16 level,
-               [out,unique,switch_is(level)]    samr_UserInfo *info
+               [out,ref,switch_is(level)]    samr_UserInfo **info
                );
 
        /************************/
index b813bba3ea03668eeaef8423819b791fd7e82d5a..70fcb4a894eac46bc86a1a6208f27c2fe2b0daf6 100644 (file)
@@ -449,6 +449,7 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
        struct samr_CreateUser2 cu;
        struct policy_handle *u_handle = NULL;
        struct samr_QueryUserInfo qui;
+       union samr_UserInfo *uinfo;
        struct samr_UserInfo21 u_info21;
        union libnet_SetPassword r2;
        struct samr_GetUserPwInfo pwp;
@@ -700,6 +701,7 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
        /* prepare samr_QueryUserInfo (get flags) */
        qui.in.user_handle = u_handle;
        qui.in.level = 16;
+       qui.out.info = &uinfo;
        
        status = dcerpc_samr_QueryUserInfo(samr_pipe, tmp_ctx, &qui);
        if (!NT_STATUS_IS_OK(status)) {
@@ -711,7 +713,7 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
                return status;
        }
        
-       if (!qui.out.info) {
+       if (!uinfo) {
                status = NT_STATUS_INVALID_PARAMETER;
                r->out.error_string
                        = talloc_asprintf(mem_ctx,
@@ -721,7 +723,7 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
                return status;
        }
 
-       old_acct_flags = (qui.out.info->info16.acct_flags & (ACB_WSTRUST | ACB_SVRTRUST | ACB_DOMTRUST));
+       old_acct_flags = (uinfo->info16.acct_flags & (ACB_WSTRUST | ACB_SVRTRUST | ACB_DOMTRUST));
        /* Possibly bail if the account is of the wrong type */
        if (old_acct_flags
            != r->in.acct_type) {
@@ -777,7 +779,7 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
                        return NT_STATUS_USER_EXISTS;
                }
        } else {
-               acct_flags = qui.out.info->info16.acct_flags;
+               acct_flags = uinfo->info16.acct_flags;
        }
        
        acct_flags = (acct_flags & ~(ACB_DISABLED|ACB_PWNOTREQ));
index 1579cd9691acc83e283e518951239607f8f83c48..710154d41e195eddd5e3983dbdeb0725d19227c1 100644 (file)
@@ -151,6 +151,8 @@ static void continue_userinfo_openuser(struct rpc_request *req)
        /* prepare parameters for QueryUserInfo call */
        s->queryuserinfo.in.user_handle = &s->user_handle;
        s->queryuserinfo.in.level       = s->level;
+       s->queryuserinfo.out.info       = talloc(s, union samr_UserInfo *);
+       if (composite_nomem(s->queryuserinfo.out.info, c)) return;
        
        /* queue rpc call, set event handling and new state */
        queryuser_req = dcerpc_samr_QueryUserInfo_send(s->pipe, c, &s->queryuserinfo);
@@ -184,7 +186,7 @@ static void continue_userinfo_getuser(struct rpc_request *req)
                return;
        }
 
-       s->info = talloc_steal(s, s->queryuserinfo.out.info);
+       s->info = talloc_steal(s, *(s->queryuserinfo.out.info));
 
        /* issue a monitor message */
        if (s->monitor_fn) {
index 53e62c788622ddbda1d437e215d7c8691a0e1e02..c638d8af32115aaf2c7baeb6e07b409e4c88c03e 100644 (file)
@@ -683,6 +683,9 @@ static NTSTATUS usermod_change(struct composite_context *c,
        if (!do_set) {
                s->queryuser.in.user_handle = &s->user_handle;
                s->queryuser.in.level       = level;
+               s->queryuser.out.info       = talloc(s, union samr_UserInfo *);
+               if (composite_nomem(s->queryuser.out.info, c)) return;
+
 
                /* send query user info request to retrieve complete data of
                   a particular info level */
@@ -755,7 +758,7 @@ static void continue_usermod_user_queried(struct rpc_request *req)
 
        /* get returned user data and make a change (potentially one
           of many) */
-       s->info = *s->queryuser.out.info;
+       s->info = *(*s->queryuser.out.info);
 
        usermod_setfields(s, &level, i, true);
 
index 53e4c28f8d977f42f3c7bbfa174674cd9d0ac713..c093b536dab7da628054ba29f7fb7ac70373a97a 100644 (file)
@@ -3019,7 +3019,7 @@ static NTSTATUS dcesrv_samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TA
        const char * const *attrs = NULL;
        union samr_UserInfo *info;
 
-       r->out.info = NULL;
+       *r->out.info = NULL;
 
        DCESRV_PULL_HANDLE(h, r->in.user_handle, SAMR_HANDLE_USER);
 
@@ -3355,7 +3355,7 @@ static NTSTATUS dcesrv_samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TA
                return NT_STATUS_INVALID_INFO_CLASS;
        }
 
-       r->out.info = info;
+       *r->out.info = info;
 
        return NT_STATUS_OK;
 }
@@ -4057,13 +4057,11 @@ static NTSTATUS dcesrv_samr_QueryUserInfo2(struct dcesrv_call_state *dce_call, T
        struct samr_QueryUserInfo r1;
        NTSTATUS status;
 
-       ZERO_STRUCT(r1.out);
        r1.in.user_handle = r->in.user_handle;
        r1.in.level  = r->in.level;
+       r1.out.info  = r->out.info;
        
        status = dcesrv_samr_QueryUserInfo(dce_call, mem_ctx, &r1);
-       
-       r->out.info = r1.out.info;
 
        return status;
 }
index 3b26799021028ca2b62080b2a57a402e9dc4ff51..1148262dfe3e94bee0adc040d16274ffb445ec50 100644 (file)
@@ -564,6 +564,7 @@ static bool create_user(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
                struct samr_SetUserInfo sui;
                struct samr_QueryUserInfo qui;
                union samr_UserInfo u_info;
+               union samr_UserInfo *info;
                DATA_BLOB session_key;
 
 
@@ -606,6 +607,7 @@ static bool create_user(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
 
                qui.in.user_handle = wks_handle;
                qui.in.level = 21;
+               qui.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo(samr_pipe, tmp_ctx, &qui);
                if (!NT_STATUS_IS_OK(status)) {
@@ -613,14 +615,14 @@ static bool create_user(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
                        goto done;
                }
 
-               qui.out.info->info21.allow_password_change = 0;
-               qui.out.info->info21.force_password_change = 0;
-               qui.out.info->info21.account_name.string = NULL;
-               qui.out.info->info21.rid = 0;
-               qui.out.info->info21.acct_expiry = 0;
-               qui.out.info->info21.fields_present = 0x81827fa; /* copy usrmgr.exe */
+               info->info21.allow_password_change = 0;
+               info->info21.force_password_change = 0;
+               info->info21.account_name.string = NULL;
+               info->info21.rid = 0;
+               info->info21.acct_expiry = 0;
+               info->info21.fields_present = 0x81827fa; /* copy usrmgr.exe */
 
-               u_info.info21 = qui.out.info->info21;
+               u_info.info21 = info->info21;
                sui.in.user_handle = wks_handle;
                sui.in.info = &u_info;
                sui.in.level = 21;
@@ -730,9 +732,11 @@ static bool join3(struct smbcli_state *cli,
 
        {
                struct samr_QueryUserInfo q;
+               union samr_UserInfo *info;
 
                q.in.user_handle = wks_handle;
                q.in.level = 21;
+               q.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo(samr_pipe, mem_ctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
@@ -741,7 +745,7 @@ static bool join3(struct smbcli_state *cli,
                        goto done;
                }
 
-               last_password_change = q.out.info->info21.last_password_change;
+               last_password_change = info->info21.last_password_change;
        }
 
        cli_credentials_set_domain(wks_creds, dom_name, CRED_SPECIFIED);
@@ -839,9 +843,11 @@ static bool join3(struct smbcli_state *cli,
 
        {
                struct samr_QueryUserInfo q;
+               union samr_UserInfo *info;
 
                q.in.user_handle = wks_handle;
                q.in.level = 21;
+               q.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo(samr_pipe, mem_ctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
@@ -852,7 +858,7 @@ static bool join3(struct smbcli_state *cli,
 
                if (use_level25) {
                        if (last_password_change
-                           == q.out.info->info21.last_password_change) {
+                           == info->info21.last_password_change) {
                                d_printf("(%s) last_password_change unchanged "
                                         "during join, level25 must change "
                                         "it\n", __location__);
@@ -861,7 +867,7 @@ static bool join3(struct smbcli_state *cli,
                }
                else {
                        if (last_password_change
-                           != q.out.info->info21.last_password_change) {
+                           != info->info21.last_password_change) {
                                d_printf("(%s) last_password_change changed "
                                         "during join, level24 doesn't "
                                         "change it\n", __location__);
index a733063752227048c3f1c896cf19447c6ae1c7bc..87690178a73246bcc4dc45e59f77a71770274720 100644 (file)
@@ -177,6 +177,7 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
        struct samr_QueryUserInfo q;
        struct samr_QueryUserInfo q0;
        union samr_UserInfo u;
+       union samr_UserInfo *info;
        bool ret = true;
        const char *test_account_name;
 
@@ -193,7 +194,7 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
        s2.in.info = &u;
 
        q.in.user_handle = handle;
-       q.out.info = &u;
+       q.out.info = &info;
        q0 = q;
 
 #define TESTCALL(call, r) \
@@ -235,7 +236,7 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(QueryUserInfo, q) \
                s.in.level = lvl1; \
                s2.in.level = lvl1; \
-               u = *q.out.info; \
+               u = *info; \
                if (lvl1 == 21) { \
                        ZERO_STRUCT(u.info21); \
                        u.info21.fields_present = fpval; \
@@ -245,11 +246,11 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(SetUserInfo2, s2) \
                init_lsa_String(&u.info ## lvl1.field1, ""); \
                TESTCALL(QueryUserInfo, q); \
-               u = *q.out.info; \
+               u = *info; \
                STRING_EQUAL(u.info ## lvl1.field1.string, value, field1); \
                q.in.level = lvl2; \
                TESTCALL(QueryUserInfo, q) \
-               u = *q.out.info; \
+               u = *info; \
                STRING_EQUAL(u.info ## lvl2.field2.string, value, field2); \
        } while (0)
 
@@ -259,7 +260,7 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(QueryUserInfo, q) \
                s.in.level = lvl1; \
                s2.in.level = lvl1; \
-               u = *q.out.info; \
+               u = *info; \
                if (lvl1 == 21) { \
                        ZERO_STRUCT(u.info21); \
                        u.info21.fields_present = fpval; \
@@ -269,11 +270,11 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(SetUserInfo2, s2) \
                init_lsa_BinaryString(&u.info ## lvl1.field1, "", 1); \
                TESTCALL(QueryUserInfo, q); \
-               u = *q.out.info; \
+               u = *info; \
                MEM_EQUAL(u.info ## lvl1.field1.array, value, strlen(value), field1); \
                q.in.level = lvl2; \
                TESTCALL(QueryUserInfo, q) \
-               u = *q.out.info; \
+               u = *info; \
                MEM_EQUAL(u.info ## lvl2.field2.array, value, strlen(value), field2); \
        } while (0)
 
@@ -283,7 +284,7 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(QueryUserInfo, q) \
                s.in.level = lvl1; \
                s2.in.level = lvl1; \
-               u = *q.out.info; \
+               u = *info; \
                if (lvl1 == 21) { \
                        uint8_t *bits = u.info21.logon_hours.bits; \
                        ZERO_STRUCT(u.info21); \
@@ -298,11 +299,11 @@ static bool test_SetUserInfo(struct dcerpc_pipe *p, struct torture_context *tctx
                TESTCALL(SetUserInfo2, s2) \
                u.info ## lvl1.field1 = 0; \
                TESTCALL(QueryUserInfo, q); \
-               u = *q.out.info; \
+               u = *info; \
                INT_EQUAL(u.info ## lvl1.field1, exp_value, field1); \
                q.in.level = lvl2; \
                TESTCALL(QueryUserInfo, q) \
-               u = *q.out.info; \
+               u = *info; \
                INT_EQUAL(u.info ## lvl2.field2, exp_value, field1); \
        } while (0)
 
@@ -2142,6 +2143,7 @@ static bool test_user_ops(struct dcerpc_pipe *p,
 {
        char *password = NULL;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        NTSTATUS status;
 
        bool ret = true;
@@ -2257,6 +2259,7 @@ static bool test_user_ops(struct dcerpc_pipe *p,
 
                q.in.user_handle = user_handle;
                q.in.level = 5;
+               q.out.info = &info;
                
                status = dcerpc_samr_QueryUserInfo(p, tctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
@@ -2265,15 +2268,15 @@ static bool test_user_ops(struct dcerpc_pipe *p,
                        ret = false;
                } else {
                        uint32_t expected_flags = (base_acct_flags | ACB_PWNOTREQ | ACB_DISABLED);
-                       if ((q.out.info->info5.acct_flags) != expected_flags) {
+                       if ((info->info5.acct_flags) != expected_flags) {
                                printf("QuerUserInfo level 5 failed, it returned 0x%08x when we expected flags of 0x%08x\n",
-                                      q.out.info->info5.acct_flags, 
+                                      info->info5.acct_flags,
                                       expected_flags);
                                ret = false;
                        }
-                       if (q.out.info->info5.rid != rid) {
+                       if (info->info5.rid != rid) {
                                printf("QuerUserInfo level 5 failed, it returned %u when we expected rid of %u\n",
-                                      q.out.info->info5.rid, rid);
+                                      info->info5.rid, rid);
 
                        }
                }
@@ -2623,6 +2626,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                NTSTATUS status;
                struct samr_OpenUser r;
                struct samr_QueryUserInfo q;
+               union samr_UserInfo *info;
                struct samr_LookupNames n;
                struct policy_handle user_handle;
                struct samr_Ids rids, types;
@@ -2653,6 +2657,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
                q.in.user_handle = &user_handle;
                q.in.level = 5;
+               q.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo(p, mem_ctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
@@ -2663,7 +2668,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                printf("calling test_ChangePasswordUser3 with too early password change\n");
 
                if (!test_ChangePasswordUser3(p, mem_ctx, acct_name, 0, password, NULL, 
-                                             q.out.info->info5.last_password_change, true)) {
+                                             info->info5.last_password_change, true)) {
                        ret = false;
                }
        }
@@ -2693,6 +2698,7 @@ static bool test_CreateUser(struct dcerpc_pipe *p, struct torture_context *tctx,
        NTSTATUS status;
        struct samr_CreateUser r;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        struct samr_DeleteUser d;
        uint32_t rid;
 
@@ -2740,6 +2746,7 @@ static bool test_CreateUser(struct dcerpc_pipe *p, struct torture_context *tctx,
        } else {
                q.in.user_handle = &user_handle;
                q.in.level = 16;
+               q.out.info = &info;
                
                status = dcerpc_samr_QueryUserInfo(p, user_ctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
@@ -2747,9 +2754,9 @@ static bool test_CreateUser(struct dcerpc_pipe *p, struct torture_context *tctx,
                               q.in.level, nt_errstr(status));
                        ret = false;
                } else {
-                       if ((q.out.info->info16.acct_flags & acct_flags) != acct_flags) {
+                       if ((info->info16.acct_flags & acct_flags) != acct_flags) {
                                printf("QuerUserInfo level 16 failed, it returned 0x%08x when we expected flags of 0x%08x\n",
-                                      q.out.info->info16.acct_flags, 
+                                      info->info16.acct_flags,
                                       acct_flags);
                                ret = false;
                        }
@@ -2791,6 +2798,7 @@ static bool test_CreateUser2(struct dcerpc_pipe *p, struct torture_context *tctx
        NTSTATUS status;
        struct samr_CreateUser2 r;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        struct samr_DeleteUser d;
        struct policy_handle user_handle;
        uint32_t rid;
@@ -2869,6 +2877,7 @@ static bool test_CreateUser2(struct dcerpc_pipe *p, struct torture_context *tctx
                if (NT_STATUS_IS_OK(status)) {
                        q.in.user_handle = &user_handle;
                        q.in.level = 5;
+                       q.out.info = &info;
                        
                        status = dcerpc_samr_QueryUserInfo(p, user_ctx, &q);
                        if (!NT_STATUS_IS_OK(status)) {
@@ -2880,31 +2889,31 @@ static bool test_CreateUser2(struct dcerpc_pipe *p, struct torture_context *tctx
                                if (acct_flags == ACB_NORMAL) {
                                        expected_flags |= ACB_PW_EXPIRED;
                                }
-                               if ((q.out.info->info5.acct_flags) != expected_flags) {
+                               if ((info->info5.acct_flags) != expected_flags) {
                                        printf("QuerUserInfo level 5 failed, it returned 0x%08x when we expected flags of 0x%08x\n",
-                                              q.out.info->info5.acct_flags, 
+                                              info->info5.acct_flags,
                                               expected_flags);
                                        ret = false;
                                } 
                                switch (acct_flags) {
                                case ACB_SVRTRUST:
-                                       if (q.out.info->info5.primary_gid != DOMAIN_RID_DCS) {
+                                       if (info->info5.primary_gid != DOMAIN_RID_DCS) {
                                                printf("QuerUserInfo level 5: DC should have had Primary Group %d, got %d\n", 
-                                                      DOMAIN_RID_DCS, q.out.info->info5.primary_gid);
+                                                      DOMAIN_RID_DCS, info->info5.primary_gid);
                                                ret = false;
                                        }
                                        break;
                                case ACB_WSTRUST:
-                                       if (q.out.info->info5.primary_gid != DOMAIN_RID_DOMAIN_MEMBERS) {
+                                       if (info->info5.primary_gid != DOMAIN_RID_DOMAIN_MEMBERS) {
                                                printf("QuerUserInfo level 5: Domain Member should have had Primary Group %d, got %d\n", 
-                                                      DOMAIN_RID_DOMAIN_MEMBERS, q.out.info->info5.primary_gid);
+                                                      DOMAIN_RID_DOMAIN_MEMBERS, info->info5.primary_gid);
                                                ret = false;
                                        }
                                        break;
                                case ACB_NORMAL:
-                                       if (q.out.info->info5.primary_gid != DOMAIN_RID_USERS) {
+                                       if (info->info5.primary_gid != DOMAIN_RID_USERS) {
                                                printf("QuerUserInfo level 5: Users should have had Primary Group %d, got %d\n", 
-                                                      DOMAIN_RID_USERS, q.out.info->info5.primary_gid);
+                                                      DOMAIN_RID_USERS, info->info5.primary_gid);
                                                ret = false;
                                        }
                                        break;
@@ -3084,6 +3093,7 @@ static bool test_QueryUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status;
        struct samr_QueryUserInfo r;
+       union samr_UserInfo *info;
        uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                           11, 12, 13, 14, 16, 17, 20, 21};
        int i;
@@ -3094,6 +3104,7 @@ static bool test_QueryUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
                r.in.user_handle = handle;
                r.in.level = levels[i];
+               r.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo(p, mem_ctx, &r);
                if (!NT_STATUS_IS_OK(status)) {
@@ -3111,6 +3122,7 @@ static bool test_QueryUserInfo2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status;
        struct samr_QueryUserInfo2 r;
+       union samr_UserInfo *info;
        uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                           11, 12, 13, 14, 16, 17, 20, 21};
        int i;
@@ -3121,6 +3133,7 @@ static bool test_QueryUserInfo2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
                r.in.user_handle = handle;
                r.in.level = levels[i];
+               r.out.info = &info;
 
                status = dcerpc_samr_QueryUserInfo2(p, mem_ctx, &r);
                if (!NT_STATUS_IS_OK(status)) {
@@ -3268,6 +3281,7 @@ static bool check_mask(struct dcerpc_pipe *p, struct torture_context *tctx,
        NTSTATUS status;
        struct samr_OpenUser r;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        struct policy_handle user_handle;
        bool ret = true;
 
@@ -3286,6 +3300,7 @@ static bool check_mask(struct dcerpc_pipe *p, struct torture_context *tctx,
 
        q.in.user_handle = &user_handle;
        q.in.level = 16;
+       q.out.info = &info;
        
        status = dcerpc_samr_QueryUserInfo(p, tctx, &q);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3293,9 +3308,9 @@ static bool check_mask(struct dcerpc_pipe *p, struct torture_context *tctx,
                       nt_errstr(status));
                ret = false;
        } else {
-               if ((acct_flag_mask & q.out.info->info16.acct_flags) == 0) {
+               if ((acct_flag_mask & info->info16.acct_flags) == 0) {
                        printf("Server failed to filter for 0x%x, allowed 0x%x (%d) on EnumDomainUsers\n",
-                              acct_flag_mask, q.out.info->info16.acct_flags, rid);
+                              acct_flag_mask, info->info16.acct_flags, rid);
                        ret = false;
                }
        }
@@ -3625,6 +3640,7 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
 {
        struct samr_OpenUser r;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        struct policy_handle user_handle;
        int i, ret = true;
        NTSTATUS status;
@@ -3666,6 +3682,7 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
                
                q.in.user_handle = &user_handle;
                q.in.level = 21;
+               q.out.info = &info;
                status = dcerpc_samr_QueryUserInfo(p, mem_ctx, &q);
                if (!NT_STATUS_IS_OK(status)) {
                        printf("QueryUserInfo(%u) failed - %s\n", r.in.rid, nt_errstr(status));
@@ -3674,41 +3691,41 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
                
                switch (querydisplayinfo->in.level) {
                case 1:
-                       if (seen_testuser && strcmp(q.out.info->info21.account_name.string, TEST_ACCOUNT_NAME) == 0) {
+                       if (seen_testuser && strcmp(info->info21.account_name.string, TEST_ACCOUNT_NAME) == 0) {
                                *seen_testuser = true;
                        }
                        STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].full_name,
-                                          q.out.info->info21.full_name, q.out.info->info21.account_name);
+                                          info->info21.full_name, info->info21.account_name);
                        STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].account_name,
-                                          q.out.info->info21.account_name, q.out.info->info21.account_name);
+                                          info->info21.account_name, info->info21.account_name);
                        STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].description,
-                                          q.out.info->info21.description, q.out.info->info21.account_name);
+                                          info->info21.description, info->info21.account_name);
                        INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].rid,
-                                       q.out.info->info21.rid, q.out.info->info21.account_name);
+                                       info->info21.rid, info->info21.account_name);
                        INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].acct_flags,
-                                       q.out.info->info21.acct_flags, q.out.info->info21.account_name);
+                                       info->info21.acct_flags, info->info21.account_name);
                        
                        break;
                case 2:
                        STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].account_name,
-                                          q.out.info->info21.account_name, q.out.info->info21.account_name);
+                                          info->info21.account_name, info->info21.account_name);
                        STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].description,
-                                          q.out.info->info21.description, q.out.info->info21.account_name);
+                                          info->info21.description, info->info21.account_name);
                        INT_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].rid,
-                                       q.out.info->info21.rid, q.out.info->info21.account_name);
+                                       info->info21.rid, info->info21.account_name);
                        INT_EQUAL_QUERY((querydisplayinfo->out.info->info2.entries[i].acct_flags & ~ACB_NORMAL),
-                                       q.out.info->info21.acct_flags, q.out.info->info21.account_name);
+                                       info->info21.acct_flags, info->info21.account_name);
                        
                        if (!(querydisplayinfo->out.info->info2.entries[i].acct_flags & ACB_NORMAL)) {
                                printf("Missing ACB_NORMAL in querydisplayinfo->out.info.info2.entries[i].acct_flags on %s\n", 
-                                      q.out.info->info21.account_name.string);
+                                      info->info21.account_name.string);
                        }
 
-                       if (!(q.out.info->info21.acct_flags & (ACB_WSTRUST | ACB_SVRTRUST))) {
+                       if (!(info->info21.acct_flags & (ACB_WSTRUST | ACB_SVRTRUST))) {
                                printf("Found non-trust account %s in trust account listing: 0x%x 0x%x\n",
-                                      q.out.info->info21.account_name.string,
+                                      info->info21.account_name.string,
                                       querydisplayinfo->out.info->info2.entries[i].acct_flags,
-                                      q.out.info->info21.acct_flags);
+                                      info->info21.acct_flags);
                                return false;
                        }
                        
index f6c9744449e8400c039c64b89be7037616d6b92c..a3fc6f740f0569aecda1ec86daa2911f157ff669 100644 (file)
@@ -441,6 +441,7 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct
 
        struct samr_OpenUser r;
        struct samr_QueryUserInfo q;
+       union samr_UserInfo *info;
        struct policy_handle user_handle;
 
        struct samr_GetGroupsForUser getgroups;
@@ -464,6 +465,7 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct
 
        q.in.user_handle = &user_handle;
        q.in.level = 21;
+       q.out.info = &info;
 
        TEST_SEC_DESC_EQUAL(user->sdbuf, samr, &user_handle);
 
@@ -499,67 +501,67 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct
                return false;
        }
 
-       TEST_STRING_EQUAL(q.out.info->info21.account_name, user->account_name);
-       TEST_STRING_EQUAL(q.out.info->info21.full_name, user->full_name);
-       TEST_INT_EQUAL(q.out.info->info21.rid, user->rid);
-       TEST_INT_EQUAL(q.out.info->info21.primary_gid, user->primary_gid);
-       TEST_STRING_EQUAL(q.out.info->info21.home_directory, user->home_directory);
-       TEST_STRING_EQUAL(q.out.info->info21.home_drive, user->home_drive);
-       TEST_STRING_EQUAL(q.out.info->info21.logon_script, user->logon_script);
-       TEST_STRING_EQUAL(q.out.info->info21.description, user->description);
-       TEST_STRING_EQUAL(q.out.info->info21.workstations, user->workstations);
+       TEST_STRING_EQUAL(info->info21.account_name, user->account_name);
+       TEST_STRING_EQUAL(info->info21.full_name, user->full_name);
+       TEST_INT_EQUAL(info->info21.rid, user->rid);
+       TEST_INT_EQUAL(info->info21.primary_gid, user->primary_gid);
+       TEST_STRING_EQUAL(info->info21.home_directory, user->home_directory);
+       TEST_STRING_EQUAL(info->info21.home_drive, user->home_drive);
+       TEST_STRING_EQUAL(info->info21.logon_script, user->logon_script);
+       TEST_STRING_EQUAL(info->info21.description, user->description);
+       TEST_STRING_EQUAL(info->info21.workstations, user->workstations);
 
-       TEST_TIME_EQUAL(q.out.info->info21.last_logon, user->last_logon);
-       TEST_TIME_EQUAL(q.out.info->info21.last_logoff, user->last_logoff);
+       TEST_TIME_EQUAL(info->info21.last_logon, user->last_logon);
+       TEST_TIME_EQUAL(info->info21.last_logoff, user->last_logoff);
 
 
-       TEST_INT_EQUAL(q.out.info->info21.logon_hours.units_per_week, 
+       TEST_INT_EQUAL(info->info21.logon_hours.units_per_week,
                       user->logon_hours.units_per_week);
        if (ret) {
-               if (memcmp(q.out.info->info21.logon_hours.bits, user->logon_hours.bits, 
-                          q.out.info->info21.logon_hours.units_per_week/8) != 0) {
+               if (memcmp(info->info21.logon_hours.bits, user->logon_hours.bits,
+                          info->info21.logon_hours.units_per_week/8) != 0) {
                        printf("Logon hours mismatch\n");
                        ret = false;
                }
        }
 
-       TEST_INT_EQUAL(q.out.info->info21.bad_password_count,
+       TEST_INT_EQUAL(info->info21.bad_password_count,
                       user->bad_password_count);
-       TEST_INT_EQUAL(q.out.info->info21.logon_count,
+       TEST_INT_EQUAL(info->info21.logon_count,
                       user->logon_count);
 
-       TEST_TIME_EQUAL(q.out.info->info21.last_password_change,
+       TEST_TIME_EQUAL(info->info21.last_password_change,
                       user->last_password_change);
-       TEST_TIME_EQUAL(q.out.info->info21.acct_expiry,
+       TEST_TIME_EQUAL(info->info21.acct_expiry,
                       user->acct_expiry);
 
-       TEST_INT_EQUAL((q.out.info->info21.acct_flags & ~ACB_PW_EXPIRED), user->acct_flags);
+       TEST_INT_EQUAL((info->info21.acct_flags & ~ACB_PW_EXPIRED), user->acct_flags);
        if (user->acct_flags & ACB_PWNOEXP) {
-               if (q.out.info->info21.acct_flags & ACB_PW_EXPIRED) {
+               if (info->info21.acct_flags & ACB_PW_EXPIRED) {
                        printf("ACB flags mismatch: both expired and no expiry!\n");
                        ret = false;
                }
-               if (q.out.info->info21.force_password_change != (NTTIME)0x7FFFFFFFFFFFFFFFULL) {
+               if (info->info21.force_password_change != (NTTIME)0x7FFFFFFFFFFFFFFFULL) {
                        printf("ACB flags mismatch: no password expiry, but force password change 0x%016llx (%lld) != 0x%016llx (%lld)\n",
-                              (unsigned long long)q.out.info->info21.force_password_change, 
-                              (unsigned long long)q.out.info->info21.force_password_change,
+                              (unsigned long long)info->info21.force_password_change,
+                              (unsigned long long)info->info21.force_password_change,
                               (unsigned long long)0x7FFFFFFFFFFFFFFFULL, (unsigned long long)0x7FFFFFFFFFFFFFFFULL
                                );
                        ret = false;
                }
        }
 
-       TEST_INT_EQUAL(q.out.info->info21.nt_password_set, user->nt_password_present);
-       TEST_INT_EQUAL(q.out.info->info21.lm_password_set, user->lm_password_present);
-       TEST_INT_EQUAL(q.out.info->info21.password_expired, user->password_expired);
+       TEST_INT_EQUAL(info->info21.nt_password_set, user->nt_password_present);
+       TEST_INT_EQUAL(info->info21.lm_password_set, user->lm_password_present);
+       TEST_INT_EQUAL(info->info21.password_expired, user->password_expired);
 
-       TEST_STRING_EQUAL(q.out.info->info21.comment, user->comment);
-       TEST_BINARY_STRING_EQUAL(q.out.info->info21.parameters, user->parameters);
+       TEST_STRING_EQUAL(info->info21.comment, user->comment);
+       TEST_BINARY_STRING_EQUAL(info->info21.parameters, user->parameters);
 
-       TEST_INT_EQUAL(q.out.info->info21.country_code, user->country_code);
-       TEST_INT_EQUAL(q.out.info->info21.code_page, user->code_page);
+       TEST_INT_EQUAL(info->info21.country_code, user->country_code);
+       TEST_INT_EQUAL(info->info21.code_page, user->code_page);
 
-       TEST_STRING_EQUAL(q.out.info->info21.profile_path, user->profile_path);
+       TEST_STRING_EQUAL(info->info21.profile_path, user->profile_path);
 
        if (user->lm_password_present) {
                sam_rid_crypt(rid, user->lmpassword.hash, lm_hash.hash, 0);
@@ -638,7 +640,7 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct
                        return true;
                }
        } else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_PASSWORD_EXPIRED)) {
-               if (q.out.info->info21.acct_flags & ACB_PW_EXPIRED) {
+               if (info->info21.acct_flags & ACB_PW_EXPIRED) {
                        return true;
                }
        } else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_WRONG_PASSWORD)) {
@@ -673,7 +675,7 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct
                TEST_TIME_EQUAL(user->last_logon, info3->base.last_logon);
                TEST_TIME_EQUAL(user->acct_expiry, info3->base.acct_expiry);
                TEST_TIME_EQUAL(user->last_password_change, info3->base.last_password_change);
-               TEST_TIME_EQUAL(q.out.info->info21.force_password_change, info3->base.force_password_change);
+               TEST_TIME_EQUAL(info->info21.force_password_change, info3->base.force_password_change);
 
                /* Does the concept of a logoff time ever really
                 * exist? (not in any sensible way, according to the