From a2e65a2addb38ebf57c04b83ae9a2312233d78b7 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 25 Mar 2010 13:17:05 +0100 Subject: s3-selftest: add RAP-RPC testsuite for crosschecking RAP and DCERPC calls. Guenther --- source4/torture/config.mk | 2 +- source4/torture/rap/rap.c | 1 + source4/torture/rap/rpc.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 source4/torture/rap/rpc.c (limited to 'source4') diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 56bfa9cb4f..3315865cec 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -140,7 +140,7 @@ PRIVATE_DEPENDENCIES = TORTURE_UTIL LIBCLI_SMB # End SUBSYSTEM TORTURE_RAP ################################# -TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o +TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o $(torturesrcdir)/rap/rpc.o $(eval $(call proto_header_template,$(torturesrcdir)/rap/proto.h,$(TORTURE_RAP_OBJ_FILES:.o=.c))) diff --git a/source4/torture/rap/rap.c b/source4/torture/rap/rap.c index 78fc6a410d..53966afa96 100644 --- a/source4/torture/rap/rap.c +++ b/source4/torture/rap/rap.c @@ -551,6 +551,7 @@ NTSTATUS torture_rap_init(void) struct torture_suite *suite_basic = torture_suite_create(suite, "BASIC"); torture_suite_add_suite(suite, suite_basic); + torture_suite_add_suite(suite, torture_rap_rpc(suite)); torture_suite_add_1smb_test(suite_basic, "netserverenum", test_netserverenum); diff --git a/source4/torture/rap/rpc.c b/source4/torture/rap/rpc.c new file mode 100644 index 0000000000..68a106278d --- /dev/null +++ b/source4/torture/rap/rpc.c @@ -0,0 +1,104 @@ +/* + Unix SMB/CIFS implementation. + test suite for RAP / DCERPC consistency + Copyright (C) Guenther Deschner 2010 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "libcli/libcli.h" +#include "torture/smbtorture.h" +#include "torture/util.h" +#include "libcli/rap/rap.h" +#include "torture/rap/proto.h" +#include "param/param.h" +#include "torture/rpc/rpc.h" +#include "librpc/gen_ndr/ndr_srvsvc_c.h" + +static bool test_rpc_netservergetinfo(struct torture_context *tctx, + struct smbcli_state *cli) +{ + struct rap_WserverGetInfo r; + struct dcerpc_pipe *p; + struct dcerpc_binding_handle *b; + struct srvsvc_NetSrvGetInfo s; + union srvsvc_NetSrvInfo info; + + const char *server_name; + + torture_assert_ntstatus_ok(tctx, + torture_rpc_connection(tctx, &p, &ndr_table_srvsvc), + "failed to open srvsvc"); + + b = p->binding_handle; + + s.in.server_unc = NULL; + s.in.level = 101; + s.out.info = &info; + + torture_assert_ntstatus_ok(tctx, + dcerpc_srvsvc_NetSrvGetInfo_r(b, tctx, &s), + "srvsvc_NetSrvGetInfo level 101 failed"); + torture_assert_werr_ok(tctx, s.out.result, + "srvsvc_NetSrvGetInfo level 101 failed"); + + r.in.bufsize = 0xffff; + r.in.level = 0; + + torture_assert_ntstatus_ok(tctx, + smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), + "rap_netservergetinfo level 0 failed"); + torture_assert_int_equal(tctx, r.out.status, 0, + "rap_netservergetinfo level 0 failed"); + + server_name = talloc_strndup(tctx, info.info101->server_name, 16); + + torture_assert_str_equal(tctx, r.out.info.info0.name, server_name, "server name"); + + if (torture_setting_bool(tctx, "samba3", false)) { + torture_skip(tctx, "skipping netservergetinfo level 1 against samba3"); + } + + r.in.level = 1; + + torture_assert_ntstatus_ok(tctx, + smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), + "rap_netservergetinfo level 1 failed"); + torture_assert_int_equal(tctx, r.out.status, 0, + "rap_netservergetinfo level 1 failed"); + + torture_assert_str_equal(tctx, r.out.info.info1.name, server_name, "server name"); + torture_assert_int_equal(tctx, r.out.info.info1.version_major, info.info101->version_major, "version major"); + torture_assert_int_equal(tctx, r.out.info.info1.version_minor, info.info101->version_minor, "version minor"); + torture_assert_int_equal(tctx, r.out.info.info1.servertype, info.info101->server_type, "server_type"); + torture_assert_str_equal(tctx, r.out.info.info1.comment, info.info101->comment, "comment"); + + talloc_free(p); + + return true; +} + +struct torture_suite *torture_rap_rpc(TALLOC_CTX *mem_ctx) +{ + struct torture_suite *suite = torture_suite_create(mem_ctx, "RPC"); + + torture_suite_add_1smb_test(suite, "netservergetinfo", + test_rpc_netservergetinfo); + + suite->description = talloc_strdup(suite, + "RAP / DCERPC consistency tests"); + + return suite; +} -- cgit