/*
- lsa_OpenPolicy
+ lsa_OpenPolicy2
*/
-static NTSTATUS lsa_OpenPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct lsa_OpenPolicy *r)
+static NTSTATUS lsa_OpenPolicy2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct lsa_OpenPolicy2 *r)
{
struct lsa_policy_state *state;
struct dcesrv_handle *handle;
return NT_STATUS_OK;
}
+/*
+ lsa_OpenPolicy
+ a wrapper around lsa_OpenPolicy2
+*/
+static NTSTATUS lsa_OpenPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct lsa_OpenPolicy *r)
+{
+ struct lsa_OpenPolicy2 r2;
+
+ r2.in.system_name = NULL;
+ r2.in.attr = r->in.attr;
+ r2.in.access_mask = r->in.access_mask;
+ r2.out.handle = r->out.handle;
+
+ return lsa_OpenPolicy2(dce_call, mem_ctx, &r2);
+}
+
+
+
/*
fill in the AccountDomain info
return NT_STATUS_OK;
}
+/*
+ fill in the DNS domain info
+*/
+static NTSTATUS lsa_info_DNS(struct lsa_policy_state *state, TALLOC_CTX *mem_ctx,
+ struct lsa_DnsDomainInfo *info)
+{
+ const char * const attrs[] = { "name", "dnsDomain", "objectGUID", "objectSid", NULL };
+ int ret;
+ struct ldb_message **res;
+
+ ret = samdb_search(state->sam_ctx, mem_ctx, NULL, &res, attrs,
+ "dn=%s", state->domain_dn);
+ if (ret != 1) {
+ return NT_STATUS_INTERNAL_DB_CORRUPTION;
+ }
+
+ info->name.name = samdb_result_string(res[0], "name", NULL);
+ info->dns_domain.name = samdb_result_string(res[0], "dnsDomain", NULL);
+ info->dns_forest.name = samdb_result_string(res[0], "dnsDomain", NULL);
+ info->domain_guid = samdb_result_guid(res[0], "objectGUID");
+ info->sid = samdb_result_dom_sid(mem_ctx, res[0], "objectSid");
+
+ return NT_STATUS_OK;
+}
+
/*
- lsa_QueryInfoPolicy
+ lsa_QueryInfoPolicy2
*/
-static NTSTATUS lsa_QueryInfoPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct lsa_QueryInfoPolicy *r)
+static NTSTATUS lsa_QueryInfoPolicy2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct lsa_QueryInfoPolicy2 *r)
{
struct lsa_policy_state *state;
struct dcesrv_handle *h;
ZERO_STRUCTP(r->out.info);
switch (r->in.level) {
+ case LSA_POLICY_INFO_DOMAIN:
case LSA_POLICY_INFO_ACCOUNT_DOMAIN:
return lsa_info_AccountDomain(state, mem_ctx, &r->out.info->account_domain);
+
+ case LSA_POLICY_INFO_DNS:
+ return lsa_info_DNS(state, mem_ctx, &r->out.info->dns);
}
return NT_STATUS_INVALID_INFO_CLASS;
}
+/*
+ lsa_QueryInfoPolicy
+*/
+static NTSTATUS lsa_QueryInfoPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct lsa_QueryInfoPolicy *r)
+{
+ struct lsa_QueryInfoPolicy2 r2;
+ NTSTATUS status;
+
+ r2.in.handle = r->in.handle;
+ r2.in.level = r->in.level;
+
+ status = lsa_QueryInfoPolicy2(dce_call, mem_ctx, &r2);
+
+ r->out.info = r2.out.info;
+
+ return status;
+}
/*
lsa_SetInfoPolicy
}
-/*
- lsa_OpenPolicy2
-*/
-static NTSTATUS lsa_OpenPolicy2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct lsa_OpenPolicy2 *r)
-{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
-}
-
-
/*
UNK_GET_CONNUSER
*/
}
-/*
- QUERYINFO2
-*/
-static NTSTATUS QUERYINFO2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct QUERYINFO2 *r)
-{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
-}
-
-
/* include the generated boilerplate */
#include "librpc/gen_ndr/ndr_lsa_s.c"
return ret;
}
+static BOOL test_QueryInfoPolicy2(struct dcerpc_pipe *p,
+ TALLOC_CTX *mem_ctx,
+ struct policy_handle *handle)
+{
+ struct lsa_QueryInfoPolicy2 r;
+ NTSTATUS status;
+ int i;
+ BOOL ret = True;
+ printf("\nTesting QueryInfoPolicy2\n");
+
+ for (i=1;i<13;i++) {
+ r.in.handle = handle;
+ r.in.level = i;
+
+ printf("\ntrying QueryInfoPolicy2 level %d\n", i);
+
+ status = dcerpc_lsa_QueryInfoPolicy2(p, mem_ctx, &r);
+
+ if ((i == 9 || i == 10 || i == 11) &&
+ NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
+ printf("server failed level %u (OK)\n", i);
+ continue;
+ }
+
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("QueryInfoPolicy2 failed - %s\n", nt_errstr(status));
+ ret = False;
+ continue;
+ }
+ }
+
+ return ret;
+}
+
static BOOL test_Close(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx,
struct policy_handle *handle)
if (!test_QueryInfoPolicy(p, mem_ctx, &handle)) {
ret = False;
}
+
+ if (!test_QueryInfoPolicy2(p, mem_ctx, &handle)) {
+ ret = False;
+ }
#if 0
if (!test_Delete(p, mem_ctx, &handle)) {