diff --git a/source3/Makefile.in b/source3/Makefile.in index cde41c63bbb..4839ab6c0f8 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1202,7 +1202,7 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_help.o \ rpc_client/init_samr.o \ registry/reg_parse.o registry/reg_format.o \ registry/reg_parse_internal.o registry/reg_import.o \ - lib/cbuf.o lib/srprs.o + lib/cbuf.o lib/srprs.o printing/nt_printing_migrate.o # these are not processed by make proto NET_OBJ2 = utils/net_registry_util.o utils/net_help_common.o diff --git a/source3/utils/net_printing.c b/source3/utils/net_printing.c index 6e82c55afe4..c919d3775e2 100644 --- a/source3/utils/net_printing.c +++ b/source3/utils/net_printing.c @@ -24,11 +24,11 @@ #include "utils/net.h" #include "rpc_client/rpc_client.h" #include "librpc/gen_ndr/ndr_ntprinting.h" -#include "librpc/gen_ndr/ndr_spoolss_c.h" -#include "rpc_client/cli_spoolss.h" +#include "librpc/gen_ndr/ndr_spoolss.h" #include "../libcli/security/security.h" #include "../librpc/gen_ndr/ndr_security.h" #include "util_tdb.h" +#include "printing/nt_printing_migrate.h" #define FORMS_PREFIX "FORMS/" #define DRIVERS_PREFIX "DRIVERS/" @@ -218,415 +218,6 @@ static int net_printing_dump(struct net_context *c, int argc, return ret; } -static NTSTATUS migrate_form(TALLOC_CTX *mem_ctx, - struct rpc_pipe_client *pipe_hnd, - const char *key_name, - unsigned char *data, - size_t length) -{ - struct dcerpc_binding_handle *b = pipe_hnd->binding_handle; - struct policy_handle hnd; - enum ndr_err_code ndr_err; - struct ntprinting_form r; - union spoolss_AddFormInfo f; - struct spoolss_AddFormInfo1 f1; - DATA_BLOB blob; - NTSTATUS status; - WERROR result; - - blob = data_blob_const(data, length); - - ZERO_STRUCT(r); - - ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r, - (ndr_pull_flags_fn_t)ndr_pull_ntprinting_form); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - d_fprintf(stderr, _("form pull failed: %s\n"), - ndr_errstr(ndr_err)); - return NT_STATUS_NO_MEMORY; - } - - /* Don't migrate builtin forms */ - if (r.flag == SPOOLSS_FORM_BUILTIN) { - return NT_STATUS_OK; - } - - d_printf(_("Migrating Form: %s\n"), key_name); - - result = rpccli_spoolss_openprinter_ex(pipe_hnd, - mem_ctx, - pipe_hnd->srv_name_slash, - MAXIMUM_ALLOWED_ACCESS, - &hnd); - if (!W_ERROR_IS_OK(result)) { - d_fprintf(stderr, _("OpenPrinter(%s) failed: %s\n"), - pipe_hnd->srv_name_slash, win_errstr(result)); - return werror_to_ntstatus(result); - } - - f1.form_name = key_name; - f1.flags = r.flag; - - f1.size.width = r.width; - f1.size.height = r.length; - - f1.area.top = r.top; - f1.area.right = r.right; - f1.area.bottom = r.bottom; - f1.area.left = r.left; - - f.info1 = &f1; - - status = dcerpc_spoolss_AddForm(b, - mem_ctx, - &hnd, - 1, - f, - &result); - if (!NT_STATUS_IS_OK(status)) { - d_printf(_("\tAddForm(%s) refused -- %s.\n"), - f.info1->form_name, nt_errstr(status)); - } else if (!W_ERROR_IS_OK(result)) { - d_printf(_("\tAddForm(%s) refused -- %s.\n"), - f.info1->form_name, win_errstr(result)); - status = werror_to_ntstatus(result); - } - - dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result); - - return status; -} - -static NTSTATUS migrate_driver(TALLOC_CTX *mem_ctx, - struct rpc_pipe_client *pipe_hnd, - const char *key_name, - unsigned char *data, - size_t length) -{ - struct dcerpc_binding_handle *b = pipe_hnd->binding_handle; - enum ndr_err_code ndr_err; - struct ntprinting_driver r; - struct spoolss_AddDriverInfoCtr d; - struct spoolss_AddDriverInfo3 d3; - struct spoolss_StringArray a; - DATA_BLOB blob; - NTSTATUS status; - WERROR result; - - blob = data_blob_const(data, length); - - ZERO_STRUCT(r); - - ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r, - (ndr_pull_flags_fn_t)ndr_pull_ntprinting_driver); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - d_fprintf(stderr, _("driver pull failed: %s\n"), - ndr_errstr(ndr_err)); - return NT_STATUS_NO_MEMORY; - } - - d_printf(_("Migrating Printer Driver: %s\n"), key_name); - - ZERO_STRUCT(d3); - ZERO_STRUCT(a); - - a.string = r.dependent_files; - - d3.architecture = r.environment; - d3.config_file = r.configfile; - d3.data_file = r.datafile; - d3.default_datatype = r.defaultdatatype; - d3.dependent_files = &a; - d3.driver_path = r.driverpath; - d3.help_file = r.helpfile; - d3.monitor_name = r.monitorname; - d3.driver_name = r.name; - d3.version = r.version; - - d.info.info3 = &d3; - d.level = 3; - - status = dcerpc_spoolss_AddPrinterDriver(b, - mem_ctx, - NULL, - &d, - &result); - if (!NT_STATUS_IS_OK(status)) { - d_printf(_("\tAddDriver driver: [%s] refused -- %s.\n"), - d3.driver_name, nt_errstr(status)); - } else if (!W_ERROR_IS_OK(result)) { - d_printf(_("\tAddDriver driver: [%s] refused -- %s.\n"), - d3.driver_name, win_errstr(result)); - status = werror_to_ntstatus(result); - } - - return status; -} - -static NTSTATUS migrate_printer(TALLOC_CTX *mem_ctx, - struct rpc_pipe_client *pipe_hnd, - const char *key_name, - unsigned char *data, - size_t length) -{ - struct dcerpc_binding_handle *b = pipe_hnd->binding_handle; - struct policy_handle hnd; - enum ndr_err_code ndr_err; - struct ntprinting_printer r; - struct spoolss_SetPrinterInfo2 info2; - struct spoolss_DeviceMode dm; - struct spoolss_SetPrinterInfoCtr info_ctr; - struct spoolss_DevmodeContainer devmode_ctr; - struct sec_desc_buf secdesc_ctr; - DATA_BLOB blob; - NTSTATUS status; - WERROR result; - int j; - - if (strequal(key_name, "printers")) { - return NT_STATUS_OK; - } - - blob = data_blob_const(data, length); - - ZERO_STRUCT(r); - - ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r, - (ndr_pull_flags_fn_t) ndr_pull_ntprinting_printer); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - d_fprintf(stderr, _("printer pull failed: %s\n"), - ndr_errstr(ndr_err)); - return NT_STATUS_NO_MEMORY; - } - - d_printf(_("Migrating Printer: %s\n"), key_name); - - result = rpccli_spoolss_openprinter_ex(pipe_hnd, - mem_ctx, - key_name, - MAXIMUM_ALLOWED_ACCESS, - &hnd); - if (!W_ERROR_IS_OK(result)) { - d_fprintf(stderr, _("OpenPrinter(%s) failed: %s\n"), - key_name, win_errstr(result)); - return werror_to_ntstatus(result); - } - - /* Create printer info level 2 */ - ZERO_STRUCT(info2); - ZERO_STRUCT(devmode_ctr); - ZERO_STRUCT(secdesc_ctr); - - info2.attributes = r.info.attributes; - info2.averageppm = r.info.averageppm; - info2.cjobs = r.info.cjobs; - info2.comment = r.info.comment; - info2.datatype = r.info.datatype; - info2.defaultpriority = r.info.default_priority; - info2.drivername = r.info.drivername; - info2.location = r.info.location; - info2.parameters = r.info.parameters; - info2.portname = r.info.portname; - info2.printername = r.info.printername; - info2.printprocessor = r.info.printprocessor; - info2.priority = r.info.priority; - info2.sepfile = r.info.sepfile; - info2.sharename = r.info.sharename; - info2.starttime = r.info.starttime; - info2.status = r.info.status; - info2.untiltime = r.info.untiltime; - - /* Create Device Mode */ - if (r.devmode != NULL) { - ZERO_STRUCT(dm); - - dm.bitsperpel = r.devmode->bitsperpel; - dm.collate = r.devmode->collate; - dm.color = r.devmode->color; - dm.copies = r.devmode->copies; - dm.defaultsource = r.devmode->defaultsource; - dm.devicename = r.devmode->devicename; - dm.displayflags = r.devmode->displayflags; - dm.displayfrequency = r.devmode->displayfrequency; - dm.dithertype = r.devmode->dithertype; - dm.driverversion = r.devmode->driverversion; - dm.duplex = r.devmode->duplex; - dm.fields = r.devmode->fields; - dm.formname = r.devmode->formname; - dm.icmintent = r.devmode->icmintent; - dm.icmmethod = r.devmode->icmmethod; - dm.logpixels = r.devmode->logpixels; - dm.mediatype = r.devmode->mediatype; - dm.orientation = r.devmode->orientation; - dm.panningheight = r.devmode->pelsheight; - dm.panningwidth = r.devmode->panningwidth; - dm.paperlength = r.devmode->paperlength; - dm.papersize = r.devmode->papersize; - dm.paperwidth = r.devmode->paperwidth; - dm.pelsheight = r.devmode->pelsheight; - dm.pelswidth = r.devmode->pelswidth; - dm.printquality = r.devmode->printquality; - dm.size = r.devmode->size; - dm.scale = r.devmode->scale; - dm.specversion = r.devmode->specversion; - dm.ttoption = r.devmode->ttoption; - dm.yresolution = r.devmode->yresolution; - - if (r.devmode->nt_dev_private != NULL) { - dm.driverextra_data.data = r.devmode->nt_dev_private->data; - dm.driverextra_data.length = r.devmode->nt_dev_private->length; - dm.__driverextra_length = r.devmode->nt_dev_private->length; - } - - devmode_ctr.devmode = &dm; - - info2.devmode_ptr = 1; - } - - info_ctr.info.info2 = &info2; - info_ctr.level = 2; - - status = dcerpc_spoolss_SetPrinter(b, - mem_ctx, - &hnd, - &info_ctr, - &devmode_ctr, - &secdesc_ctr, - 0, /* command */ - &result); - if (!NT_STATUS_IS_OK(status)) { - d_printf(_("\tSetPrinter(%s) level 2 refused -- %s.\n"), - key_name, nt_errstr(status)); - goto done; - } else if (!W_ERROR_IS_OK(result)) { - d_printf(_("\tSetPrinter(%s) level 2 refused -- %s.\n"), - key_name, win_errstr(result)); - status = werror_to_ntstatus(result); - goto done; - } - - /* migrate printerdata */ - for (j = 0; j < r.count; j++) { - char *valuename; - char *keyname; - - if (r.printer_data[j].type == REG_NONE) { - continue; - } - - keyname = discard_const_p(char, r.printer_data[j].name); - valuename = strchr(keyname, '\\'); - if (valuename == NULL) { - continue; - } else { - valuename[0] = '\0'; - valuename++; - } - - printf(" data: %s\\%s\n", keyname, valuename); - - status = dcerpc_spoolss_SetPrinterDataEx(b, - mem_ctx, - &hnd, - keyname, - valuename, - r.printer_data[j].type, - r.printer_data[j].data.data, - r.printer_data[j].data.length, - &result); - if (!NT_STATUS_IS_OK(status)) { - d_printf(_("\tSetPrinterDataEx: printer [%s], keyname [%s], valuename [%s] refused -- %s.\n"), - key_name, keyname, valuename, nt_errstr(status)); - break; - } else if (!W_ERROR_IS_OK(result)) { - d_printf(_("\tSetPrinterDataEx: printer [%s], keyname [%s], valuename [%s] refused -- %s.\n"), - key_name, keyname, valuename, win_errstr(result)); - status = werror_to_ntstatus(result); - break; - } - } - - done: - dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result); - - return status; -} - -static NTSTATUS migrate_secdesc(TALLOC_CTX *mem_ctx, - struct rpc_pipe_client *pipe_hnd, - const char *key_name, - unsigned char *data, - size_t length) -{ - struct dcerpc_binding_handle *b = pipe_hnd->binding_handle; - struct policy_handle hnd; - enum ndr_err_code ndr_err; - struct sec_desc_buf secdesc_ctr; - struct spoolss_SetPrinterInfo3 info3; - struct spoolss_SetPrinterInfoCtr info_ctr; - struct spoolss_DevmodeContainer devmode_ctr; - DATA_BLOB blob; - NTSTATUS status; - WERROR result; - - if (strequal(key_name, "printers")) { - return NT_STATUS_OK; - } - - blob = data_blob_const(data, length); - - ZERO_STRUCT(secdesc_ctr); - - ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &secdesc_ctr, - (ndr_pull_flags_fn_t)ndr_pull_sec_desc_buf); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - d_fprintf(stderr, _("security descriptor pull failed: %s\n"), - ndr_errstr(ndr_err)); - return NT_STATUS_NO_MEMORY; - } - - d_printf(_("Migrating Security Descriptor: %s\n"), key_name); - - result = rpccli_spoolss_openprinter_ex(pipe_hnd, - mem_ctx, - key_name, - MAXIMUM_ALLOWED_ACCESS, - &hnd); - if (!W_ERROR_IS_OK(result)) { - d_fprintf(stderr, _("\tOpenPrinter(%s) failed: %s\n"), - key_name, win_errstr(result)); - return werror_to_ntstatus(result); - } - - ZERO_STRUCT(devmode_ctr); - - info3.sec_desc_ptr = 1; - - info_ctr.info.info3 = &info3; - info_ctr.level = 3; - - status = dcerpc_spoolss_SetPrinter(b, - mem_ctx, - &hnd, - &info_ctr, - &devmode_ctr, - &secdesc_ctr, - 0, /* command */ - &result); - if (!NT_STATUS_IS_OK(status)) { - d_printf(_("\tSetPrinter(%s) level 3 refused -- %s.\n"), - key_name, nt_errstr(status)); - } else if (!W_ERROR_IS_OK(result)) { - d_printf(_("\tSetPrinter(%s) level 3 refused -- %s.\n"), - key_name, win_errstr(result)); - status = werror_to_ntstatus(result); - } - - dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result); - - return status; -} - static NTSTATUS printing_migrate_internal(struct net_context *c, const struct dom_sid *domain_sid, const char *domain_name, @@ -663,7 +254,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c, } if (strncmp((const char *) kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) { - migrate_form(tmp_ctx, + printing_tdb_migrate_form(tmp_ctx, pipe_hnd, (const char *) kbuf.dptr + strlen(FORMS_PREFIX), dbuf.dptr, @@ -673,7 +264,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c, } if (strncmp((const char *) kbuf.dptr, DRIVERS_PREFIX, strlen(DRIVERS_PREFIX)) == 0) { - migrate_driver(tmp_ctx, + printing_tdb_migrate_driver(tmp_ctx, pipe_hnd, (const char *) kbuf.dptr + strlen(DRIVERS_PREFIX), dbuf.dptr, @@ -683,7 +274,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c, } if (strncmp((const char *) kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) { - migrate_printer(tmp_ctx, + printing_tdb_migrate_printer(tmp_ctx, pipe_hnd, (const char *) kbuf.dptr + strlen(PRINTERS_PREFIX), dbuf.dptr, @@ -693,7 +284,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c, } if (strncmp((const char *) kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) { - migrate_secdesc(tmp_ctx, + printing_tdb_migrate_secdesc(tmp_ctx, pipe_hnd, (const char *) kbuf.dptr + strlen(SECDESC_PREFIX), dbuf.dptr, diff --git a/source3/wscript_build b/source3/wscript_build index 2a19261ea48..1489266ec61 100755 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -1167,6 +1167,7 @@ bld.SAMBA3_BINARY('net', LIBCLI_SAMR libcli_lsa3 LIBRPCCLI_NETLOGON LIBCLI_SPOOLSS RPC_NDR_SRVSVC RPC_NDR_WKSSVC RPC_NDR_SVCCTL RPC_NDR_DSSETUP RPC_NDR_INITSHUTDOWN RPC_NDR_DRSUAPI INIT_NETLOGON INIT_SAMR + printing_migrate ''', vars=locals())