s4-samr: merge samr_QueryDomainInfo from s3 idl. (fixme python)
authorGünther Deschner <gd@samba.org>
Wed, 5 Nov 2008 01:59:51 +0000 (02:59 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 10 Nov 2008 20:46:29 +0000 (21:46 +0100)
Guenther

librpc/idl/samr.idl
source4/rpc_server/samr/dcesrv_samr.c
source4/torture/rpc/samr.c
source4/torture/rpc/samsync.c

index 1021dd32e25f2a5d18c49fb453fad0680ea07564..a295a0ce70a78d01822120e47fa0d9435ced74c0 100644 (file)
@@ -411,7 +411,7 @@ import "misc.idl", "lsa.idl", "security.idl";
        NTSTATUS samr_QueryDomainInfo(
                [in,ref]      policy_handle *domain_handle,
                [in]          uint16 level,
-               [out,switch_is(level),unique] samr_DomainInfo *info
+               [out,ref,switch_is(level)] samr_DomainInfo **info
                );
 
        /************************/
index 1511d78243aa4ea735beb2eaa7a241c1a6c5547f..bc21d9425a9506f96ba1c05af181339c0db9ff68 100644 (file)
@@ -777,18 +777,19 @@ static NTSTATUS dcesrv_samr_QueryDomainInfo(struct dcesrv_call_state *dce_call,
 {
        struct dcesrv_handle *h;
        struct samr_domain_state *d_state;
+       union samr_DomainInfo *info;
 
        struct ldb_message **dom_msgs;
        const char * const *attrs = NULL;
        
-       r->out.info = NULL;
+       *r->out.info = NULL;
 
        DCESRV_PULL_HANDLE(h, r->in.domain_handle, SAMR_HANDLE_DOMAIN);
 
        d_state = h->data;
 
-       r->out.info = talloc(mem_ctx, union samr_DomainInfo);
-       if (!r->out.info) {
+       info = talloc(mem_ctx, union samr_DomainInfo);
+       if (!info) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -893,47 +894,49 @@ static NTSTATUS dcesrv_samr_QueryDomainInfo(struct dcesrv_call_state *dce_call,
                }
        }
 
-       ZERO_STRUCTP(r->out.info);
+       *r->out.info = info;
+
+       ZERO_STRUCTP(info);
 
        switch (r->in.level) {
        case 1:
                return dcesrv_samr_info_DomInfo1(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info1);
+                                                &info->info1);
        case 2:
                return dcesrv_samr_info_DomGeneralInformation(d_state, mem_ctx, dom_msgs, 
-                                                             &r->out.info->general);
+                                                             &info->general);
        case 3:
                return dcesrv_samr_info_DomInfo3(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info3);
+                                                &info->info3);
        case 4:
                return dcesrv_samr_info_DomOEMInformation(d_state, mem_ctx, dom_msgs, 
-                                                         &r->out.info->oem);
+                                                         &info->oem);
        case 5:
                return dcesrv_samr_info_DomInfo5(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info5);
+                                                &info->info5);
        case 6:
                return dcesrv_samr_info_DomInfo6(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info6);
+                                                &info->info6);
        case 7:
                return dcesrv_samr_info_DomInfo7(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info7);
+                                                &info->info7);
        case 8:
                return dcesrv_samr_info_DomInfo8(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info8);
+                                                &info->info8);
        case 9:
                return dcesrv_samr_info_DomInfo9(d_state, mem_ctx, dom_msgs, 
-                                                &r->out.info->info9);
+                                                &info->info9);
        case 11:
                return dcesrv_samr_info_DomGeneralInformation2(d_state, mem_ctx, dom_msgs, 
-                                                              &r->out.info->general2);
+                                                              &info->general2);
        case 12:
                return dcesrv_samr_info_DomInfo12(d_state, mem_ctx, dom_msgs, 
-                                                 &r->out.info->info12);
+                                                 &info->info12);
        case 13:
                return dcesrv_samr_info_DomInfo13(d_state, mem_ctx, dom_msgs, 
-                                                 &r->out.info->info13);
+                                                 &info->info13);
        }
-       
+
        return NT_STATUS_INVALID_INFO_CLASS;
 }
 
@@ -4026,11 +4029,10 @@ static NTSTATUS dcesrv_samr_QueryDomainInfo2(struct dcesrv_call_state *dce_call,
        ZERO_STRUCT(r1.out);
        r1.in.domain_handle = r->in.domain_handle;
        r1.in.level  = r->in.level;
-       
+       r1.out.info  = r->out.info;
+
        status = dcesrv_samr_QueryDomainInfo(dce_call, mem_ctx, &r1);
        
-       r->out.info = r1.out.info;
-
        return status;
 }
 
index 13ab01a0c73b88e81c6b00e96b4ab77f785626a9..4c3bc526265ca8068ddd2717904434902bd94258 100644 (file)
@@ -2555,6 +2555,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        /* set samr_SetDomainInfo level 1 with min_length 5 */
        {
                struct samr_QueryDomainInfo r;
+               union samr_DomainInfo *info = NULL;
                struct samr_SetDomainInfo s;
                uint16_t len_old, len;
                uint32_t pwd_prop_old;
@@ -2565,6 +2566,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
                r.in.domain_handle = domain_handle;
                r.in.level = 1;
+               r.out.info = &info;
 
                printf("testing samr_QueryDomainInfo level 1\n");
                status = dcerpc_samr_QueryDomainInfo(p, mem_ctx, &r);
@@ -2574,7 +2576,7 @@ static bool test_ChangePassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
                s.in.domain_handle = domain_handle;
                s.in.level = 1;
-               s.in.info = r.out.info;
+               s.in.info = info;
 
                /* remember the old min length, so we can reset it */
                len_old = s.in.info->info1.min_password_length;
@@ -3696,6 +3698,7 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        NTSTATUS status;
        struct samr_QueryDisplayInfo r;
        struct samr_QueryDomainInfo dom_info;
+       union samr_DomainInfo *info = NULL;
        bool ret = true;
        uint16_t levels[] = {1, 2, 3, 4, 5};
        int i;
@@ -3744,6 +3747,8 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                }
                dom_info.in.domain_handle = handle;
                dom_info.in.level = 2;
+               dom_info.out.info = &info;
+
                /* Check number of users returned is correct */
                status = dcerpc_samr_QueryDomainInfo(p, mem_ctx, &dom_info);
                if (!NT_STATUS_IS_OK(status)) {
@@ -3755,17 +3760,17 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                switch (r.in.level) {
                case 1:
                case 4:
-                       if (dom_info.out.info->general.num_users < r.in.start_idx) {
+                       if (info->general.num_users < r.in.start_idx) {
                                printf("QueryDomainInfo indicates that QueryDisplayInfo returned more users (%d/%d) than the domain %s is said to contain!\n",
-                                      r.in.start_idx, dom_info.out.info->general.num_groups,
-                                      dom_info.out.info->general.domain_name.string);
+                                      r.in.start_idx, info->general.num_groups,
+                                      info->general.domain_name.string);
                                ret = false;
                        }
                        if (!seen_testuser) {
                                struct policy_handle user_handle;
                                if (NT_STATUS_IS_OK(test_OpenUser_byname(p, mem_ctx, handle, TEST_ACCOUNT_NAME, &user_handle))) {
                                        printf("Didn't find test user " TEST_ACCOUNT_NAME " in enumeration of %s\n", 
-                                              dom_info.out.info->general.domain_name.string);
+                                              info->general.domain_name.string);
                                        ret = false;
                                        test_samr_handle_Close(p, mem_ctx, &user_handle);
                                }
@@ -3773,10 +3778,10 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                        break;
                case 3:
                case 5:
-                       if (dom_info.out.info->general.num_groups != r.in.start_idx) {
+                       if (info->general.num_groups != r.in.start_idx) {
                                printf("QueryDomainInfo indicates that QueryDisplayInfo didn't return all (%d/%d) the groups in %s\n",
-                                      r.in.start_idx, dom_info.out.info->general.num_groups,
-                                      dom_info.out.info->general.domain_name.string);
+                                      r.in.start_idx, info->general.num_groups,
+                                      info->general.domain_name.string);
                                ret = false;
                        }
                        
@@ -3892,6 +3897,7 @@ static bool test_QueryDomainInfo(struct dcerpc_pipe *p, struct torture_context *
 {
        NTSTATUS status;
        struct samr_QueryDomainInfo r;
+       union samr_DomainInfo *info = NULL;
        struct samr_SetDomainInfo s;
        uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13};
        uint16_t set_ok[] = {1, 0, 1, 1, 0, 1, 1, 0, 1,  0,  1,  0};
@@ -3918,6 +3924,7 @@ static bool test_QueryDomainInfo(struct dcerpc_pipe *p, struct torture_context *
 
                r.in.domain_handle = handle;
                r.in.level = levels[i];
+               r.out.info = &info;
 
                status = dcerpc_samr_QueryDomainInfo(p, tctx, &r);
                if (!NT_STATUS_IS_OK(status)) {
@@ -3929,40 +3936,40 @@ static bool test_QueryDomainInfo(struct dcerpc_pipe *p, struct torture_context *
 
                switch (levels[i]) {
                case 2:
-                       if (strcmp(r.out.info->general.oem_information.string, domain_comment) != 0) {
+                       if (strcmp(info->general.oem_information.string, domain_comment) != 0) {
                                printf("QueryDomainInfo level %u returned different oem_information (comment) (%s, expected %s)\n",
-                                      levels[i], r.out.info->general.oem_information.string, domain_comment);
+                                      levels[i], info->general.oem_information.string, domain_comment);
                                ret = false;
                        }
-                       if (!r.out.info->general.primary.string) {
+                       if (!info->general.primary.string) {
                                printf("QueryDomainInfo level %u returned no PDC name\n",
                                       levels[i]);
                                ret = false;
-                       } else if (r.out.info->general.role == SAMR_ROLE_DOMAIN_PDC) {
-                               if (dcerpc_server_name(p) && strcasecmp_m(dcerpc_server_name(p), r.out.info->general.primary.string) != 0) {
+                       } else if (info->general.role == SAMR_ROLE_DOMAIN_PDC) {
+                               if (dcerpc_server_name(p) && strcasecmp_m(dcerpc_server_name(p), info->general.primary.string) != 0) {
                                        printf("QueryDomainInfo level %u returned different PDC name (%s) compared to server name (%s), despite claiming to be the PDC\n",
-                                              levels[i], r.out.info->general.primary.string, dcerpc_server_name(p));
+                                              levels[i], info->general.primary.string, dcerpc_server_name(p));
                                }
                        }
                        break;
                case 4:
-                       if (strcmp(r.out.info->oem.oem_information.string, domain_comment) != 0) {
+                       if (strcmp(info->oem.oem_information.string, domain_comment) != 0) {
                                printf("QueryDomainInfo level %u returned different oem_information (comment) (%s, expected %s)\n",
-                                      levels[i], r.out.info->oem.oem_information.string, domain_comment);
+                                      levels[i], info->oem.oem_information.string, domain_comment);
                                ret = false;
                        }
                        break;
                case 6:
-                       if (!r.out.info->info6.primary.string) {
+                       if (!info->info6.primary.string) {
                                printf("QueryDomainInfo level %u returned no PDC name\n",
                                       levels[i]);
                                ret = false;
                        }
                        break;
                case 11:
-                       if (strcmp(r.out.info->general2.general.oem_information.string, domain_comment) != 0) {
+                       if (strcmp(info->general2.general.oem_information.string, domain_comment) != 0) {
                                printf("QueryDomainInfo level %u returned different comment (%s, expected %s)\n",
-                                      levels[i], r.out.info->general2.general.oem_information.string, domain_comment);
+                                      levels[i], info->general2.general.oem_information.string, domain_comment);
                                ret = false;
                        }
                        break;
@@ -3972,7 +3979,7 @@ static bool test_QueryDomainInfo(struct dcerpc_pipe *p, struct torture_context *
 
                s.in.domain_handle = handle;
                s.in.level = levels[i];
-               s.in.info = r.out.info;
+               s.in.info = info;
 
                status = dcerpc_samr_SetDomainInfo(p, tctx, &s);
                if (set_ok[i]) {
index c833f32559b95f6658a924020cc34b7f149141ca..502b879584e99927c72451942bdea1ebadd8958a 100644 (file)
@@ -305,6 +305,7 @@ static bool samsync_handle_domain(TALLOC_CTX *mem_ctx, struct samsync_state *sam
        struct netr_DELTA_DOMAIN *domain = delta->delta_union.domain;
        struct dom_sid *dom_sid;
        struct samr_QueryDomainInfo q[14]; /* q[0] will be unused simple for clarity */
+       union samr_DomainInfo *info[14];
        uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13};
        NTSTATUS nt_status;
        int i;
@@ -352,8 +353,10 @@ static bool samsync_handle_domain(TALLOC_CTX *mem_ctx, struct samsync_state *sam
               (long long)samsync_state->seq_num[database_id]);
 
        for (i=0;i<ARRAY_SIZE(levels);i++) {
+
                q[levels[i]].in.domain_handle = samsync_state->domain_handle[database_id];
                q[levels[i]].in.level = levels[i];
+               q[levels[i]].out.info = &info[levels[i]];
 
                nt_status = dcerpc_samr_QueryDomainInfo(samsync_state->p_samr, mem_ctx, &q[levels[i]]);
 
@@ -364,23 +367,23 @@ static bool samsync_handle_domain(TALLOC_CTX *mem_ctx, struct samsync_state *sam
                }
        }
 
-       TEST_STRING_EQUAL(q[5].out.info->info5.domain_name, domain->domain_name);
+       TEST_STRING_EQUAL(info[5]->info5.domain_name, domain->domain_name);
        
-       TEST_STRING_EQUAL(q[2].out.info->general.oem_information, domain->oem_information);
-       TEST_STRING_EQUAL(q[4].out.info->oem.oem_information, domain->oem_information);
-       TEST_TIME_EQUAL(q[2].out.info->general.force_logoff_time, domain->force_logoff_time);
-       TEST_TIME_EQUAL(q[3].out.info->info3.force_logoff_time, domain->force_logoff_time);
+       TEST_STRING_EQUAL(info[2]->general.oem_information, domain->oem_information);
+       TEST_STRING_EQUAL(info[4]->oem.oem_information, domain->oem_information);
+       TEST_TIME_EQUAL(info[2]->general.force_logoff_time, domain->force_logoff_time);
+       TEST_TIME_EQUAL(info[3]->info3.force_logoff_time, domain->force_logoff_time);
 
-       TEST_TIME_EQUAL(q[1].out.info->info1.min_password_length, domain->min_password_length);
-       TEST_TIME_EQUAL(q[1].out.info->info1.password_history_length, domain->password_history_length);
-       TEST_TIME_EQUAL(q[1].out.info->info1.max_password_age, domain->max_password_age);
-       TEST_TIME_EQUAL(q[1].out.info->info1.min_password_age, domain->min_password_age);
+       TEST_TIME_EQUAL(info[1]->info1.min_password_length, domain->min_password_length);
+       TEST_TIME_EQUAL(info[1]->info1.password_history_length, domain->password_history_length);
+       TEST_TIME_EQUAL(info[1]->info1.max_password_age, domain->max_password_age);
+       TEST_TIME_EQUAL(info[1]->info1.min_password_age, domain->min_password_age);
 
-       TEST_UINT64_EQUAL(q[8].out.info->info8.sequence_num, 
+       TEST_UINT64_EQUAL(info[8]->info8.sequence_num,
                        domain->sequence_num);
-       TEST_TIME_EQUAL(q[8].out.info->info8.domain_create_time, 
+       TEST_TIME_EQUAL(info[8]->info8.domain_create_time,
                        domain->domain_create_time);
-       TEST_TIME_EQUAL(q[13].out.info->info13.domain_create_time, 
+       TEST_TIME_EQUAL(info[13]->info13.domain_create_time,
                        domain->domain_create_time);
 
        TEST_SEC_DESC_EQUAL(domain->sdbuf, samr, samsync_state->domain_handle[database_id]);