mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
torture: add test for smbd print job spooling
Clients can print by performing file IO on a printer share, rather than issuing spoolss RPCs. This commit attempts to reproduce bug 8719.
This commit is contained in:
parent
290e7de47a
commit
33f08906c6
@ -35,9 +35,12 @@
|
||||
#include "libcli/libcli.h"
|
||||
#include "libcli/raw/raw_proto.h"
|
||||
#include "libcli/resolve/resolve.h"
|
||||
#include "libcli/smb2/smb2.h"
|
||||
#include "libcli/smb2/smb2_calls.h"
|
||||
#include "lib/cmdline/popt_common.h"
|
||||
#include "system/filesys.h"
|
||||
#include "torture/ndr/ndr.h"
|
||||
#include "torture/smb2/proto.h"
|
||||
|
||||
#define TORTURE_WELLKNOWN_PRINTER "torture_wkn_printer"
|
||||
#define TORTURE_PRINTER "torture_printer"
|
||||
@ -7726,6 +7729,75 @@ static bool test_print_test_extended(struct torture_context *tctx,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* use smbd file IO to spool a print job */
|
||||
static bool test_print_test_smbd(struct torture_context *tctx,
|
||||
void *private_data)
|
||||
{
|
||||
struct torture_printer_context *t =
|
||||
(struct torture_printer_context *)talloc_get_type_abort(private_data, struct torture_printer_context);
|
||||
struct dcerpc_pipe *p = t->spoolss_pipe;
|
||||
struct dcerpc_binding_handle *b = p->binding_handle;
|
||||
NTSTATUS status;
|
||||
uint32_t count;
|
||||
union spoolss_JobInfo *info = NULL;
|
||||
int i;
|
||||
|
||||
struct smb2_tree *tree;
|
||||
struct smb2_handle job_h;
|
||||
struct cli_credentials *credentials = cmdline_credentials;
|
||||
struct smbcli_options options;
|
||||
TALLOC_CTX *mem_ctx = talloc_new(tctx);
|
||||
const char *share = t->info2.printername;
|
||||
|
||||
torture_comment(tctx, "Testing smbd job spooling\n");
|
||||
lpcfg_smbcli_options(tctx->lp_ctx, &options);
|
||||
|
||||
status = smb2_connect_ext(mem_ctx,
|
||||
torture_setting_string(tctx, "host", NULL),
|
||||
lpcfg_smb_ports(tctx->lp_ctx),
|
||||
share,
|
||||
lpcfg_resolve_context(tctx->lp_ctx),
|
||||
credentials,
|
||||
0,
|
||||
&tree,
|
||||
tctx->ev,
|
||||
&options,
|
||||
lpcfg_socket_options(tctx->lp_ctx),
|
||||
lpcfg_gensec_settings(tctx, tctx->lp_ctx));
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to connect to SMB2 printer %s - %s\n",
|
||||
share, nt_errstr(status));
|
||||
return false;
|
||||
}
|
||||
|
||||
status = torture_smb2_testfile(tree, "smbd_spooler_job", &job_h);
|
||||
torture_assert_ntstatus_ok(tctx, status, "smbd spool job create");
|
||||
|
||||
status = smb2_util_write(tree, job_h, "exciting print job data", 0,
|
||||
sizeof("exciting print job data"));
|
||||
torture_assert_ntstatus_ok(tctx, status, "smbd spool job write");
|
||||
|
||||
/* check back end spoolss job was created */
|
||||
torture_assert(tctx,
|
||||
test_EnumJobs_args(tctx, b, &t->handle, 1, &count, &info),
|
||||
"EnumJobs level 1 failed");
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (!strcmp(info[i].info1.document_name, "smbd_spooler_job")) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
torture_assert(tctx, (i != count), "smbd_spooler_job not found");
|
||||
|
||||
status = smb2_util_close(tree, job_h);
|
||||
torture_assert_ntstatus_ok(tctx, status, "smbd spool job close");
|
||||
|
||||
/* disconnect from printer share */
|
||||
talloc_free(mem_ctx);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool test_printer_sd(struct torture_context *tctx,
|
||||
void *private_data)
|
||||
{
|
||||
@ -7907,6 +7979,7 @@ void torture_tcase_printer(struct torture_tcase *tcase)
|
||||
torture_tcase_add_simple_test(tcase, "csetprinter", test_csetprinter);
|
||||
torture_tcase_add_simple_test(tcase, "print_test", test_print_test);
|
||||
torture_tcase_add_simple_test(tcase, "print_test_extended", test_print_test_extended);
|
||||
torture_tcase_add_simple_test(tcase, "print_test_smbd", test_print_test_smbd);
|
||||
torture_tcase_add_simple_test(tcase, "printer_info", test_printer_info);
|
||||
torture_tcase_add_simple_test(tcase, "sd", test_printer_sd);
|
||||
torture_tcase_add_simple_test(tcase, "dm", test_printer_dm);
|
||||
|
Loading…
Reference in New Issue
Block a user