mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
s4-samr: merge samr_EnumDomainUsers from s3 idl. (fixme: python)
Guenther
This commit is contained in:
parent
d4d9a73ad1
commit
1ea97d76ed
@ -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
|
||||
);
|
||||
|
||||
/************************/
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user