2 * Unix SMB/CIFS implementation.
4 * SPOOLSS RPC Pipe server / winreg client routines
6 * Copyright (c) 2010 Andreas Schneider <asn@samba.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "rpc_server/rpc_ncacn_np.h"
24 #include "../lib/tsocket/tsocket.h"
25 #include "../librpc/gen_ndr/ndr_spoolss.h"
26 #include "../librpc/gen_ndr/ndr_winreg.h"
27 #include "srv_spoolss_util.h"
28 #include "rpc_client/cli_winreg_spoolss.h"
30 WERROR winreg_printer_binding_handle(TALLOC_CTX *mem_ctx,
31 const struct auth_session_info *session_info,
32 struct messaging_context *msg_ctx,
33 struct dcerpc_binding_handle **winreg_binding_handle)
35 struct tsocket_address *local;
39 rc = tsocket_address_inet_from_strings(mem_ctx,
45 return WERR_NOT_ENOUGH_MEMORY;
48 status = rpcint_binding_handle(mem_ctx,
53 winreg_binding_handle);
55 if (!NT_STATUS_IS_OK(status)) {
56 DEBUG(0, ("winreg_printer_binding_handle: Could not connect to winreg pipe: %s\n",
58 return ntstatus_to_werror(status);
64 WERROR winreg_delete_printer_key_internal(TALLOC_CTX *mem_ctx,
65 const struct auth_session_info *session_info,
66 struct messaging_context *msg_ctx,
71 struct dcerpc_binding_handle *b;
74 tmp_ctx = talloc_stackframe();
75 if (tmp_ctx == NULL) {
76 return WERR_NOT_ENOUGH_MEMORY;
79 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
80 if (!W_ERROR_IS_OK(result)) {
85 result = winreg_delete_printer_key(tmp_ctx,
94 WERROR winreg_printer_update_changeid_internal(TALLOC_CTX *mem_ctx,
95 const struct auth_session_info *session_info,
96 struct messaging_context *msg_ctx,
100 struct dcerpc_binding_handle *b;
103 tmp_ctx = talloc_stackframe();
104 if (tmp_ctx == NULL) {
105 return WERR_NOT_ENOUGH_MEMORY;
108 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
109 if (!W_ERROR_IS_OK(result)) {
110 talloc_free(tmp_ctx);
114 result = winreg_printer_update_changeid(mem_ctx,
118 talloc_free(tmp_ctx);
122 WERROR winreg_printer_get_changeid_internal(TALLOC_CTX *mem_ctx,
123 const struct auth_session_info *session_info,
124 struct messaging_context *msg_ctx,
129 struct dcerpc_binding_handle *b;
132 tmp_ctx = talloc_stackframe();
133 if (tmp_ctx == NULL) {
134 return WERR_NOT_ENOUGH_MEMORY;
137 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
138 if (!W_ERROR_IS_OK(result)) {
139 talloc_free(tmp_ctx);
143 result = winreg_printer_get_changeid(mem_ctx,
148 talloc_free(tmp_ctx);
152 WERROR winreg_get_printer_internal(TALLOC_CTX *mem_ctx,
153 const struct auth_session_info *session_info,
154 struct messaging_context *msg_ctx,
156 struct spoolss_PrinterInfo2 **pinfo2)
159 struct dcerpc_binding_handle *b;
162 tmp_ctx = talloc_stackframe();
163 if (tmp_ctx == NULL) {
164 return WERR_NOT_ENOUGH_MEMORY;
167 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
168 if (!W_ERROR_IS_OK(result)) {
169 talloc_free(tmp_ctx);
173 result = winreg_get_printer(mem_ctx,
178 talloc_free(tmp_ctx);
182 WERROR winreg_create_printer_internal(TALLOC_CTX *mem_ctx,
183 const struct auth_session_info *session_info,
184 struct messaging_context *msg_ctx,
185 const char *sharename)
188 struct dcerpc_binding_handle *b;
191 tmp_ctx = talloc_stackframe();
192 if (tmp_ctx == NULL) {
193 return WERR_NOT_ENOUGH_MEMORY;
196 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
197 if (!W_ERROR_IS_OK(result)) {
198 talloc_free(tmp_ctx);
202 result = winreg_create_printer(mem_ctx,
206 talloc_free(tmp_ctx);
210 WERROR winreg_update_printer_internal(TALLOC_CTX *mem_ctx,
211 const struct auth_session_info *session_info,
212 struct messaging_context *msg_ctx,
213 const char *sharename,
215 struct spoolss_SetPrinterInfo2 *info2,
216 struct spoolss_DeviceMode *devmode,
217 struct security_descriptor *secdesc)
220 struct dcerpc_binding_handle *b;
223 tmp_ctx = talloc_stackframe();
224 if (tmp_ctx == NULL) {
225 return WERR_NOT_ENOUGH_MEMORY;
228 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
229 if (!W_ERROR_IS_OK(result)) {
230 talloc_free(tmp_ctx);
234 result = winreg_update_printer(mem_ctx,
242 talloc_free(tmp_ctx);
246 WERROR winreg_set_printer_dataex_internal(TALLOC_CTX *mem_ctx,
247 const struct auth_session_info *session_info,
248 struct messaging_context *msg_ctx,
252 enum winreg_Type type,
257 struct dcerpc_binding_handle *b;
260 tmp_ctx = talloc_stackframe();
261 if (tmp_ctx == NULL) {
262 return WERR_NOT_ENOUGH_MEMORY;
265 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
266 if (!W_ERROR_IS_OK(result)) {
267 talloc_free(tmp_ctx);
271 result = winreg_set_printer_dataex(mem_ctx,
280 talloc_free(tmp_ctx);
284 WERROR winreg_enum_printer_dataex_internal(TALLOC_CTX *mem_ctx,
285 const struct auth_session_info *session_info,
286 struct messaging_context *msg_ctx,
289 uint32_t *pnum_values,
290 struct spoolss_PrinterEnumValues **penum_values)
293 struct dcerpc_binding_handle *b;
296 tmp_ctx = talloc_stackframe();
297 if (tmp_ctx == NULL) {
298 return WERR_NOT_ENOUGH_MEMORY;
301 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
302 if (!W_ERROR_IS_OK(result)) {
303 talloc_free(tmp_ctx);
307 result = winreg_enum_printer_dataex(mem_ctx,
314 talloc_free(tmp_ctx);
318 WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx,
319 const struct auth_session_info *session_info,
320 struct messaging_context *msg_ctx,
324 enum winreg_Type *type,
329 struct dcerpc_binding_handle *b;
332 tmp_ctx = talloc_stackframe();
333 if (tmp_ctx == NULL) {
334 return WERR_NOT_ENOUGH_MEMORY;
337 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
338 if (!W_ERROR_IS_OK(result)) {
339 talloc_free(tmp_ctx);
343 result = winreg_get_printer_dataex(mem_ctx,
352 talloc_free(tmp_ctx);
356 WERROR winreg_delete_printer_dataex_internal(TALLOC_CTX *mem_ctx,
357 const struct auth_session_info *session_info,
358 struct messaging_context *msg_ctx,
364 struct dcerpc_binding_handle *b;
367 tmp_ctx = talloc_stackframe();
368 if (tmp_ctx == NULL) {
369 return WERR_NOT_ENOUGH_MEMORY;
372 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
373 if (!W_ERROR_IS_OK(result)) {
374 talloc_free(tmp_ctx);
378 result = winreg_delete_printer_dataex(mem_ctx,
384 talloc_free(tmp_ctx);
388 WERROR winreg_get_driver_internal(TALLOC_CTX *mem_ctx,
389 const struct auth_session_info *session_info,
390 struct messaging_context *msg_ctx,
391 const char *architecture,
392 const char *driver_name,
393 uint32_t driver_version,
394 struct spoolss_DriverInfo8 **_info8)
397 struct dcerpc_binding_handle *b;
400 tmp_ctx = talloc_stackframe();
401 if (tmp_ctx == NULL) {
402 return WERR_NOT_ENOUGH_MEMORY;
405 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
406 if (!W_ERROR_IS_OK(result)) {
407 talloc_free(tmp_ctx);
411 result = winreg_get_driver(mem_ctx,
418 talloc_free(tmp_ctx);
422 WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx,
423 const struct auth_session_info *session_info,
424 struct messaging_context *msg_ctx,
425 const char *architecture,
427 uint32_t *num_drivers,
428 const char ***drivers_p)
431 struct dcerpc_binding_handle *b;
434 tmp_ctx = talloc_stackframe();
435 if (tmp_ctx == NULL) {
436 return WERR_NOT_ENOUGH_MEMORY;
439 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
440 if (!W_ERROR_IS_OK(result)) {
441 talloc_free(tmp_ctx);
445 result = winreg_get_driver_list(mem_ctx,
452 talloc_free(tmp_ctx);
456 WERROR winreg_del_driver_internal(TALLOC_CTX *mem_ctx,
457 const struct auth_session_info *session_info,
458 struct messaging_context *msg_ctx,
459 struct spoolss_DriverInfo8 *info8,
463 struct dcerpc_binding_handle *b;
466 tmp_ctx = talloc_stackframe();
467 if (tmp_ctx == NULL) {
468 return WERR_NOT_ENOUGH_MEMORY;
471 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
472 if (!W_ERROR_IS_OK(result)) {
473 talloc_free(tmp_ctx);
477 result = winreg_del_driver(mem_ctx,
482 talloc_free(tmp_ctx);
486 WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx,
487 const struct auth_session_info *session_info,
488 struct messaging_context *msg_ctx,
489 struct spoolss_AddDriverInfoCtr *r,
490 const char **driver_name,
491 uint32_t *driver_version)
494 struct dcerpc_binding_handle *b;
497 tmp_ctx = talloc_stackframe();
498 if (tmp_ctx == NULL) {
499 return WERR_NOT_ENOUGH_MEMORY;
502 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
503 if (!W_ERROR_IS_OK(result)) {
504 talloc_free(tmp_ctx);
508 result = winreg_add_driver(mem_ctx,
514 talloc_free(tmp_ctx);
518 WERROR winreg_get_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
519 const struct auth_session_info *session_info,
520 struct messaging_context *msg_ctx,
521 const char *sharename,
522 struct spoolss_security_descriptor **psecdesc)
525 struct dcerpc_binding_handle *b;
528 tmp_ctx = talloc_stackframe();
529 if (tmp_ctx == NULL) {
530 return WERR_NOT_ENOUGH_MEMORY;
533 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
534 if (!W_ERROR_IS_OK(result)) {
535 talloc_free(tmp_ctx);
539 result = winreg_get_printer_secdesc(mem_ctx,
544 talloc_free(tmp_ctx);
548 WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
549 const struct auth_session_info *session_info,
550 struct messaging_context *msg_ctx,
551 const char *sharename,
552 const struct spoolss_security_descriptor *secdesc)
555 struct dcerpc_binding_handle *b;
558 tmp_ctx = talloc_stackframe();
559 if (tmp_ctx == NULL) {
560 return WERR_NOT_ENOUGH_MEMORY;
563 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
564 if (!W_ERROR_IS_OK(result)) {
565 talloc_free(tmp_ctx);
569 result = winreg_set_printer_secdesc(mem_ctx,
574 talloc_free(tmp_ctx);
578 WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx,
579 const struct auth_session_info *session_info,
580 struct messaging_context *msg_ctx,
582 union spoolss_FormInfo **pinfo)
585 struct dcerpc_binding_handle *b;
588 tmp_ctx = talloc_stackframe();
589 if (tmp_ctx == NULL) {
590 return WERR_NOT_ENOUGH_MEMORY;
593 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
594 if (!W_ERROR_IS_OK(result)) {
595 talloc_free(tmp_ctx);
599 result = winreg_printer_enumforms1(mem_ctx,
604 talloc_free(tmp_ctx);
608 WERROR winreg_printer_getform1_internal(TALLOC_CTX *mem_ctx,
609 const struct auth_session_info *session_info,
610 struct messaging_context *msg_ctx,
611 const char *form_name,
612 struct spoolss_FormInfo1 *r)
615 struct dcerpc_binding_handle *b;
618 tmp_ctx = talloc_stackframe();
619 if (tmp_ctx == NULL) {
620 return WERR_NOT_ENOUGH_MEMORY;
623 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
624 if (!W_ERROR_IS_OK(result)) {
625 talloc_free(tmp_ctx);
629 result = winreg_printer_getform1(mem_ctx,
634 talloc_free(tmp_ctx);
638 WERROR winreg_printer_addform1_internal(TALLOC_CTX *mem_ctx,
639 const struct auth_session_info *session_info,
640 struct messaging_context *msg_ctx,
641 struct spoolss_AddFormInfo1 *form)
644 struct dcerpc_binding_handle *b;
647 tmp_ctx = talloc_stackframe();
648 if (tmp_ctx == NULL) {
649 return WERR_NOT_ENOUGH_MEMORY;
652 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
653 if (!W_ERROR_IS_OK(result)) {
654 talloc_free(tmp_ctx);
658 result = winreg_printer_addform1(mem_ctx,
662 talloc_free(tmp_ctx);
666 WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx,
667 const struct auth_session_info *session_info,
668 struct messaging_context *msg_ctx,
669 const char *form_name,
670 struct spoolss_AddFormInfo1 *form)
673 struct dcerpc_binding_handle *b;
676 tmp_ctx = talloc_stackframe();
677 if (tmp_ctx == NULL) {
678 return WERR_NOT_ENOUGH_MEMORY;
681 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
682 if (!W_ERROR_IS_OK(result)) {
683 talloc_free(tmp_ctx);
687 result = winreg_printer_setform1(mem_ctx,
692 talloc_free(tmp_ctx);
696 WERROR winreg_printer_deleteform1_internal(TALLOC_CTX *mem_ctx,
697 const struct auth_session_info *session_info,
698 struct messaging_context *msg_ctx,
699 const char *form_name)
702 struct dcerpc_binding_handle *b;
705 tmp_ctx = talloc_stackframe();
706 if (tmp_ctx == NULL) {
707 return WERR_NOT_ENOUGH_MEMORY;
710 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
711 if (!W_ERROR_IS_OK(result)) {
712 talloc_free(tmp_ctx);
716 result = winreg_printer_deleteform1(mem_ctx,
720 talloc_free(tmp_ctx);
724 WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx,
725 const struct auth_session_info *session_info,
726 struct messaging_context *msg_ctx,
729 uint32_t *pnum_subkeys,
730 const char ***psubkeys)
733 struct dcerpc_binding_handle *b;
736 tmp_ctx = talloc_stackframe();
737 if (tmp_ctx == NULL) {
738 return WERR_NOT_ENOUGH_MEMORY;
741 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
742 if (!W_ERROR_IS_OK(result)) {
743 talloc_free(tmp_ctx);
747 result = winreg_enum_printer_key(mem_ctx,
754 talloc_free(tmp_ctx);