spoolss.c

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

C
1,770
字号
	torture_assert_ntstatus_equal(tctx, status, NT_STATUS_NET_WRITE_FAULT,			"ERROR: Allowed close on secondary connection");	torture_assert_int_equal(tctx, p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				 "Unexpected fault code");	talloc_free(p2);	return true;}static bool test_OpenPrinter_badname(struct torture_context *tctx, 				     struct dcerpc_pipe *p, const char *name){	NTSTATUS status;	struct spoolss_OpenPrinter op;	struct spoolss_OpenPrinterEx opEx;	struct policy_handle handle;	bool ret = true;	op.in.printername	= name;	op.in.datatype		= NULL;	op.in.devmode_ctr.devmode= NULL;	op.in.access_mask	= 0;	op.out.handle		= &handle;	torture_comment(tctx, "\nTesting OpenPrinter(%s) with bad name\n", op.in.printername);	status = dcerpc_spoolss_OpenPrinter(p, tctx, &op);	torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed");	if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,op.out.result)) {		torture_comment(tctx, "OpenPrinter(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n",			name, win_errstr(op.out.result));	}	if (W_ERROR_IS_OK(op.out.result)) {		ret &=test_ClosePrinter(tctx, p, &handle);	}	opEx.in.printername		= name;	opEx.in.datatype		= NULL;	opEx.in.devmode_ctr.devmode	= NULL;	opEx.in.access_mask		= 0;	opEx.in.level			= 1;	opEx.in.userlevel.level1	= NULL;	opEx.out.handle			= &handle;	torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername);	status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &opEx);	torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed");	if (!W_ERROR_EQUAL(WERR_INVALID_PARAM,opEx.out.result)) {		torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PARAM\n",			name, win_errstr(opEx.out.result));	}	if (W_ERROR_IS_OK(opEx.out.result)) {		ret &=test_ClosePrinter(tctx, p, &handle);	}	return ret;}static bool test_OpenPrinter(struct torture_context *tctx, 			     struct dcerpc_pipe *p, 			     const char *name){	NTSTATUS status;	struct spoolss_OpenPrinter r;	struct policy_handle handle;	bool ret = true;	r.in.printername	= talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name);	r.in.datatype		= NULL;	r.in.devmode_ctr.devmode= NULL;	r.in.access_mask	= SEC_FLAG_MAXIMUM_ALLOWED;	r.out.handle		= &handle;	torture_comment(tctx, "Testing OpenPrinter(%s)\n", r.in.printername);	status = dcerpc_spoolss_OpenPrinter(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed");	torture_assert_werr_ok(tctx, r.out.result, "OpenPrinter failed");	if (!test_GetPrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_SecondaryClosePrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_ClosePrinter(tctx, p, &handle)) {		ret = false;	}	return ret;}static bool call_OpenPrinterEx(struct torture_context *tctx, 			       struct dcerpc_pipe *p, 			       const char *name, struct policy_handle *handle){	struct spoolss_OpenPrinterEx r;	struct spoolss_UserLevel1 userlevel1;	NTSTATUS status;	if (name && name[0]) {		r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", 						   dcerpc_server_name(p), name);	} else {		r.in.printername = talloc_asprintf(tctx, "\\\\%s", 						   dcerpc_server_name(p));	}	r.in.datatype		= NULL;	r.in.devmode_ctr.devmode= NULL;	r.in.access_mask	= SEC_FLAG_MAXIMUM_ALLOWED;	r.in.level		= 1;	r.in.userlevel.level1	= &userlevel1;	r.out.handle = handle;	userlevel1.size = 1234;	userlevel1.client = "hello";	userlevel1.user = "spottyfoot!";	userlevel1.build = 1;	userlevel1.major = 2;	userlevel1.minor = 3;	userlevel1.processor = 4;	torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername);	status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed");		torture_assert_werr_ok(tctx, r.out.result, "OpenPrinterEx failed");	return true;}static bool test_OpenPrinterEx(struct torture_context *tctx, 			       struct dcerpc_pipe *p, 			       const char *name){	struct policy_handle handle;	bool ret = true;	if (!call_OpenPrinterEx(tctx, p, name, &handle)) {		return false;	}	if (!test_GetPrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_EnumForms(tctx, p, &handle, false)) {		ret = false;	}	if (!test_AddForm(tctx, p, &handle, false)) {		ret = false;	}	if (!test_EnumPrinterData(tctx, p, &handle)) {		ret = false;	}	if (!test_EnumPrinterDataEx(tctx, p, &handle)) {		ret = false;	}	if (!test_PausePrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_DoPrintTest(tctx, p, &handle)) {		ret = false;	}	if (!test_ResumePrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_SetPrinterData(tctx, p, &handle)) {		ret = false;	}	if (!test_SecondaryClosePrinter(tctx, p, &handle)) {		ret = false;	}	if (!test_ClosePrinter(tctx, p, &handle)) {		ret = false;	}		return ret;}static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pipe *p){	struct spoolss_EnumPrinters r;	NTSTATUS status;	uint16_t levels[] = {1, 2, 4, 5};	int i;	bool ret = true;	for (i=0;i<ARRAY_SIZE(levels);i++) {		union spoolss_PrinterInfo *info;		int j;		r.in.flags	= PRINTER_ENUM_LOCAL;		r.in.server	= "";		r.in.level	= levels[i];		r.in.buffer	= NULL;		r.in.offered	= 0;		torture_comment(tctx, "Testing EnumPrinters level %u\n", r.in.level);		status = dcerpc_spoolss_EnumPrinters(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed");		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {			DATA_BLOB blob = data_blob_talloc(tctx, NULL, r.out.needed);			data_blob_clear(&blob);			r.in.buffer = &blob;			r.in.offered = r.out.needed;			status = dcerpc_spoolss_EnumPrinters(p, tctx, &r);		}		torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed");		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed");		if (!r.out.info) {			torture_comment(tctx, "No printers returned\n");			return true;		}		info = r.out.info;		for (j=0;j<r.out.count;j++) {			if (r.in.level == 1) {				/* the names appear to be comma-separated name lists? */				char *name = talloc_strdup(tctx, info[j].info1.name);				char *comma = strchr(name, ',');				if (comma) *comma = 0;				if (!test_OpenPrinter(tctx, p, name)) {					ret = false;				}				if (!test_OpenPrinterEx(tctx, p, name)) {					ret = false;				}			}		}	}	return ret;}#if 0static bool test_GetPrinterDriver2(struct dcerpc_pipe *p, 				   struct policy_handle *handle, 				   const char *driver_name){	NTSTATUS status;	struct spoolss_GetPrinterDriver2 r;	r.in.handle = handle;	r.in.architecture = "W32X86";	r.in.level = 1;	r.in.buffer = NULL;	r.in.offered = 0;	r.in.client_major_version = 0;	r.in.client_minor_version = 0;	printf("Testing GetPrinterDriver2\n");	status = dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status));		return false;	}	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {		r.in.offered = r.out.needed;		status = dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r);	}			if (!NT_STATUS_IS_OK(status)) {		printf("GetPrinterDriver2 failed - %s\n", 		       nt_errstr(status));		return false;	}	if (!W_ERROR_IS_OK(r.out.result)) {		printf("GetPrinterDriver2 failed - %s\n", 		       win_errstr(r.out.result));		return false;	}	return true;}#endifstatic bool test_EnumPrinterDrivers_old(struct torture_context *tctx, 					struct dcerpc_pipe *p){	struct spoolss_EnumPrinterDrivers r;	NTSTATUS status;	uint16_t levels[] = {1, 2, 3, 4, 5, 6};	int i;	for (i=0;i<ARRAY_SIZE(levels);i++) {		r.in.server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));		r.in.environment = "Windows NT x86";		r.in.level = levels[i];		r.in.buffer = NULL;		r.in.offered = 0;		torture_comment(tctx, "Testing EnumPrinterDrivers level %u\n", r.in.level);		status = dcerpc_spoolss_EnumPrinterDrivers(p, tctx, &r);		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed");		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {			DATA_BLOB blob = data_blob_talloc(tctx, NULL, r.out.needed);			data_blob_clear(&blob);			r.in.buffer = &blob;			r.in.offered = r.out.needed;			status = dcerpc_spoolss_EnumPrinterDrivers(p, tctx, &r);		}		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed");		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");		if (!r.out.info) {			torture_comment(tctx, "No printer drivers returned\n");			break;		}	}	return true;}/** Test that makes sure that calling ReplyOpenPrinter() * on Samba 4 will cause an irpc broadcast call. */static bool test_ReplyOpenPrinter(struct torture_context *tctx, 				  struct dcerpc_pipe *pipe){	struct spoolss_ReplyOpenPrinter r;	struct spoolss_ReplyClosePrinter s;	struct policy_handle h;	r.in.server_name = "earth";	r.in.printer_local = 2;	r.in.type = REG_DWORD;	r.in.unknown1 = 0;	r.in.unknown2 = 0;	r.out.handle = &h;	torture_assert_ntstatus_ok(tctx, 			dcerpc_spoolss_ReplyOpenPrinter(pipe, tctx, &r),			"spoolss_ReplyOpenPrinter call failed");	torture_assert_werr_ok(tctx, r.out.result, "error return code");	s.in.handle = &h;	s.out.handle = &h;	torture_assert_ntstatus_ok(tctx,			dcerpc_spoolss_ReplyClosePrinter(pipe, tctx, &s),			"spoolss_ReplyClosePrinter call failed");	torture_assert_werr_ok(tctx, r.out.result, "error return code");	return true;}bool torture_rpc_spoolss(struct torture_context *torture){	NTSTATUS status;	struct dcerpc_pipe *p;	bool ret = true;	struct test_spoolss_context *ctx;	status = torture_rpc_connection(torture, &p, &ndr_table_spoolss);	if (!NT_STATUS_IS_OK(status)) {		return false;	}	ctx = talloc_zero(torture, struct test_spoolss_context);	ret &= test_OpenPrinter_server(torture, p, ctx);	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "W3SvcInstalled");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "BeepEnabled");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "EventLog");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopup");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopupToComputer");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MajorVersion");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MinorVersion");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DefaultSpoolDirectory");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "Architecture");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DsPresent");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersion");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersionEx");	ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DNSMachineName");	ret &= test_EnumForms(torture, p, &ctx->server_handle, true);	ret &= test_AddForm(torture, p, &ctx->server_handle, true);	ret &= test_EnumPorts(torture, p, ctx);	ret &= test_GetPrinterDriverDirectory(torture, p, ctx);	ret &= test_EnumPrinterDrivers(torture, p, ctx);	ret &= test_EnumMonitors(torture, p, ctx);	ret &= test_EnumPrintProcessors(torture, p, ctx);	ret &= test_EnumPrinters(torture, p, ctx);	ret &= test_OpenPrinter_badname(torture, p, "__INVALID_PRINTER__");	ret &= test_OpenPrinter_badname(torture, p, "\\\\__INVALID_HOST__");	ret &= test_OpenPrinter_badname(torture, p, "");	ret &= test_OpenPrinter_badname(torture, p, "\\\\\\");	ret &= test_OpenPrinter_badname(torture, p, "\\\\\\__INVALID_PRINTER__");	ret &= test_OpenPrinter_badname(torture, p, talloc_asprintf(torture, "\\\\%s\\", dcerpc_server_name(p)));	ret &= test_OpenPrinter_badname(torture, p, 					talloc_asprintf(torture, "\\\\%s\\__INVALID_PRINTER__", dcerpc_server_name(p)));	ret &= test_AddPort(torture, p);	ret &= test_EnumPorts_old(torture, p);	ret &= test_EnumPrinters_old(torture, p);	ret &= test_EnumPrinterDrivers_old(torture, p);	ret &= test_ReplyOpenPrinter(torture, p);	return ret;}

⌨️ 快捷键说明

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