mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
s4-samr: merge samr_EnumDomains from s3 idl. (fixme: python)
Guenther
This commit is contained in:
parent
bb1d7684d2
commit
d4d9a73ad1
@ -284,11 +284,11 @@ import "misc.idl", "lsa.idl", "security.idl";
|
|||||||
} samr_SamArray;
|
} samr_SamArray;
|
||||||
|
|
||||||
NTSTATUS samr_EnumDomains (
|
NTSTATUS samr_EnumDomains (
|
||||||
[in,ref] policy_handle *connect_handle,
|
[in] policy_handle *connect_handle,
|
||||||
[in,out,ref] uint32 *resume_handle,
|
[in,out,ref] uint32 *resume_handle,
|
||||||
|
[out,ref] samr_SamArray **sam,
|
||||||
[in] uint32 buf_size,
|
[in] uint32 buf_size,
|
||||||
[out,unique] samr_SamArray *sam,
|
[out,ref] uint32 *num_entries
|
||||||
[out] uint32 num_entries
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1001,6 +1001,10 @@ static void continue_samr_connect(struct rpc_request *req)
|
|||||||
s->enumdom.in.resume_handle = &s->resume_handle;
|
s->enumdom.in.resume_handle = &s->resume_handle;
|
||||||
s->enumdom.in.buf_size = s->buf_size;
|
s->enumdom.in.buf_size = s->buf_size;
|
||||||
s->enumdom.out.resume_handle = &s->resume_handle;
|
s->enumdom.out.resume_handle = &s->resume_handle;
|
||||||
|
s->enumdom.out.num_entries = talloc(s, uint32_t);
|
||||||
|
if (composite_nomem(s->enumdom.out.num_entries, c)) return;
|
||||||
|
s->enumdom.out.sam = talloc(s, struct samr_SamArray *);
|
||||||
|
if (composite_nomem(s->enumdom.out.sam, c)) return;
|
||||||
|
|
||||||
enumdom_req = dcerpc_samr_EnumDomains_send(s->ctx->samr.pipe, c, &s->enumdom);
|
enumdom_req = dcerpc_samr_EnumDomains_send(s->ctx->samr.pipe, c, &s->enumdom);
|
||||||
if (composite_nomem(enumdom_req, c)) return;
|
if (composite_nomem(enumdom_req, c)) return;
|
||||||
@ -1116,16 +1120,16 @@ static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_lis
|
|||||||
/* prepare domains array */
|
/* prepare domains array */
|
||||||
if (s->domains == NULL) {
|
if (s->domains == NULL) {
|
||||||
s->domains = talloc_array(mem_ctx, struct domainlist,
|
s->domains = talloc_array(mem_ctx, struct domainlist,
|
||||||
s->enumdom.out.num_entries);
|
*s->enumdom.out.num_entries);
|
||||||
} else {
|
} else {
|
||||||
s->domains = talloc_realloc(mem_ctx, s->domains, struct domainlist,
|
s->domains = talloc_realloc(mem_ctx, s->domains, struct domainlist,
|
||||||
s->count + s->enumdom.out.num_entries);
|
s->count + *s->enumdom.out.num_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy domain names returned from samr_EnumDomains call */
|
/* copy domain names returned from samr_EnumDomains call */
|
||||||
for (i = s->count; i < s->count + s->enumdom.out.num_entries; i++)
|
for (i = s->count; i < s->count + *s->enumdom.out.num_entries; i++)
|
||||||
{
|
{
|
||||||
struct lsa_String *domain_name = &s->enumdom.out.sam->entries[i - s->count].name;
|
struct lsa_String *domain_name = &(*s->enumdom.out.sam)->entries[i - s->count].name;
|
||||||
|
|
||||||
/* strdup name as a child of allocated array to make it follow the array
|
/* strdup name as a child of allocated array to make it follow the array
|
||||||
in case of talloc_steal or talloc_free */
|
in case of talloc_steal or talloc_free */
|
||||||
@ -1134,7 +1138,7 @@ static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_lis
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* number of entries returned (domains enumerated) */
|
/* number of entries returned (domains enumerated) */
|
||||||
s->count += s->enumdom.out.num_entries;
|
s->count += *s->enumdom.out.num_entries;
|
||||||
|
|
||||||
return s->domains;
|
return s->domains;
|
||||||
}
|
}
|
||||||
|
@ -344,8 +344,8 @@ static NTSTATUS dcesrv_samr_EnumDomains(struct dcesrv_call_state *dce_call, TALL
|
|||||||
struct ldb_dn *partitions_basedn;
|
struct ldb_dn *partitions_basedn;
|
||||||
|
|
||||||
*r->out.resume_handle = 0;
|
*r->out.resume_handle = 0;
|
||||||
r->out.sam = NULL;
|
*r->out.sam = NULL;
|
||||||
r->out.num_entries = 0;
|
*r->out.num_entries = 0;
|
||||||
|
|
||||||
DCESRV_PULL_HANDLE(h, r->in.connect_handle, SAMR_HANDLE_CONNECT);
|
DCESRV_PULL_HANDLE(h, r->in.connect_handle, SAMR_HANDLE_CONNECT);
|
||||||
|
|
||||||
@ -401,9 +401,9 @@ static NTSTATUS dcesrv_samr_EnumDomains(struct dcesrv_call_state *dce_call, TALL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r->out.sam = array;
|
*r->out.sam = array;
|
||||||
r->out.num_entries = i;
|
*r->out.num_entries = i;
|
||||||
array->count = r->out.num_entries;
|
array->count = *r->out.num_entries;
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
@ -365,6 +365,8 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
|
|||||||
struct samr_Connect2 conn;
|
struct samr_Connect2 conn;
|
||||||
struct samr_EnumDomains enumdom;
|
struct samr_EnumDomains enumdom;
|
||||||
uint32_t resume_handle = 0;
|
uint32_t resume_handle = 0;
|
||||||
|
uint32_t num_entries = 0;
|
||||||
|
struct samr_SamArray *sam = NULL;
|
||||||
struct samr_LookupDomain l;
|
struct samr_LookupDomain l;
|
||||||
struct dom_sid2 *sid = NULL;
|
struct dom_sid2 *sid = NULL;
|
||||||
int dom_idx;
|
int dom_idx;
|
||||||
@ -424,6 +426,8 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
|
|||||||
enumdom.in.resume_handle = &resume_handle;
|
enumdom.in.resume_handle = &resume_handle;
|
||||||
enumdom.in.buf_size = (uint32_t)-1;
|
enumdom.in.buf_size = (uint32_t)-1;
|
||||||
enumdom.out.resume_handle = &resume_handle;
|
enumdom.out.resume_handle = &resume_handle;
|
||||||
|
enumdom.out.num_entries = &num_entries;
|
||||||
|
enumdom.out.sam = &sam;
|
||||||
|
|
||||||
status = dcerpc_samr_EnumDomains(samr_pipe, mem_ctx, &enumdom);
|
status = dcerpc_samr_EnumDomains(samr_pipe, mem_ctx, &enumdom);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
@ -431,18 +435,18 @@ static NTSTATUS get_usr_handle(struct smbcli_state *cli,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enumdom.out.num_entries != 2) {
|
if (*enumdom.out.num_entries != 2) {
|
||||||
d_printf("samr_EnumDomains returned %d entries, expected 2\n",
|
d_printf("samr_EnumDomains returned %d entries, expected 2\n",
|
||||||
enumdom.out.num_entries);
|
*enumdom.out.num_entries);
|
||||||
status = NT_STATUS_UNSUCCESSFUL;
|
status = NT_STATUS_UNSUCCESSFUL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
dom_idx = strequal(enumdom.out.sam->entries[0].name.string,
|
dom_idx = strequal(sam->entries[0].name.string,
|
||||||
"builtin") ? 1:0;
|
"builtin") ? 1:0;
|
||||||
|
|
||||||
l.in.connect_handle = &conn_handle;
|
l.in.connect_handle = &conn_handle;
|
||||||
domain_name.string = enumdom.out.sam->entries[dom_idx].name.string;
|
domain_name.string = sam->entries[dom_idx].name.string;
|
||||||
*domain = talloc_strdup(mem_ctx, domain_name.string);
|
*domain = talloc_strdup(mem_ctx, domain_name.string);
|
||||||
l.in.domain_name = &domain_name;
|
l.in.domain_name = &domain_name;
|
||||||
l.out.sid = &sid;
|
l.out.sid = &sid;
|
||||||
|
@ -4585,6 +4585,8 @@ static bool test_EnumDomains(struct dcerpc_pipe *p, struct torture_context *tctx
|
|||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct samr_EnumDomains r;
|
struct samr_EnumDomains r;
|
||||||
uint32_t resume_handle = 0;
|
uint32_t resume_handle = 0;
|
||||||
|
uint32_t num_entries = 0;
|
||||||
|
struct samr_SamArray *sam = NULL;
|
||||||
int i;
|
int i;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
@ -4592,17 +4594,19 @@ static bool test_EnumDomains(struct dcerpc_pipe *p, struct torture_context *tctx
|
|||||||
r.in.resume_handle = &resume_handle;
|
r.in.resume_handle = &resume_handle;
|
||||||
r.in.buf_size = (uint32_t)-1;
|
r.in.buf_size = (uint32_t)-1;
|
||||||
r.out.resume_handle = &resume_handle;
|
r.out.resume_handle = &resume_handle;
|
||||||
|
r.out.num_entries = &num_entries;
|
||||||
|
r.out.sam = &sam;
|
||||||
|
|
||||||
status = dcerpc_samr_EnumDomains(p, tctx, &r);
|
status = dcerpc_samr_EnumDomains(p, tctx, &r);
|
||||||
torture_assert_ntstatus_ok(tctx, status, "EnumDomains");
|
torture_assert_ntstatus_ok(tctx, status, "EnumDomains");
|
||||||
|
|
||||||
if (!r.out.sam) {
|
if (!*r.out.sam) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0;i<r.out.sam->count;i++) {
|
for (i=0;i<sam->count;i++) {
|
||||||
if (!test_LookupDomain(p, tctx, handle,
|
if (!test_LookupDomain(p, tctx, handle,
|
||||||
r.out.sam->entries[i].name.string, which_ops)) {
|
sam->entries[i].name.string, which_ops)) {
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,6 +149,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
|
|||||||
int i;
|
int i;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
uint32_t resume_handle = 0;
|
uint32_t resume_handle = 0;
|
||||||
|
struct samr_SamArray *sam = NULL;
|
||||||
|
uint32_t num_entries = 0;
|
||||||
|
|
||||||
printf("testing which bits in Connect5 accessmask allows us to EnumDomains\n");
|
printf("testing which bits in Connect5 accessmask allows us to EnumDomains\n");
|
||||||
mask = 1;
|
mask = 1;
|
||||||
@ -172,6 +174,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
|
|||||||
ed.in.resume_handle = &resume_handle;
|
ed.in.resume_handle = &resume_handle;
|
||||||
ed.in.buf_size = (uint32_t)-1;
|
ed.in.buf_size = (uint32_t)-1;
|
||||||
ed.out.resume_handle = &resume_handle;
|
ed.out.resume_handle = &resume_handle;
|
||||||
|
ed.out.num_entries = &num_entries;
|
||||||
|
ed.out.sam = &sam;
|
||||||
|
|
||||||
status = dcerpc_samr_EnumDomains(p, tctx, &ed);
|
status = dcerpc_samr_EnumDomains(p, tctx, &ed);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
@ -197,6 +201,8 @@ static bool test_samr_accessmask_EnumDomains(struct torture_context *tctx,
|
|||||||
ed.in.resume_handle = &resume_handle;
|
ed.in.resume_handle = &resume_handle;
|
||||||
ed.in.buf_size = (uint32_t)-1;
|
ed.in.buf_size = (uint32_t)-1;
|
||||||
ed.out.resume_handle = &resume_handle;
|
ed.out.resume_handle = &resume_handle;
|
||||||
|
ed.out.num_entries = &num_entries;
|
||||||
|
ed.out.sam = &sam;
|
||||||
|
|
||||||
status = dcerpc_samr_EnumDomains(p, tctx, &ed);
|
status = dcerpc_samr_EnumDomains(p, tctx, &ed);
|
||||||
if(!NT_STATUS_EQUAL(NT_STATUS_ACCESS_DENIED, status)) {
|
if(!NT_STATUS_EQUAL(NT_STATUS_ACCESS_DENIED, status)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user