wkssvc.c
来自「samba最新软件」· C语言 代码 · 共 1,453 行 · 第 1/3 页
C
1,453 行
/* Unix SMB/CIFS implementation. test suite for wkssvc rpc operations Copyright (C) Andrew Tridgell 2003 Copyright (C) Günther Deschner 2007 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 <http://www.gnu.org/licenses/>.*/#include "includes.h"#include "torture/torture.h"#include "librpc/gen_ndr/ndr_wkssvc_c.h"#include "torture/rpc/rpc.h"#include "lib/cmdline/popt_common.h"#include "param/param.h"#include "lib/crypto/crypto.h"#include "libcli/auth/libcli_auth.h"#define SMBTORTURE_MACHINE_NAME "smbtrt_name"#define SMBTORTURE_ALTERNATE_NAME "smbtrt_altname"#define SMBTORTURE_TRANSPORT_NAME "\\Device\\smbtrt_transport_name"#define SMBTORTURE_USE_NAME "S:"#define SMBTORTURE_MESSAGE "You are currently tortured by Samba"static bool test_NetWkstaGetInfo(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetWkstaGetInfo r; union wkssvc_NetWkstaInfo info; uint16_t levels[] = {100, 101, 102, 502}; int i; r.in.server_name = dcerpc_server_name(p); r.out.info = &info; for (i=0;i<ARRAY_SIZE(levels);i++) { r.in.level = levels[i]; torture_comment(tctx, "testing NetWkstaGetInfo level %u\n", r.in.level); status = dcerpc_wkssvc_NetWkstaGetInfo(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level)); torture_assert_werr_ok(tctx, r.out.result, talloc_asprintf(tctx, "NetWkstaGetInfo level %u failed", r.in.level)); } return true;}static bool test_NetWkstaTransportEnum(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetWkstaTransportEnum r; uint32_t resume_handle = 0; struct wkssvc_NetWkstaTransportInfo info; union wkssvc_NetWkstaTransportCtr ctr; struct wkssvc_NetWkstaTransportCtr0 ctr0; uint32_t total_entries = 0; ZERO_STRUCT(ctr0); ctr.ctr0 = &ctr0; info.level = 0; info.ctr = ctr; r.in.server_name = dcerpc_server_name(p); r.in.info = &info; r.in.max_buffer = (uint32_t)-1; r.in.resume_handle = &resume_handle; r.out.total_entries = &total_entries; r.out.info = &info; r.out.resume_handle = &resume_handle; torture_comment(tctx, "testing NetWkstaTransportEnum level 0\n"); status = dcerpc_wkssvc_NetWkstaTransportEnum(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetWkstaTransportEnum failed"); torture_assert_werr_ok(tctx, r.out.result, talloc_asprintf(tctx, "NetWkstaTransportEnum level %u failed", info.level)); return true;}static bool test_NetrWkstaTransportAdd(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrWkstaTransportAdd r; struct wkssvc_NetWkstaTransportInfo0 info0; uint32_t parm_err = 0; ZERO_STRUCT(info0); info0.quality_of_service = 0xffff; info0.vc_count = 0; info0.name = SMBTORTURE_TRANSPORT_NAME; info0.address = "000000000000"; info0.wan_link = 0x400; r.in.server_name = dcerpc_server_name(p); r.in.level = 0; r.in.info0 = &info0; r.in.parm_err = r.out.parm_err = &parm_err; torture_comment(tctx, "testing NetrWkstaTransportAdd level 0\n"); status = dcerpc_wkssvc_NetrWkstaTransportAdd(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrWkstaTransportAdd failed"); torture_assert_werr_equal(tctx, r.out.result, WERR_INVALID_PARAM, "NetrWkstaTransportAdd level 0 failed"); return true;}static bool test_NetrWkstaTransportDel(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrWkstaTransportDel r; r.in.server_name = dcerpc_server_name(p); r.in.transport_name = SMBTORTURE_TRANSPORT_NAME; r.in.unknown3 = 0; torture_comment(tctx, "testing NetrWkstaTransportDel\n"); status = dcerpc_wkssvc_NetrWkstaTransportDel(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrWkstaTransportDel failed"); torture_assert_werr_ok(tctx, r.out.result, "NetrWkstaTransportDel"); return true;}static bool test_NetWkstaEnumUsers(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetWkstaEnumUsers r; uint32_t handle = 0; uint32_t entries_read = 0; struct wkssvc_NetWkstaEnumUsersInfo info; struct wkssvc_NetWkstaEnumUsersCtr0 *user0; struct wkssvc_NetWkstaEnumUsersCtr1 *user1; uint32_t levels[] = { 0, 1 }; int i; for (i=0; i<ARRAY_SIZE(levels); i++) { ZERO_STRUCT(info); info.level = levels[i]; switch (info.level) { case 0: user0 = talloc_zero(tctx, struct wkssvc_NetWkstaEnumUsersCtr0); info.ctr.user0 = user0; break; case 1: user1 = talloc_zero(tctx, struct wkssvc_NetWkstaEnumUsersCtr1); info.ctr.user1 = user1; break; default: break; } r.in.server_name = dcerpc_server_name(p); r.in.prefmaxlen = (uint32_t)-1; r.in.info = r.out.info = &info; r.in.resume_handle = r.out.resume_handle = &handle; r.out.entries_read = &entries_read; torture_comment(tctx, "testing NetWkstaEnumUsers level %u\n", levels[i]); status = dcerpc_wkssvc_NetWkstaEnumUsers(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetWkstaEnumUsers failed"); torture_assert_werr_ok(tctx, r.out.result, "NetWkstaEnumUsers failed"); } return true;}static bool test_NetrWkstaUserGetInfo(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrWkstaUserGetInfo r; union wkssvc_NetrWkstaUserInfo info; const char *dom = lp_workgroup(tctx->lp_ctx); struct cli_credentials *creds = cmdline_credentials; const char *user = cli_credentials_get_username(creds); int i; const struct { const char *unknown; uint32_t level; WERROR result; } tests[] = { { NULL, 0, WERR_NO_SUCH_LOGON_SESSION }, { NULL, 1, WERR_NO_SUCH_LOGON_SESSION }, { NULL, 1101, WERR_OK }, { dom, 0, WERR_INVALID_PARAM }, { dom, 1, WERR_INVALID_PARAM }, { dom, 1101, WERR_INVALID_PARAM }, { user, 0, WERR_INVALID_PARAM }, { user, 1, WERR_INVALID_PARAM }, { user, 1101, WERR_INVALID_PARAM }, }; for (i=0; i<ARRAY_SIZE(tests); i++) { r.in.unknown = tests[i].unknown; r.in.level = tests[i].level; r.out.info = &info; torture_comment(tctx, "testing NetrWkstaUserGetInfo level %u\n", r.in.level); status = dcerpc_wkssvc_NetrWkstaUserGetInfo(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrWkstaUserGetInfo failed"); torture_assert_werr_equal(tctx, r.out.result, tests[i].result, "NetrWkstaUserGetInfo failed"); } return true;}static bool test_NetrUseEnum(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrUseEnum r; uint32_t handle = 0; uint32_t entries_read = 0; struct wkssvc_NetrUseEnumInfo info; struct wkssvc_NetrUseEnumCtr0 *use0; struct wkssvc_NetrUseEnumCtr1 *use1; struct wkssvc_NetrUseEnumCtr2 *use2; uint32_t levels[] = { 0, 1, 2 }; int i; for (i=0; i<ARRAY_SIZE(levels); i++) { ZERO_STRUCT(info); info.level = levels[i]; switch (info.level) { case 0: use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0); info.ctr.ctr0 = use0; break; case 1: use1 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr1); info.ctr.ctr1 = use1; break; case 2: use2 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr2); info.ctr.ctr2 = use2; break; default: break; } r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.prefmaxlen = (uint32_t)-1; r.in.info = r.out.info = &info; r.in.resume_handle = r.out.resume_handle = &handle; r.out.entries_read = &entries_read; torture_comment(tctx, "testing NetrUseEnum level %u\n", levels[i]); status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseEnum failed"); torture_assert_werr_ok(tctx, r.out.result, "NetrUseEnum failed"); } return true;}static bool test_NetrUseAdd(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrUseAdd r; struct wkssvc_NetrUseInfo0 info0; struct wkssvc_NetrUseInfo1 info1; union wkssvc_NetrUseGetInfoCtr *ctr; uint32_t parm_err = 0; ctr = talloc(tctx, union wkssvc_NetrUseGetInfoCtr); ZERO_STRUCT(info0); info0.local = SMBTORTURE_USE_NAME; info0.remote = "\\\\localhost\\c$"; ctr->info0 = &info0; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.level = 0; r.in.ctr = ctr; r.in.parm_err = r.out.parm_err = &parm_err; torture_comment(tctx, "testing NetrUseAdd level %u\n", r.in.level); status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseAdd failed"); torture_assert_werr_equal(tctx, r.out.result, WERR_UNKNOWN_LEVEL, "NetrUseAdd failed"); ZERO_STRUCT(r); ZERO_STRUCT(info1); info1.local = SMBTORTURE_USE_NAME; info1.remote = "\\\\localhost\\sysvol"; info1.password = NULL; ctr->info1 = &info1; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.level = 1; r.in.ctr = ctr; r.in.parm_err = r.out.parm_err = &parm_err; torture_comment(tctx, "testing NetrUseAdd level %u\n", r.in.level); status = dcerpc_wkssvc_NetrUseAdd(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseAdd failed"); torture_assert_werr_ok(tctx, r.out.result, "NetrUseAdd failed"); return true;}static bool test_NetrUseDel(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrUseDel r; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.use_name = SMBTORTURE_USE_NAME; r.in.force_cond = 0; torture_comment(tctx, "testing NetrUseDel\n"); status = dcerpc_wkssvc_NetrUseDel(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseDel failed"); torture_assert_werr_ok(tctx, r.out.result, "NetrUseDel failed"); return true;}static bool test_NetrUseGetInfo_level(struct torture_context *tctx, struct dcerpc_pipe *p, const char *use_name, uint32_t level, WERROR werr){ NTSTATUS status; struct wkssvc_NetrUseGetInfo r; union wkssvc_NetrUseGetInfoCtr ctr; ZERO_STRUCT(ctr); r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.use_name = use_name; r.in.level = level; r.out.ctr = &ctr; status = dcerpc_wkssvc_NetrUseGetInfo(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseGetInfo failed"); torture_assert_werr_equal(tctx, r.out.result, werr, "NetrUseGetInfo failed"); return true;}static bool test_NetrUseGetInfo(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrUseEnum r; uint32_t handle = 0; uint32_t entries_read = 0; struct wkssvc_NetrUseEnumInfo info; struct wkssvc_NetrUseEnumCtr0 *use0; uint32_t levels[] = { 0, 1, 2 }; const char *use_name = NULL; int i, k; ZERO_STRUCT(info); info.level = 0; use0 = talloc_zero(tctx, struct wkssvc_NetrUseEnumCtr0); info.ctr.ctr0 = use0; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.prefmaxlen = (uint32_t)-1; r.in.info = r.out.info = &info; r.in.resume_handle = r.out.resume_handle = &handle; r.out.entries_read = &entries_read; status = dcerpc_wkssvc_NetrUseEnum(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "NetrUseEnum failed"); torture_assert_werr_ok(tctx, r.out.result, "NetrUseEnum failed"); for (k=0; k < r.out.info->ctr.ctr0->count; k++) { use_name = r.out.info->ctr.ctr0->array[k].local; for (i=0; i<ARRAY_SIZE(levels); i++) { if (!test_NetrUseGetInfo_level(tctx, p, use_name, levels[i], WERR_OK)) { if (levels[i] != 0) { return false; } } } use_name = r.out.info->ctr.ctr0->array[k].remote; for (i=0; i<ARRAY_SIZE(levels); i++) { if (!test_NetrUseGetInfo_level(tctx, p, use_name, levels[i], WERR_NOT_CONNECTED)) { if (levels[i] != 0) { return false; } } } } return true;}static bool test_NetrLogonDomainNameAdd(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct wkssvc_NetrLogonDomainNameAdd r;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?