]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/samba/samba-3.6.99-nt_printer_publish_guid.patch
Merge remote-tracking branch 'origin/next'
[ipfire-2.x.git] / src / patches / samba / samba-3.6.99-nt_printer_publish_guid.patch
diff --git a/src/patches/samba/samba-3.6.99-nt_printer_publish_guid.patch b/src/patches/samba/samba-3.6.99-nt_printer_publish_guid.patch
deleted file mode 100644 (file)
index 820d136..0000000
+++ /dev/null
@@ -1,620 +0,0 @@
-From 892d163635563a3505fcde2d3439a2f6b1af92a7 Mon Sep 17 00:00:00 2001
-From: David Disseldorp <ddiss@samba.org>
-Date: Thu, 18 Dec 2014 18:18:21 +0100
-Subject: [PATCH 1/4] PATCHSET16: printing: split out printer DN and GUID
- retrieval
-
-This functions are used for printer publishing.
-
-BUG: https://bugzilla.samba.org/show_bug.cgi?id=11018
-
-Pair-programmed-with: Andreas Schneider <asn@samba.org>
-Signed-off-by: David Disseldorp <ddiss@samba.org>
-Signed-off-by: Andreas Schneider <asn@samba.org>
-Reviewed-by: Guenther Deschner <gd@samba.org>
-(cherry picked from commit 7cabd89789a50d37fc32735968c493092a37e69f)
----
- source3/printing/nt_printing_ads.c | 209 ++++++++++++++++++++++++-------------
- 1 file changed, 137 insertions(+), 72 deletions(-)
-
-diff --git a/source3/printing/nt_printing_ads.c b/source3/printing/nt_printing_ads.c
-index bf309b0..25e1ab6 100644
---- a/source3/printing/nt_printing_ads.c
-+++ b/source3/printing/nt_printing_ads.c
-@@ -87,6 +87,128 @@ done:
-       talloc_free(tmp_ctx);
- }
-+static WERROR nt_printer_dn_lookup(TALLOC_CTX *mem_ctx,
-+                                 ADS_STRUCT *ads,
-+                                 const char *printer,
-+                                 char **pprinter_dn)
-+{
-+      char *printer_dn = NULL;
-+      char *srv_dn = NULL;
-+      char *srv_cn_0 = NULL;
-+      char *srv_cn_escaped = NULL;
-+      char *sharename_escaped = NULL;
-+      char *srv_dn_utf8 = NULL;
-+      char **srv_cn_utf8 = NULL;
-+      size_t converted_size;
-+      ADS_STATUS ads_status;
-+      LDAPMessage *res;
-+      WERROR result;
-+      bool ok;
-+
-+      ads_status = ads_find_machine_acct(ads, &res, global_myname());
-+      if (!ADS_ERR_OK(ads_status)) {
-+              DEBUG(2, ("Failed to find machine account for %s\n",
-+                        global_myname()));
-+              result = WERR_NOT_FOUND;
-+              goto err_out;
-+      }
-+
-+      /*
-+       * We use ldap_get_dn here as we need the answer in utf8 to call
-+       * ldap_explode_dn(). JRA.
-+       */
-+      srv_dn_utf8 = ldap_get_dn((LDAP *)ads->ldap.ld, (LDAPMessage *)res);
-+      ads_msgfree(ads, res);
-+      if (srv_dn_utf8 == NULL) {
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      srv_cn_utf8 = ldap_explode_dn(srv_dn_utf8, 1);
-+      if (srv_cn_utf8 == NULL) {
-+              ldap_memfree(srv_dn_utf8);
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      /* Now convert to CH_UNIX. */
-+      ok = pull_utf8_talloc(mem_ctx, &srv_dn, srv_dn_utf8, &converted_size);
-+      ldap_memfree(srv_dn_utf8);
-+      if (!ok) {
-+              ldap_memfree(srv_cn_utf8);
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      ok = pull_utf8_talloc(mem_ctx, &srv_cn_0, srv_cn_utf8[0], &converted_size);
-+      ldap_memfree(srv_cn_utf8);
-+      if (!ok) {
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      srv_cn_escaped = escape_rdn_val_string_alloc(srv_cn_0);
-+      if (srv_cn_escaped == NULL) {
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      sharename_escaped = escape_rdn_val_string_alloc(printer);
-+      if (sharename_escaped == NULL) {
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto err_out;
-+      }
-+
-+      printer_dn = talloc_asprintf(mem_ctx,
-+                                   "cn=%s-%s,%s",
-+                                   srv_cn_escaped,
-+                                   sharename_escaped,
-+                                   srv_dn);
-+      if (printer_dn == NULL) {
-+              result = WERR_NOMEM;
-+              goto err_out;
-+      }
-+
-+      *pprinter_dn = printer_dn;
-+
-+      result = WERR_OK;
-+err_out:
-+      SAFE_FREE(sharename_escaped);
-+      SAFE_FREE(srv_cn_escaped);
-+      TALLOC_FREE(srv_cn_0);
-+      TALLOC_FREE(srv_dn);
-+      return result;
-+}
-+
-+static WERROR nt_printer_guid_retrieve_internal(ADS_STRUCT *ads,
-+                                              const char *printer_dn,
-+                                              struct GUID *pguid)
-+{
-+      ADS_STATUS ads_status;
-+      LDAPMessage *res;
-+      const char *attrs[] = {"objectGUID", NULL};
-+      struct GUID guid;
-+      bool ok;
-+
-+      ads_status = ads_search_dn(ads, &res, printer_dn, attrs);
-+      if (!ADS_ERR_OK(ads_status)) {
-+              DEBUG(2, ("Failed to retrieve GUID from DC - %s\n",
-+                        ads_errstr(ads_status)));
-+              return WERR_BADFILE;
-+      }
-+
-+      ZERO_STRUCT(guid);
-+      ok = ads_pull_guid(ads, res, &guid);
-+      ads_msgfree(ads, res);
-+      if (!ok) {
-+              return WERR_NOMEM;
-+      }
-+
-+      *pguid = guid;
-+
-+      return WERR_OK;
-+}
-+
- WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx,
-                          const struct auth_serversupplied_info *session_info,
-                          struct messaging_context *msg_ctx,
-@@ -246,16 +368,12 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-                                    struct spoolss_PrinterInfo2 *pinfo2)
- {
-       ADS_STATUS ads_rc;
--      LDAPMessage *res;
--      char *prt_dn = NULL, *srv_dn, *srv_cn_0, *srv_cn_escaped, *sharename_escaped;
--      char *srv_dn_utf8, **srv_cn_utf8;
-       TALLOC_CTX *ctx;
-       ADS_MODLIST mods;
--      const char *attrs[] = {"objectGUID", NULL};
-       struct GUID guid;
-       WERROR win_rc = WERR_OK;
--      size_t converted_size;
-       const char *printer = pinfo2->sharename;
-+      char *printer_dn = NULL;
-       /* build the ads mods */
-       ctx = talloc_init("nt_printer_publish_ads");
-@@ -265,65 +383,13 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-       DEBUG(5, ("publishing printer %s\n", printer));
--      /* figure out where to publish */
--      ads_rc = ads_find_machine_acct(ads, &res, global_myname());
--      if (!ADS_ERR_OK(ads_rc)) {
--              DEBUG(0, ("failed to find machine account for %s\n",
--                        global_myname()));
--              TALLOC_FREE(ctx);
--              return WERR_NOT_FOUND;
--      }
--
--      /* We use ldap_get_dn here as we need the answer
--       * in utf8 to call ldap_explode_dn(). JRA. */
--
--      srv_dn_utf8 = ldap_get_dn((LDAP *)ads->ldap.ld, (LDAPMessage *)res);
--      ads_msgfree(ads, res);
--      if (!srv_dn_utf8) {
--              TALLOC_FREE(ctx);
--              return WERR_SERVER_UNAVAILABLE;
--      }
--      srv_cn_utf8 = ldap_explode_dn(srv_dn_utf8, 1);
--      if (!srv_cn_utf8) {
--              TALLOC_FREE(ctx);
--              ldap_memfree(srv_dn_utf8);
--              return WERR_SERVER_UNAVAILABLE;
--      }
--      /* Now convert to CH_UNIX. */
--      if (!pull_utf8_talloc(ctx, &srv_dn, srv_dn_utf8, &converted_size)) {
--              TALLOC_FREE(ctx);
--              ldap_memfree(srv_dn_utf8);
--              ldap_memfree(srv_cn_utf8);
--              return WERR_SERVER_UNAVAILABLE;
--      }
--      if (!pull_utf8_talloc(ctx, &srv_cn_0, srv_cn_utf8[0], &converted_size)) {
--              TALLOC_FREE(ctx);
--              ldap_memfree(srv_dn_utf8);
--              ldap_memfree(srv_cn_utf8);
--              TALLOC_FREE(srv_dn);
--              return WERR_SERVER_UNAVAILABLE;
--      }
--
--      ldap_memfree(srv_dn_utf8);
--      ldap_memfree(srv_cn_utf8);
--
--      srv_cn_escaped = escape_rdn_val_string_alloc(srv_cn_0);
--      if (!srv_cn_escaped) {
--              TALLOC_FREE(ctx);
--              return WERR_SERVER_UNAVAILABLE;
--      }
--      sharename_escaped = escape_rdn_val_string_alloc(printer);
--      if (!sharename_escaped) {
--              SAFE_FREE(srv_cn_escaped);
-+      win_rc = nt_printer_dn_lookup(ctx, ads, printer, &printer_dn);
-+      if (!W_ERROR_IS_OK(win_rc)) {
-+              DEBUG(2, ("Failed to create printer dn\n"));
-               TALLOC_FREE(ctx);
--              return WERR_SERVER_UNAVAILABLE;
-+              return win_rc;
-       }
--      prt_dn = talloc_asprintf(ctx, "cn=%s-%s,%s", srv_cn_escaped, sharename_escaped, srv_dn);
--
--      SAFE_FREE(srv_cn_escaped);
--      SAFE_FREE(sharename_escaped);
--
-       mods = ads_init_mods(ctx);
-       if (mods == NULL) {
-@@ -338,13 +404,13 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-       }
-       /* publish it */
--      ads_rc = ads_mod_printer_entry(ads, prt_dn, ctx, &mods);
-+      ads_rc = ads_mod_printer_entry(ads, printer_dn, ctx, &mods);
-       if (ads_rc.err.rc == LDAP_NO_SUCH_OBJECT) {
-               int i;
-               for (i=0; mods[i] != 0; i++)
-                       ;
-               mods[i] = (LDAPMod *)-1;
--              ads_rc = ads_add_printer_entry(ads, prt_dn, ctx, &mods);
-+              ads_rc = ads_add_printer_entry(ads, printer_dn, ctx, &mods);
-       }
-       if (!ADS_ERR_OK(ads_rc)) {
-@@ -352,16 +418,15 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-                         printer, ads_errstr(ads_rc)));
-       }
--      /* retreive the guid and store it locally */
--      if (ADS_ERR_OK(ads_search_dn(ads, &res, prt_dn, attrs))) {
--              bool guid_ok;
--              ZERO_STRUCT(guid);
--              guid_ok = ads_pull_guid(ads, res, &guid);
--              ads_msgfree(ads, res);
--              if (guid_ok) {
--                      store_printer_guid(msg_ctx, printer, guid);
--              }
-+      win_rc = nt_printer_guid_retrieve_internal(ads, printer_dn, &guid);
-+      if (!W_ERROR_IS_OK(win_rc)) {
-+              TALLOC_FREE(ctx);
-+              return win_rc;
-       }
-+
-+      /* TODO add a return value */
-+      store_printer_guid(msg_ctx, printer, guid);
-+
-       TALLOC_FREE(ctx);
-       return win_rc;
--- 
-2.3.0
-
-
-From 45bb946d93deaf4926754cf57454f79869e8bfaf Mon Sep 17 00:00:00 2001
-From: David Disseldorp <ddiss@samba.org>
-Date: Thu, 18 Dec 2014 18:23:11 +0100
-Subject: [PATCH 2/4] PATCHSET16: printing: add nt_printer_guid_retrieve()
- helper
-
-This function connects to the domain controller and retrieves the
-GUID for the corresponding printer DN.
-
-BUG: https://bugzilla.samba.org/show_bug.cgi?id=11018
-
-Pair-programmed-with: Andreas Schneider <asn@samba.org>
-Signed-off-by: David Disseldorp <ddiss@samba.org>
-Signed-off-by: Andreas Schneider <asn@samba.org>
-Reviewed-by: Guenther Deschner <gd@samba.org>
-(cherry picked from commit 38dbd054dc331a441b10fdebbdb4bd0fc51cfc0a)
----
- source3/include/nt_printing.h      |  3 ++
- source3/printing/nt_printing_ads.c | 58 ++++++++++++++++++++++++++++++++++++++
- 2 files changed, 61 insertions(+)
-
-diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
-index cdbad87..67a0522 100644
---- a/source3/include/nt_printing.h
-+++ b/source3/include/nt_printing.h
-@@ -132,6 +132,9 @@ bool print_access_check(const struct auth_serversupplied_info *server_info,
-                       struct messaging_context *msg_ctx, int snum,
-                       int access_type);
-+WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer,
-+                              struct GUID *pguid);
-+
- WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx,
-                          const struct auth_serversupplied_info *server_info,
-                          struct messaging_context *msg_ctx,
-diff --git a/source3/printing/nt_printing_ads.c b/source3/printing/nt_printing_ads.c
-index 25e1ab6..6fa4bfc 100644
---- a/source3/printing/nt_printing_ads.c
-+++ b/source3/printing/nt_printing_ads.c
-@@ -209,6 +209,58 @@ static WERROR nt_printer_guid_retrieve_internal(ADS_STRUCT *ads,
-       return WERR_OK;
- }
-+WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer,
-+                              struct GUID *pguid)
-+{
-+      ADS_STRUCT *ads = NULL;
-+      char *old_krb5ccname = NULL;
-+      char *printer_dn;
-+      WERROR result;
-+      ADS_STATUS ads_status;
-+      TALLOC_CTX *tmp_ctx;
-+
-+      tmp_ctx = talloc_new(mem_ctx);
-+      if (tmp_ctx == NULL) {
-+              return WERR_NOMEM;
-+      }
-+
-+      ads = ads_init(lp_realm(), lp_workgroup(), NULL);
-+      if (ads == NULL) {
-+              result = WERR_SERVER_UNAVAILABLE;
-+              goto out;
-+      }
-+
-+      old_krb5ccname = getenv(KRB5_ENV_CCNAME);
-+      setenv(KRB5_ENV_CCNAME, "MEMORY:prtpub_cache", 1);
-+      SAFE_FREE(ads->auth.password);
-+      ads->auth.password = secrets_fetch_machine_password(lp_workgroup(),
-+                                                          NULL, NULL);
-+
-+      ads_status = ads_connect(ads);
-+      if (!ADS_ERR_OK(ads_status)) {
-+              DEBUG(3, ("ads_connect failed: %s\n", ads_errstr(ads_status)));
-+              result = WERR_ACCESS_DENIED;
-+              goto out;
-+      }
-+
-+      result = nt_printer_dn_lookup(tmp_ctx, ads, printer, &printer_dn);
-+      if (!W_ERROR_IS_OK(result)) {
-+              goto out;
-+      }
-+
-+      result = nt_printer_guid_retrieve_internal(ads, printer_dn, pguid);
-+out:
-+      TALLOC_FREE(tmp_ctx);
-+      ads_destroy(&ads);
-+      ads_kdestroy("MEMORY:prtpub_cache");
-+      unsetenv(KRB5_ENV_CCNAME);
-+      if (old_krb5ccname != NULL) {
-+              setenv(KRB5_ENV_CCNAME, old_krb5ccname, 0);
-+      }
-+
-+      return result;
-+}
-+
- WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx,
-                          const struct auth_serversupplied_info *session_info,
-                          struct messaging_context *msg_ctx,
-@@ -652,6 +704,12 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
-       return true;
- }
- #else
-+WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer,
-+                              struct GUID *pguid)
-+{
-+      return WERR_NOT_SUPPORTED;
-+}
-+
- WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx,
-                          const struct auth_serversupplied_info *session_info,
-                          struct messaging_context *msg_ctx,
--- 
-2.3.0
-
-
-From 228323b1c846d6dfcd39e23c8ce850c79f339de9 Mon Sep 17 00:00:00 2001
-From: Andreas Schneider <asn@samba.org>
-Date: Thu, 18 Dec 2014 15:13:27 +0000
-Subject: [PATCH 3/4] PATCHSET16: printing: rework nt_printer_guid_store to
- return errors
-
-Callers can now choose whether or not to ignore errors.
-
-BUG: https://bugzilla.samba.org/show_bug.cgi?id=11018
-
-Pair-programmed-with: David Disseldorp <ddiss@samba.org>
-Signed-off-by: Andreas Schneider <asn@samba.org>
-Signed-off-by: David Disseldorp <ddiss@samba.org>
-Reviewed-by: Guenther Deschner <gd@samba.org>
-(cherry picked from commit 6595ced146a53dcef9bbd5d2deb82a44c8ce1a1a)
----
- source3/include/nt_printing.h      |  3 +++
- source3/printing/nt_printing_ads.c | 49 +++++++++++++++++++++++++-------------
- 2 files changed, 35 insertions(+), 17 deletions(-)
-
-diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
-index 67a0522..493f4ce 100644
---- a/source3/include/nt_printing.h
-+++ b/source3/include/nt_printing.h
-@@ -135,6 +135,9 @@ bool print_access_check(const struct auth_serversupplied_info *server_info,
- WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer,
-                               struct GUID *pguid);
-+WERROR nt_printer_guid_store(struct messaging_context *msg_ctx,
-+                           const char *printer, struct GUID guid);
-+
- WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx,
-                          const struct auth_serversupplied_info *server_info,
-                          struct messaging_context *msg_ctx,
-diff --git a/source3/printing/nt_printing_ads.c b/source3/printing/nt_printing_ads.c
-index 6fa4bfc..540a8a3 100644
---- a/source3/printing/nt_printing_ads.c
-+++ b/source3/printing/nt_printing_ads.c
-@@ -35,32 +35,32 @@
- /*****************************************************************
-  ****************************************************************/
--static void store_printer_guid(struct messaging_context *msg_ctx,
--                             const char *printer, struct GUID guid)
-+WERROR nt_printer_guid_store(struct messaging_context *msg_ctx,
-+                           const char *printer, struct GUID guid)
- {
-       TALLOC_CTX *tmp_ctx;
--      struct auth_serversupplied_info *session_info = NULL;
-+      const struct auth_serversupplied_info *session_info;
-       const char *guid_str;
-       DATA_BLOB blob;
--      NTSTATUS status;
-       WERROR result;
-       tmp_ctx = talloc_new(NULL);
-       if (!tmp_ctx) {
--              DEBUG(0, ("store_printer_guid: Out of memory?!\n"));
--              return;
-+              DEBUG(0, ("Out of memory?!\n"));
-+              return WERR_NOMEM;
-       }
--      status = make_session_info_system(tmp_ctx, &session_info);
--      if (!NT_STATUS_IS_OK(status)) {
--              DEBUG(0, ("store_printer_guid: "
--                        "Could not create system session_info\n"));
-+      session_info = get_session_info_system();
-+      if (session_info == NULL) {
-+              DEBUG(0, ("Could not get system session_info\n"));
-+              result = WERR_NOMEM;
-               goto done;
-       }
-       guid_str = GUID_string(tmp_ctx, &guid);
-       if (!guid_str) {
--              DEBUG(0, ("store_printer_guid: Out of memory?!\n"));
-+              DEBUG(0, ("Out of memory?!\n"));
-+              result = WERR_NOMEM;
-               goto done;
-       }
-@@ -68,9 +68,9 @@ static void store_printer_guid(struct messaging_context *msg_ctx,
-          Vista to whine */
-       if (!push_reg_sz(tmp_ctx, &blob, guid_str)) {
--              DEBUG(0, ("store_printer_guid: "
--                        "Could not marshall string %s for objectGUID\n",
-+              DEBUG(0, ("Could not marshall string %s for objectGUID\n",
-                         guid_str));
-+              result = WERR_NOMEM;
-               goto done;
-       }
-@@ -79,12 +79,15 @@ static void store_printer_guid(struct messaging_context *msg_ctx,
-                                          SPOOL_DSSPOOLER_KEY, "objectGUID",
-                                          REG_SZ, blob.data, blob.length);
-       if (!W_ERROR_IS_OK(result)) {
--              DEBUG(0, ("store_printer_guid: "
--                        "Failed to store GUID for printer %s\n", printer));
-+              DEBUG(0, ("Failed to store GUID for printer %s\n", printer));
-+              goto done;
-       }
-+      result = WERR_OK;
- done:
-       talloc_free(tmp_ctx);
-+
-+      return result;
- }
- static WERROR nt_printer_dn_lookup(TALLOC_CTX *mem_ctx,
-@@ -468,6 +471,7 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-       if (!ADS_ERR_OK(ads_rc)) {
-               DEBUG(3, ("error publishing %s: %s\n",
-                         printer, ads_errstr(ads_rc)));
-+              /* XXX failed to publish, so no guid to retrieve */
-       }
-       win_rc = nt_printer_guid_retrieve_internal(ads, printer_dn, &guid);
-@@ -476,8 +480,13 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
-               return win_rc;
-       }
--      /* TODO add a return value */
--      store_printer_guid(msg_ctx, printer, guid);
-+      win_rc = nt_printer_guid_store(msg_ctx, printer, guid);
-+      if (!W_ERROR_IS_OK(win_rc)) {
-+              DEBUG(3, ("failed to store printer %s guid\n",
-+                        printer));
-+              /* not catastrophic, retrieve on next use */
-+              win_rc = WERR_OK;
-+      }
-       TALLOC_FREE(ctx);
-@@ -704,6 +713,12 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
-       return true;
- }
- #else
-+WERROR nt_printer_guid_store(struct messaging_context *msg_ctx,
-+                         const char *printer, struct GUID guid)
-+{
-+      return WERR_NOT_SUPPORTED;
-+}
-+
- WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer,
-                               struct GUID *pguid)
- {
--- 
-2.3.0
-
-
-From d4847deadc4cd6f4f8071fae16d05bc8ec4ed566 Mon Sep 17 00:00:00 2001
-From: Andreas Schneider <asn@samba.org>
-Date: Thu, 18 Dec 2014 15:14:36 +0000
-Subject: [PATCH 4/4] PATCHSET16: spoolss: retrieve published printer GUID if
- not in registry
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When a printer is published, the GUID for the published DN is retrieved
-from the domain controller and stored in the registry.
-When handling a spoolss GetPrinter(level=7) request, the same GUID is
-obtained from the registry and returned to the client.
-
-This change sees the spoolss server query the DC for the published
-printer GUID if it is not present in the registry when handling a
-spoolss GetPrinter(level=7) request.
-
-BUG: https://bugzilla.samba.org/show_bug.cgi?id=11018
-
-Pair-Programmed-With: David Disseldorp <ddiss@samba.org>
-Signed-off-by: Andreas Schneider <asn@samba.org>
-Signed-off-by: David Disseldorp <ddiss@samba.org>
-Reviewed-by: Guenther Deschner <gd@samba.org>
-
-Autobuild-User(master): Günther Deschner <gd@samba.org>
-Autobuild-Date(master): Wed Feb 18 12:43:44 CET 2015 on sn-devel-104
-
-(cherry picked from commit a4157e7c5d75be7003ad0b72fdfe9856a9e5ba8f)
----
- source3/rpc_server/spoolss/srv_spoolss_nt.c | 20 +++++++++++++++++++-
- 1 file changed, 19 insertions(+), 1 deletion(-)
-
-diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
-index 0c4b582..516b7dc 100644
---- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
-+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
-@@ -4213,7 +4213,25 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
-               werr = nt_printer_guid_get(tmp_ctx, session_info, msg_ctx,
-                                          printer, &guid);
-               if (!W_ERROR_IS_OK(werr)) {
--                      goto out_tmp_free;
-+                      /*
-+                       * If we do not have a GUID entry in the registry, then
-+                       * try to retrieve it from AD and store it now.
-+                       */
-+                      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));
-+                              goto out_tmp_free;
-+                      }
-+
-+                      werr = nt_printer_guid_store(msg_ctx, printer, guid);
-+                      if (!W_ERROR_IS_OK(werr)) {
-+                              DEBUG(3, ("failed to store printer %s guid\n",
-+                                        printer));
-+                      }
-               }
-               r->guid = talloc_strdup_upper(mem_ctx, GUID_string2(mem_ctx, &guid));
-               r->action = DSPRINT_PUBLISH;
--- 
-2.3.0
-