Ejemplo n.º 1
0
/* This is a convenience function for all OpenPrinterEx calls */
static bool test_OpenPrinterEx(struct torture_context *tctx,
				struct dcerpc_binding_handle *b,
				struct policy_handle *handle,
				const char *printer_name,
				uint32_t access_mask)
{
	NTSTATUS status;
	struct spoolss_OpenPrinterEx op;
	struct spoolss_UserLevel1 ul_1;

	torture_comment(tctx, "Opening printer '%s'\n", printer_name);

	op.in.printername		= talloc_strdup(tctx, printer_name);
	op.in.datatype			= NULL;
	op.in.devmode_ctr.devmode	= NULL;
	op.in.access_mask		= access_mask;
	op.in.userlevel_ctr.level	= 1;
	op.in.userlevel_ctr.user_info.level1 = &ul_1;
	op.out.handle			= handle;

	ul_1.size 			= 1234;
	ul_1.client			= "\\clientname";
	ul_1.user			= "******";
	ul_1.build			= 1;
	ul_1.major			= 2;
	ul_1.minor			= 3;
	ul_1.processor			= 4567;

	status = dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &op);
	torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed");
	torture_assert_werr_ok(tctx, op.out.result, "OpenPrinterEx failed");

	return true;
}
Ejemplo n.º 2
0
static bool test_openprinter_handle(struct torture_context *tctx,
                                    struct dcerpc_pipe *p,
                                    const char *name,
                                    const char *printername,
                                    const char *username,
                                    uint32_t access_mask,
                                    WERROR expected_result,
                                    struct policy_handle *handle)
{
    struct spoolss_OpenPrinterEx r;
    struct spoolss_UserLevel1 level1;
    struct dcerpc_binding_handle *b = p->binding_handle;

    level1.size	= 28;
    level1.client	= talloc_asprintf(tctx, "\\\\%s", "smbtorture");
    level1.user	= username;
    level1.build	= 1381;
    level1.major	= 3;
    level1.minor	= 0;
    level1.processor= 0;

    r.in.printername	= printername;
    r.in.datatype		= NULL;
    r.in.devmode_ctr.devmode= NULL;
    r.in.access_mask	= access_mask;
    r.in.userlevel_ctr.level = 1;
    r.in.userlevel_ctr.user_info.level1 = &level1;
    r.out.handle		= handle;

    torture_comment(tctx, "Testing OpenPrinterEx(%s) with access_mask 0x%08x (%s)\n",
                    r.in.printername, r.in.access_mask, name);

    torture_assert_ntstatus_ok(tctx,
                               dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &r),
                               "OpenPrinterEx failed");
    torture_assert_werr_equal(tctx, r.out.result, expected_result,
                              talloc_asprintf(tctx, "OpenPrinterEx(%s) as '%s' with access_mask: 0x%08x (%s) failed",
                                      r.in.printername, username, r.in.access_mask, name));

    return true;
}
Ejemplo n.º 3
0
static bool test_OpenPrinterAsAdmin(struct torture_context *tctx,
					struct dcerpc_binding_handle *b,
					const char *printername)
{
	NTSTATUS status;
	struct spoolss_OpenPrinterEx op;
	struct spoolss_ClosePrinter cp;
	struct spoolss_UserLevel1 ul_1;
	struct policy_handle handle;

	ul_1.size 			= 1234;
	ul_1.client			= "\\clientname";
	ul_1.user			= "******";
	ul_1.build			= 1;
	ul_1.major			= 2;
	ul_1.minor			= 3;
	ul_1.processor			= 4567;

	op.in.printername		= talloc_strdup(tctx, printername);
	op.in.datatype			= NULL;
	op.in.devmode_ctr.devmode	= NULL;
	op.in.access_mask		= SERVER_ALL_ACCESS;
	op.in.userlevel_ctr.level	= 1;
	op.in.userlevel_ctr.user_info.level1 = &ul_1;
	op.out.handle			= &handle;

	cp.in.handle			= &handle;
	cp.out.handle			= &handle;

	torture_comment(tctx, "Testing OpenPrinterEx(%s) with admin rights\n",
			op.in.printername);

	status = dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &op);

	if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(op.out.result)) {
		status = dcerpc_spoolss_ClosePrinter_r(b, tctx, &cp);
		torture_assert_ntstatus_ok(tctx, status, "ClosePrinter failed");
	}

	return true;
}