srvsvc.c

来自「samba最新软件」· C语言 代码 · 共 999 行 · 第 1/2 页

C
999
字号
/*    Unix SMB/CIFS implementation.   test suite for srvsvc rpc operations   Copyright (C) Stefan (metze) Metzmacher 2003      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_srvsvc.h"#include "librpc/gen_ndr/ndr_srvsvc_c.h"#include "torture/rpc/rpc.h"/**************************//* srvsvc_NetCharDev      *//**************************/static bool test_NetCharDevGetInfo(struct dcerpc_pipe *p, struct torture_context *tctx,				const char *devname){	NTSTATUS status;	struct srvsvc_NetCharDevGetInfo r;	uint32_t levels[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.device_name = devname;	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetCharDevGetInfo level %u on device '%s'\n",			r.in.level, r.in.device_name);		status = dcerpc_srvsvc_NetCharDevGetInfo(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetCharDevGetInfo failed");		torture_assert_werr_ok(tctx, r.out.result, "NetCharDevGetInfo failed");	}	return true;}static bool test_NetCharDevControl(struct dcerpc_pipe *p, struct torture_context *tctx,				const char *devname){	NTSTATUS status;	struct srvsvc_NetCharDevControl r;	uint32_t opcodes[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.device_name = devname;	for (i=0;i<ARRAY_SIZE(opcodes);i++) {		ZERO_STRUCT(r.out);		r.in.opcode = opcodes[i];		torture_comment(tctx, "testing NetCharDevControl opcode %u on device '%s'\n", 			r.in.opcode, r.in.device_name);		status = dcerpc_srvsvc_NetCharDevControl(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetCharDevControl failed");		torture_assert_werr_ok(tctx, r.out.result, "NetCharDevControl failed");	}	return true;}static bool test_NetCharDevEnum(struct torture_context *tctx, 								struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetCharDevEnum r;	struct srvsvc_NetCharDevCtr0 c0;	uint32_t levels[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.ctr.ctr0 = &c0;	r.in.ctr.ctr0->count = 0;	r.in.ctr.ctr0->array = NULL;	r.in.max_buffer = (uint32_t)-1;	r.in.resume_handle = NULL;	for (i=0;i<ARRAY_SIZE(levels);i++) {		int j;		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetCharDevEnum level %u\n", r.in.level);		status = dcerpc_srvsvc_NetCharDevEnum(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetCharDevEnum failed");		if (!W_ERROR_IS_OK(r.out.result)) {			torture_comment(tctx, "NetCharDevEnum failed: %s\n", win_errstr(r.out.result));			continue;		}		/* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */		if (r.in.level == 1) {			for (j=0;j<r.out.ctr.ctr1->count;j++) {				const char *device;				device = r.out.ctr.ctr1->array[j].device;				if (!test_NetCharDevGetInfo(p, tctx, device)) {					return false;				}				if (!test_NetCharDevControl(p, tctx, device)) {					return false;				}			}		}	}	return true;}/**************************//* srvsvc_NetCharDevQ     *//**************************/static bool test_NetCharDevQGetInfo(struct dcerpc_pipe *p, struct torture_context *tctx,				const char *devicequeue){	NTSTATUS status;	struct srvsvc_NetCharDevQGetInfo r;	uint32_t levels[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.queue_name = devicequeue;	r.in.user = talloc_asprintf(tctx,"Administrator");	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetCharDevQGetInfo level %u on devicequeue '%s'\n",			r.in.level, r.in.queue_name);		status = dcerpc_srvsvc_NetCharDevQGetInfo(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetCharDevQGetInfo failed");		torture_assert_werr_ok(tctx, r.out.result, "NetCharDevQGetInfo failed");	}	return true;}#if 0static bool test_NetCharDevQSetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,				const char *devicequeue){	NTSTATUS status;	struct srvsvc_NetCharDevQSetInfo r;	uint32_t parm_error;	uint32_t levels[] = {0, 1};	int i;	bool ret = true;	r.in.server_unc = talloc_asprintf(mem_ctx,"\\\\%s",dcerpc_server_name(p));	r.in.queue_name = devicequeue;	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		parm_error = 0;		r.in.level = levels[i];		d_printf("testing NetCharDevQSetInfo level %u on devicequeue '%s'\n", 			r.in.level, devicequeue);		switch (r.in.level) {		case 0:			r.in.info.info0 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo0);			r.in.info.info0->device = r.in.queue_name;			break;		case 1:			r.in.info.info1 = talloc(mem_ctx, struct srvsvc_NetCharDevQInfo1);			r.in.info.info1->device = r.in.queue_name;			r.in.info.info1->priority = 0x000;			r.in.info.info1->devices = r.in.queue_name;			r.in.info.info1->users = 0x000;			r.in.info.info1->num_ahead = 0x000;			break;		default:			break;		}		r.in.parm_error = &parm_error;		status = dcerpc_srvsvc_NetCharDevQSetInfo(p, mem_ctx, &r);		if (!NT_STATUS_IS_OK(status)) {			d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",				r.in.level, r.in.queue_name, nt_errstr(status));			ret = false;			continue;		}		if (!W_ERROR_IS_OK(r.out.result)) {			d_printf("NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s\n",				r.in.level, r.in.queue_name, win_errstr(r.out.result));			continue;		}	}	return ret;}#endifstatic bool test_NetCharDevQEnum(struct torture_context *tctx, 				 struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetCharDevQEnum r;	struct srvsvc_NetCharDevQCtr0 c0;	uint32_t levels[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.user = talloc_asprintf(tctx,"%s","Administrator");	r.in.ctr.ctr0 = &c0;	r.in.ctr.ctr0->count = 0;	r.in.ctr.ctr0->array = NULL;	r.in.max_buffer = (uint32_t)-1;	r.in.resume_handle = NULL;	for (i=0;i<ARRAY_SIZE(levels);i++) {		int j;		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetCharDevQEnum level %u\n", r.in.level);		status = dcerpc_srvsvc_NetCharDevQEnum(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetCharDevQEnum failed");		if (!W_ERROR_IS_OK(r.out.result)) {			torture_comment(tctx, "NetCharDevQEnum failed: %s\n", win_errstr(r.out.result));			continue;		}		/* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */		if (r.in.level == 1) {			for (j=0;j<r.out.ctr.ctr1->count;j++) {				const char *device;				device = r.out.ctr.ctr1->array[j].device;				if (!test_NetCharDevQGetInfo(p, tctx, device)) {					return false;				}			}		}	}	return true;}/**************************//* srvsvc_NetConn         *//**************************/static bool test_NetConnEnum(struct torture_context *tctx,			     struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetConnEnum r;	struct srvsvc_NetConnCtr0 c0;	uint32_t levels[] = {0, 1};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.path = talloc_asprintf(tctx,"%s","ADMIN$");	r.in.ctr.ctr0 = &c0;	r.in.ctr.ctr0->count = 0;	r.in.ctr.ctr0->array = NULL;	r.in.max_buffer = (uint32_t)-1;	r.in.resume_handle = NULL;	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetConnEnum level %u\n", r.in.level);		status = dcerpc_srvsvc_NetConnEnum(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetConnEnum failed");		if (!W_ERROR_IS_OK(r.out.result)) {			torture_comment(tctx, "NetConnEnum failed: %s\n", win_errstr(r.out.result));		}	}	return true;}/**************************//* srvsvc_NetFile         *//**************************/static bool test_NetFileEnum(struct torture_context *tctx,			     struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetFileEnum r;	struct srvsvc_NetFileCtr3 c3;	uint32_t levels[] = {2, 3};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.path = NULL;	r.in.user = NULL;	r.in.ctr.ctr3 = &c3;	r.in.ctr.ctr3->count = 0;	r.in.ctr.ctr3->array = NULL;	r.in.max_buffer = (uint32_t)4096;	r.in.resume_handle = NULL;	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetFileEnum level %u\n", r.in.level);		status = dcerpc_srvsvc_NetFileEnum(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetFileEnum failed");		if (!W_ERROR_IS_OK(r.out.result)) {			torture_comment(tctx, "NetFileEnum failed: %s\n", win_errstr(r.out.result));		}	}	return true;}/**************************//* srvsvc_NetSess         *//**************************/static bool test_NetSessEnum(struct torture_context *tctx,			     struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetSessEnum r;	struct srvsvc_NetSessCtr0 c0;	uint32_t levels[] = {0, 1, 2, 10, 502};	int i;	r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p));	r.in.client = NULL;	r.in.user = NULL;	r.in.ctr.ctr0 = &c0;	r.in.ctr.ctr0->count = 0;	r.in.ctr.ctr0->array = NULL;	r.in.max_buffer = (uint32_t)-1;	r.in.resume_handle = NULL;	for (i=0;i<ARRAY_SIZE(levels);i++) {		ZERO_STRUCT(r.out);		r.in.level = levels[i];		torture_comment(tctx, "testing NetSessEnum level %u\n", r.in.level);		status = dcerpc_srvsvc_NetSessEnum(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetSessEnum failed");		if (!W_ERROR_IS_OK(r.out.result)) {			torture_comment(tctx, "NetSessEnum failed: %s\n", win_errstr(r.out.result));		}	}	return true;}/**************************//* srvsvc_NetShare        *//**************************/static bool test_NetShareCheck(struct dcerpc_pipe *p, struct torture_context *tctx,			       const char *device_name){	NTSTATUS status;	struct srvsvc_NetShareCheck r;	r.in.server_unc = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));	r.in.device_name = device_name;	torture_comment(tctx, 			"testing NetShareCheck on device '%s'\n", r.in.device_name);	status = dcerpc_srvsvc_NetShareCheck(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status, "dcerpc_srvsvc_NetShareCheck failed");	torture_assert_werr_ok(tctx, r.out.result, "NetShareCheck failed");	return true;}static bool test_NetShareGetInfo(struct torture_context *tctx, 				 struct dcerpc_pipe *p,				 const char *sharename, bool admin){	NTSTATUS status;	struct srvsvc_NetShareGetInfo r;	struct {		uint32_t level;		WERROR anon_status;		WERROR admin_status;	} levels[] = {		 { 0,		WERR_OK,		WERR_OK },		 { 1,		WERR_OK,		WERR_OK },		 { 2,		WERR_ACCESS_DENIED,	WERR_OK },		 { 501,		WERR_OK,		WERR_OK },		 { 502,		WERR_ACCESS_DENIED,	WERR_OK },		 { 1005,	WERR_OK,		WERR_OK },	};	int i;	r.in.server_unc = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));	r.in.share_name = sharename;	for (i=0;i<ARRAY_SIZE(levels);i++) {		WERROR expected;		r.in.level = levels[i].level;		expected = levels[i].anon_status;		if (admin) expected = levels[i].admin_status;		ZERO_STRUCT(r.out);		torture_comment(tctx, "testing NetShareGetInfo level %u on share '%s'\n", 		       r.in.level, r.in.share_name);		status = dcerpc_srvsvc_NetShareGetInfo(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "NetShareGetInfo failed");		torture_assert_werr_equal(tctx, r.out.result, expected, "NetShareGetInfo failed");		if (r.in.level != 2) continue;		if (!r.out.info.info2 || !r.out.info.info2->path) continue;		if (!test_NetShareCheck(p, tctx, r.out.info.info2->path)) {			return false;		}	}	return true;}static bool test_NetShareGetInfoAdminFull(struct torture_context *tctx, 					  struct dcerpc_pipe *p){	return test_NetShareGetInfo(tctx, p, "ADMIN$", true);}static bool test_NetShareGetInfoAdminAnon(struct torture_context *tctx, 					  struct dcerpc_pipe *p){	return test_NetShareGetInfo(tctx, p, "ADMIN$", false);}static bool test_NetShareAddSetDel(struct torture_context *tctx, 				   struct dcerpc_pipe *p){	NTSTATUS status;	struct srvsvc_NetShareAdd a;	struct srvsvc_NetShareSetInfo r;	struct srvsvc_NetShareGetInfo q;	struct srvsvc_NetShareDel d;	struct {		uint32_t level;		WERROR expected;	} levels[] = {		 { 0,		WERR_UNKNOWN_LEVEL },		 { 1,		WERR_OK },		 { 2,		WERR_OK },		 { 501,		WERR_UNKNOWN_LEVEL },		 { 502,		WERR_OK },		 { 1004,	WERR_OK },		 { 1005,	WERR_OK },		 { 1006,	WERR_OK },/*		 { 1007,	WERR_OK }, */		 { 1501,	WERR_OK },	};	int i;	a.in.server_unc = r.in.server_unc = q.in.server_unc = d.in.server_unc =		talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));	r.in.share_name = talloc_strdup(tctx, "testshare");	a.in.level = 2;	a.in.info.info2 = talloc(tctx, struct srvsvc_NetShareInfo2);	a.in.info.info2->name = r.in.share_name;	a.in.info.info2->type = STYPE_DISKTREE;	a.in.info.info2->comment = talloc_strdup(tctx, "test comment");	a.in.info.info2->permissions = 123434566;	a.in.info.info2->max_users = -1;	a.in.info.info2->current_users = 0;	a.in.info.info2->path = talloc_strdup(tctx, "C:\\");	a.in.info.info2->password = NULL;	a.in.parm_error = NULL;	status = dcerpc_srvsvc_NetShareAdd(p, tctx, &a);	torture_assert_ntstatus_ok(tctx, status, "NetShareAdd level 2 on share 'testshare' failed");	torture_assert_werr_ok(tctx, a.out.result, "NetShareAdd level 2 on share 'testshare' failed");	r.in.parm_error = NULL;	q.in.level = 502;	for (i = 0; i < ARRAY_SIZE(levels); i++) {		r.in.level = levels[i].level;		ZERO_STRUCT(r.out);		torture_comment(tctx, "testing NetShareSetInfo level %u on share '%s'\n", 		       r.in.level, r.in.share_name);		switch (levels[i].level) {		case 0:			r.in.info.info0 = talloc(tctx, struct srvsvc_NetShareInfo0);			r.in.info.info0->name = r.in.share_name;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?