#include "auth/gensec/gensec.h"
#include "param/param.h"
#include "dsdb/samdb/samdb.h"
-#include "lib/ldb_wrap.h"
-#include "torture/rpc/rpc.h"
+#include "torture/rpc/torture_rpc.h"
#include "torture/drs/proto.h"
struct DsGetinfoBindInfo {
struct dcerpc_pipe *drs_pipe;
+ struct dcerpc_binding_handle *drs_handle;
struct drsuapi_DsBind req;
struct GUID bind_guid;
struct drsuapi_DsBindInfoCtr our_bind_info_ctr;
*/
static const char *torture_get_ldap_base_dn(struct torture_context *tctx, struct dcerpc_pipe *p)
{
- const char *hostname = p->binding->target_hostname;
+ const char *hostname = dcerpc_binding_get_string_option(p->binding, "host");
struct ldb_context *ldb;
const char *ldap_url = talloc_asprintf(p, "ldap://%s", hostname);
const char *attrs[] = { "defaultNamingContext", NULL };
return NULL;
}
+ if (ldb_set_opaque(ldb, "loadparm", tctx->lp_ctx)) {
+ talloc_free(ldb);
+ return NULL;
+ }
+
+ ldb_set_modules_dir(ldb,
+ modules_path(ldb, "ldb"));
+
ret = ldb_connect(ldb, ldap_url, 0, NULL);
if (ret != LDB_SUCCESS) {
torture_comment(tctx, "Failed to make LDB connection to target");
printf("Bad binding string %s\n", binding);
return NULL;
}
- ctx->drsuapi_binding->flags |= DCERPC_SIGN | DCERPC_SEAL;
+ status = dcerpc_binding_set_flags(ctx->drsuapi_binding, DCERPC_SIGN | DCERPC_SEAL, 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("dcerpc_binding_set_flags - %s\n", nt_errstr(status));
+ return NULL;
+ }
/* ctx->admin ...*/
ctx->admin.credentials = cmdline_credentials;
printf("Failed to connect to server as a BDC: %s\n", nt_errstr(status));
return false;
}
+ b->drs_handle = b->drs_pipe->binding_handle;
- status = dcerpc_drsuapi_DsBind(b->drs_pipe, ctx, &b->req);
+ status = dcerpc_drsuapi_DsBind_r(b->drs_handle, ctx, &b->req);
if (!NT_STATUS_IS_OK(status)) {
const char *errstr = nt_errstr(status);
- if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
- errstr = dcerpc_errstr(ctx, b->drs_pipe->last_fault_code);
- }
printf("dcerpc_drsuapi_DsBind failed - %s\n", errstr);
ret = false;
} else if (!W_ERROR_IS_OK(b->req.out.result)) {
b->peer_bind_info28.repl_epoch = 0;
break;
}
+ case 28: {
+ b->peer_bind_info28 = b->req.out.bind_info->info.info28;
+ break;
+ }
+ case 32: {
+ struct drsuapi_DsBindInfo32 *info32;
+ info32 = &b->req.out.bind_info->info.info32;
+ b->peer_bind_info28.supported_extensions= info32->supported_extensions;
+ b->peer_bind_info28.site_guid = info32->site_guid;
+ b->peer_bind_info28.pid = info32->pid;
+ b->peer_bind_info28.repl_epoch = info32->repl_epoch;
+ break;
+ }
case 48: {
struct drsuapi_DsBindInfo48 *info48;
info48 = &b->req.out.bind_info->info.info48;
b->peer_bind_info28.repl_epoch = info48->repl_epoch;
break;
}
- case 28:
- b->peer_bind_info28 = b->req.out.bind_info->info.info28;
+ case 52: {
+ struct drsuapi_DsBindInfo52 *info52;
+ info52 = &b->req.out.bind_info->info.info52;
+ b->peer_bind_info28.supported_extensions= info52->supported_extensions;
+ b->peer_bind_info28.site_guid = info52->site_guid;
+ b->peer_bind_info28.pid = info52->pid;
+ b->peer_bind_info28.repl_epoch = info52->repl_epoch;
break;
+ }
default:
printf("DsBind - warning: unknown BindInfo length: %u\n",
b->req.out.bind_info->length);
{
NTSTATUS status;
struct dcerpc_pipe *p = ctx->admin.drsuapi.drs_pipe;
+ struct dcerpc_binding_handle *b = ctx->admin.drsuapi.drs_handle;
struct drsuapi_DsReplicaGetInfo r;
union drsuapi_DsReplicaGetInfoRequest req;
union drsuapi_DsReplicaInfo info;
for (i=0; i < ARRAY_SIZE(array); i++) {
const char *object_dn;
- torture_comment(tctx, "testing DsReplicaGetInfo level %d infotype %d\n",
+ torture_comment(tctx, "Testing DsReplicaGetInfo level %d infotype %d\n",
array[i].level, array[i].infotype);
if (array[i].obj_dn) {
r.out.info = &info;
r.out.info_type = &info_type;
- status = dcerpc_drsuapi_DsReplicaGetInfo(p, tctx, &r);
-
+ status = dcerpc_drsuapi_DsReplicaGetInfo_r(b, tctx, &r);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_ENUM_VALUE_OUT_OF_RANGE)) {
+ torture_comment(tctx,
+ "DsReplicaGetInfo level %d and/or infotype %d not supported by server\n",
+ array[i].level, array[i].infotype);
+ continue;
+ }
+ torture_assert_ntstatus_ok(tctx, status, talloc_asprintf(tctx,
+ "DsReplicaGetInfo level %d and/or infotype %d failed\n",
+ array[i].level, array[i].infotype));
if (W_ERROR_EQUAL(r.out.result, WERR_INVALID_LEVEL)) {
/* this is a not yet supported level */
torture_comment(tctx,
"DsReplicaGetInfo level %d and/or infotype %d not yet supported by server\n",
array[i].level, array[i].infotype);
invalid_levels++;
- } else if (!NT_STATUS_IS_OK(status) && p->last_fault_code == DCERPC_FAULT_INVALID_TAG) {
- torture_comment(tctx,
- "DsReplicaGetInfo level %d and/or infotype %d not supported by server\n",
- array[i].level, array[i].infotype);
- }/* else {
- torture_drsuapi_assert_call(tctx, p, status, &r, "dcerpc_drsuapi_DsReplicaGetInfo");
- }*/
+ continue;
+ }
+
+ torture_drsuapi_assert_call(tctx, p, status, &r, "dcerpc_drsuapi_DsReplicaGetInfo");
}
if (invalid_levels > 0) {
/* Unbing admin handle */
r.in.bind_handle = &ctx->admin.drsuapi.bind_handle;
- dcerpc_drsuapi_DsUnbind(ctx->admin.drsuapi.drs_pipe, ctx, &r);
+ dcerpc_drsuapi_DsUnbind_r(ctx->admin.drsuapi.drs_handle, ctx, &r);
talloc_free(ctx);
void torture_drs_rpc_dsgetinfo_tcase(struct torture_suite *suite)
{
typedef bool (*run_func) (struct torture_context *test, void *tcase_data);
-
- struct torture_test *test;
- struct torture_tcase *tcase = torture_suite_add_tcase(suite, "DSGETINFO");
+ struct torture_tcase *tcase = torture_suite_add_tcase(suite, "dsgetinfo");
torture_tcase_set_fixture(tcase,
torture_dsgetinfo_tcase_setup,
torture_dsgetinfo_tcase_teardown);
- test = torture_tcase_add_simple_test(tcase, "DsGetReplicaInfo", (run_func)test_getinfo);
+ torture_tcase_add_simple_test(tcase, "DsGetReplicaInfo", (run_func)test_getinfo);
}