From cd3082b03487eaeddb0105807b5ad39b47aa65f1 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <asn@samba.org>
Date: Tue, 8 Nov 2016 12:20:41 +0100
Subject: [PATCH] s3-spoolss: Remove printer from registry if it is unpublished

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11665

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
---
 source3/rpc_server/spoolss/srv_spoolss_nt.c | 34 ++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 556cd4f..f1ab3fb 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -4194,6 +4194,7 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
 				      int snum)
 {
 	struct auth_serversupplied_info *session_info;
+	struct spoolss_PrinterInfo2 *pinfo2 = NULL;
 	char *printer;
 	NTSTATUS status;
 	WERROR werr;
@@ -4218,7 +4219,7 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
 	}
 
 	if (is_printer_published(tmp_ctx, session_info, msg_ctx,
-				 servername, printer, NULL)) {
+				 servername, printer, &pinfo2)) {
 		struct GUID guid;
 		werr = nt_printer_guid_get(tmp_ctx, session_info, msg_ctx,
 					   printer, &guid);
@@ -4230,10 +4231,33 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
 			werr = nt_printer_guid_retrieve(tmp_ctx, printer,
 							&guid);
 			if (!W_ERROR_IS_OK(werr)) {
-				DEBUG(1, ("Failed to retrieve GUID for "
-					  "printer [%s] from AD - "
-					  "Is the the printer still "
-					  "published ?\n", printer));
+				DEBUG(3, ("Failed to retrieve GUID for "
+					  "printer [%s] from AD - %s\n",
+					  printer,
+					  win_errstr(werr)));
+				if (W_ERROR_EQUAL(werr, WERR_FILE_NOT_FOUND)) {
+					/*
+					 * If we did not find it in AD, then it
+					 * is unpublished and we should reflect
+					 * this in the registry and return
+					 * success.
+					 */
+					DEBUG(1, ("Unpublish printer [%s]\n",
+						  pinfo2->sharename));
+					nt_printer_publish(tmp_ctx,
+							   session_info,
+							   msg_ctx,
+							   pinfo2,
+							   DSPRINT_UNPUBLISH);
+					r->guid = talloc_strdup(mem_ctx, "");
+					r->action = DSPRINT_UNPUBLISH;
+
+					if (r->guid == NULL) {
+						werr = WERR_NOT_ENOUGH_MEMORY;
+					} else {
+						werr = WERR_OK;
+					}
+				}
 				goto out_tmp_free;
 			}
 
-- 
2.10.1

