1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

s4-samr: merge samr_QueryDisplayInfo from s3 idl. (fixme: python)

Guenther
This commit is contained in:
Günther Deschner 2008-11-05 12:32:24 +01:00
parent 3a9b42fa75
commit aaca059a35
3 changed files with 79 additions and 64 deletions

View File

@ -1118,9 +1118,9 @@ import "misc.idl", "lsa.idl", "security.idl";
[in] uint32 start_idx,
[in] uint32 max_entries,
[in] uint32 buf_size,
[out] uint32 total_size,
[out] uint32 returned_size,
[out,switch_is(level)] samr_DispInfo info
[out,ref] uint32 *total_size,
[out,ref] uint32 *returned_size,
[out,ref,switch_is(level)] samr_DispInfo *info
);

View File

@ -3829,65 +3829,65 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo(struct dcesrv_call_state *dce_call,
count += 1;
}
r->out.total_size = count;
*r->out.total_size = count;
if (r->in.start_idx >= count) {
r->out.returned_size = 0;
*r->out.returned_size = 0;
switch(r->in.level) {
case 1:
r->out.info.info1.count = r->out.returned_size;
r->out.info.info1.entries = NULL;
r->out.info->info1.count = *r->out.returned_size;
r->out.info->info1.entries = NULL;
break;
case 2:
r->out.info.info2.count = r->out.returned_size;
r->out.info.info2.entries = NULL;
r->out.info->info2.count = *r->out.returned_size;
r->out.info->info2.entries = NULL;
break;
case 3:
r->out.info.info3.count = r->out.returned_size;
r->out.info.info3.entries = NULL;
r->out.info->info3.count = *r->out.returned_size;
r->out.info->info3.entries = NULL;
break;
case 4:
r->out.info.info4.count = r->out.returned_size;
r->out.info.info4.entries = NULL;
r->out.info->info4.count = *r->out.returned_size;
r->out.info->info4.entries = NULL;
break;
case 5:
r->out.info.info5.count = r->out.returned_size;
r->out.info.info5.entries = NULL;
r->out.info->info5.count = *r->out.returned_size;
r->out.info->info5.entries = NULL;
break;
}
} else {
r->out.returned_size = MIN(count - r->in.start_idx,
*r->out.returned_size = MIN(count - r->in.start_idx,
r->in.max_entries);
switch(r->in.level) {
case 1:
r->out.info.info1.count = r->out.returned_size;
r->out.info.info1.entries =
r->out.info->info1.count = *r->out.returned_size;
r->out.info->info1.entries =
&(entriesGeneral[r->in.start_idx]);
break;
case 2:
r->out.info.info2.count = r->out.returned_size;
r->out.info.info2.entries =
r->out.info->info2.count = *r->out.returned_size;
r->out.info->info2.entries =
&(entriesFull[r->in.start_idx]);
break;
case 3:
r->out.info.info3.count = r->out.returned_size;
r->out.info.info3.entries =
r->out.info->info3.count = *r->out.returned_size;
r->out.info->info3.entries =
&(entriesFullGroup[r->in.start_idx]);
break;
case 4:
r->out.info.info4.count = r->out.returned_size;
r->out.info.info4.entries =
r->out.info->info4.count = *r->out.returned_size;
r->out.info->info4.entries =
&(entriesAscii[r->in.start_idx]);
break;
case 5:
r->out.info.info5.count = r->out.returned_size;
r->out.info.info5.entries =
r->out.info->info5.count = *r->out.returned_size;
r->out.info->info5.entries =
&(entriesAscii[r->in.start_idx]);
break;
}
}
return (r->out.returned_size < (count - r->in.start_idx)) ?
return (*r->out.returned_size < (count - r->in.start_idx)) ?
STATUS_MORE_ENTRIES : NT_STATUS_OK;
}
@ -4074,14 +4074,12 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo2(struct dcesrv_call_state *dce_call
q.in.start_idx = r->in.start_idx;
q.in.max_entries = r->in.max_entries;
q.in.buf_size = r->in.buf_size;
ZERO_STRUCT(q.out);
q.out.total_size = r->out.total_size;
q.out.returned_size = r->out.returned_size;
q.out.info = r->out.info;
result = dcesrv_samr_QueryDisplayInfo(dce_call, mem_ctx, &q);
*r->out.total_size = q.out.total_size;
*r->out.returned_size = q.out.returned_size;
*r->out.info = q.out.info;
return result;
}
@ -4110,14 +4108,12 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo3(struct dcesrv_call_state *dce_call
q.in.start_idx = r->in.start_idx;
q.in.max_entries = r->in.max_entries;
q.in.buf_size = r->in.buf_size;
ZERO_STRUCT(q.out);
q.out.total_size = r->out.total_size;
q.out.returned_size = r->out.returned_size;
q.out.info = r->out.info;
result = dcesrv_samr_QueryDisplayInfo(dce_call, mem_ctx, &q);
*r->out.total_size = q.out.total_size;
*r->out.returned_size = q.out.returned_size;
*r->out.info = q.out.info;
return result;
}

View File

@ -3605,16 +3605,16 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
for (i = 0; ; i++) {
switch (querydisplayinfo->in.level) {
case 1:
if (i >= querydisplayinfo->out.info.info1.count) {
if (i >= querydisplayinfo->out.info->info1.count) {
return ret;
}
r.in.rid = querydisplayinfo->out.info.info1.entries[i].rid;
r.in.rid = querydisplayinfo->out.info->info1.entries[i].rid;
break;
case 2:
if (i >= querydisplayinfo->out.info.info2.count) {
if (i >= querydisplayinfo->out.info->info2.count) {
return ret;
}
r.in.rid = querydisplayinfo->out.info.info2.entries[i].rid;
r.in.rid = querydisplayinfo->out.info->info2.entries[i].rid;
break;
case 3:
/* Groups */
@ -3649,29 +3649,29 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
if (seen_testuser && strcmp(q.out.info->info21.account_name.string, TEST_ACCOUNT_NAME) == 0) {
*seen_testuser = true;
}
STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].full_name,
STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].full_name,
q.out.info->info21.full_name, q.out.info->info21.account_name);
STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].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);
STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].description,
STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].description,
q.out.info->info21.description, q.out.info->info21.account_name);
INT_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].rid,
INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].rid,
q.out.info->info21.rid, q.out.info->info21.account_name);
INT_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].acct_flags,
INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].acct_flags,
q.out.info->info21.acct_flags, q.out.info->info21.account_name);
break;
case 2:
STRING_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].account_name,
STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].account_name,
q.out.info->info21.account_name, q.out.info->info21.account_name);
STRING_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].description,
STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].description,
q.out.info->info21.description, q.out.info->info21.account_name);
INT_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].rid,
INT_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].rid,
q.out.info->info21.rid, q.out.info->info21.account_name);
INT_EQUAL_QUERY((querydisplayinfo->out.info.info2.entries[i].acct_flags & ~ACB_NORMAL),
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);
if (!(querydisplayinfo->out.info.info2.entries[i].acct_flags & ACB_NORMAL)) {
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);
}
@ -3679,7 +3679,7 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
if (!(q.out.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,
querydisplayinfo->out.info.info2.entries[i].acct_flags,
querydisplayinfo->out.info->info2.entries[i].acct_flags,
q.out.info->info21.acct_flags);
return false;
}
@ -3705,6 +3705,10 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
uint16_t levels[] = {1, 2, 3, 4, 5};
int i;
bool seen_testuser = false;
uint32_t total_size;
uint32_t returned_size;
union samr_DispInfo disp_info;
for (i=0;i<ARRAY_SIZE(levels);i++) {
printf("Testing QueryDisplayInfo level %u\n", levels[i]);
@ -3716,6 +3720,9 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
r.in.level = levels[i];
r.in.max_entries = 2;
r.in.buf_size = (uint32_t)-1;
r.out.total_size = &total_size;
r.out.returned_size = &returned_size;
r.out.info = &disp_info;
status = dcerpc_samr_QueryDisplayInfo(p, mem_ctx, &r);
if (!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES) && !NT_STATUS_IS_OK(status)) {
@ -3728,22 +3735,22 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
if (!test_each_DisplayInfo_user(p, mem_ctx, &r, &seen_testuser)) {
ret = false;
}
r.in.start_idx += r.out.info.info1.count;
r.in.start_idx += r.out.info->info1.count;
break;
case 2:
if (!test_each_DisplayInfo_user(p, mem_ctx, &r, NULL)) {
ret = false;
}
r.in.start_idx += r.out.info.info2.count;
r.in.start_idx += r.out.info->info2.count;
break;
case 3:
r.in.start_idx += r.out.info.info3.count;
r.in.start_idx += r.out.info->info3.count;
break;
case 4:
r.in.start_idx += r.out.info.info4.count;
r.in.start_idx += r.out.info->info4.count;
break;
case 5:
r.in.start_idx += r.out.info.info5.count;
r.in.start_idx += r.out.info->info5.count;
break;
}
}
@ -3872,6 +3879,9 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
NTSTATUS status;
struct samr_QueryDisplayInfo r;
bool ret = true;
uint32_t total_size;
uint32_t returned_size;
union samr_DispInfo info;
printf("Testing QueryDisplayInfo continuation\n");
@ -3880,14 +3890,17 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
r.in.start_idx = 0;
r.in.max_entries = 1;
r.in.buf_size = (uint32_t)-1;
r.out.total_size = &total_size;
r.out.returned_size = &returned_size;
r.out.info = &info;
do {
status = dcerpc_samr_QueryDisplayInfo(p, mem_ctx, &r);
if (NT_STATUS_IS_OK(status) && r.out.returned_size != 0) {
if (r.out.info.info1.entries[0].idx != r.in.start_idx + 1) {
if (NT_STATUS_IS_OK(status) && *r.out.returned_size != 0) {
if (r.out.info->info1.entries[0].idx != r.in.start_idx + 1) {
printf("expected idx %d but got %d\n",
r.in.start_idx + 1,
r.out.info.info1.entries[0].idx);
r.out.info->info1.entries[0].idx);
break;
}
}
@ -3901,7 +3914,7 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
r.in.start_idx++;
} while ((NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES) ||
NT_STATUS_IS_OK(status)) &&
r.out.returned_size != 0);
*r.out.returned_size != 0);
return ret;
}
@ -4065,6 +4078,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
uint32_t resume_handle=0;
int i;
bool ret = true;
uint32_t total_size;
uint32_t returned_size;
union samr_DispInfo info;
int num_names = 0;
const char **names = NULL;
@ -4100,6 +4116,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
q2.in.start_idx = 0;
q2.in.max_entries = 5;
q2.in.buf_size = (uint32_t)-1;
q2.out.total_size = &total_size;
q2.out.returned_size = &returned_size;
q2.out.info = &info;
status = STATUS_MORE_ENTRIES;
while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
@ -4109,9 +4128,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES))
break;
for (i=0; i<q2.out.info.info5.count; i++) {
for (i=0; i<q2.out.info->info5.count; i++) {
int j;
const char *name = q2.out.info.info5.entries[i].account_name.string;
const char *name = q2.out.info->info5.entries[i].account_name.string;
bool found = false;
for (j=0; j<num_names; j++) {
if (names[j] == NULL)
@ -4129,7 +4148,7 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
ret = false;
}
}
q2.in.start_idx += q2.out.info.info5.count;
q2.in.start_idx += q2.out.info->info5.count;
}
if (!NT_STATUS_IS_OK(status)) {