s3-param: Rename loadparm_s3_context -> loadparm_s3_helpers
[kai/samba.git] / source3 / printing / nt_printing_ads.c
index de24ce82ac8f2e25df04b1ae7e20ed9d3980776a..3551148565de2576e241781cf95ab8bec40c31ab 100644 (file)
 
 #include "includes.h"
 #include "../librpc/gen_ndr/spoolss.h"
-#include "rpc_server/srv_spoolss_util.h"
+#include "rpc_server/spoolss/srv_spoolss_util.h"
 #include "nt_printing.h"
 #include "ads.h"
 #include "secrets.h"
 #include "krb5_env.h"
+#include "../libcli/registry/util_reg.h"
+#include "auth.h"
+#include "../librpc/ndr/libndr.h"
+#include "rpc_client/cli_winreg_spoolss.h"
 
 #ifdef HAVE_ADS
 /*****************************************************************
@@ -35,7 +39,7 @@ static void store_printer_guid(struct messaging_context *msg_ctx,
                               const char *printer, struct GUID guid)
 {
        TALLOC_CTX *tmp_ctx;
-       struct auth_serversupplied_info *server_info = NULL;
+       struct auth_session_info *session_info = NULL;
        const char *guid_str;
        DATA_BLOB blob;
        NTSTATUS status;
@@ -47,10 +51,10 @@ static void store_printer_guid(struct messaging_context *msg_ctx,
                return;
        }
 
-       status = make_server_info_system(tmp_ctx, &server_info);
+       status = make_session_info_system(tmp_ctx, &session_info);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("store_printer_guid: "
-                         "Could not create system server_info\n"));
+                         "Could not create system session_info\n"));
                goto done;
        }
 
@@ -70,7 +74,7 @@ static void store_printer_guid(struct messaging_context *msg_ctx,
                goto done;
        }
 
-       result = winreg_set_printer_dataex(tmp_ctx, server_info, msg_ctx,
+       result = winreg_set_printer_dataex_internal(tmp_ctx, session_info, msg_ctx,
                                           printer,
                                           SPOOL_DSSPOOLER_KEY, "objectGUID",
                                           REG_SZ, blob.data, blob.length);
@@ -108,7 +112,7 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
        DEBUG(5, ("publishing printer %s\n", printer));
 
        /* figure out where to publish */
-       ads_find_machine_acct(ads, &res, global_myname());
+       ads_find_machine_acct(ads, &res, lp_netbios_name());
 
        /* We use ldap_get_dn here as we need the answer
         * in utf8 to call ldap_explode_dn(). JRA. */
@@ -187,10 +191,13 @@ static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
 
        /* 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);
-               ads_pull_guid(ads, res, &guid);
+               guid_ok = ads_pull_guid(ads, res, &guid);
                ads_msgfree(ads, res);
-               store_printer_guid(msg_ctx, printer, guid);
+               if (guid_ok) {
+                       store_printer_guid(msg_ctx, printer, guid);
+               }
        }
        TALLOC_FREE(ctx);
 
@@ -208,7 +215,7 @@ static WERROR nt_printer_unpublish_ads(ADS_STRUCT *ads,
 
        /* remove the printer from the directory */
        ads_rc = ads_find_printer_on_server(ads, &res,
-                                           printer, global_myname());
+                                           printer, lp_netbios_name());
 
        if (ADS_ERR_OK(ads_rc) && res && ads_count_replies(ads, res)) {
                prt_dn = ads_get_dn(ads, talloc_tos(), res);
@@ -230,14 +237,14 @@ static WERROR nt_printer_unpublish_ads(ADS_STRUCT *ads,
  * Publish a printer in the directory
  *
  * @param mem_ctx      memory context
- * @param server_info  server_info to access winreg pipe
+ * @param session_info  session_info to access winreg pipe
  * @param pinfo2       printer information
  * @param action       publish/unpublish action
  * @return WERROR indicating status of publishing
  ***************************************************************************/
 
 WERROR nt_printer_publish(TALLOC_CTX *mem_ctx,
-                         struct auth_serversupplied_info *server_info,
+                         const struct auth_session_info *session_info,
                          struct messaging_context *msg_ctx,
                          struct spoolss_PrinterInfo2 *pinfo2,
                          int action)
@@ -268,7 +275,7 @@ WERROR nt_printer_publish(TALLOC_CTX *mem_ctx,
 
        sinfo2->attributes = pinfo2->attributes;
 
-       win_rc = winreg_update_printer(mem_ctx, server_info, msg_ctx,
+       win_rc = winreg_update_printer_internal(mem_ctx, session_info, msg_ctx,
                                        pinfo2->sharename, info2_mask,
                                        sinfo2, NULL, NULL);
        if (!W_ERROR_IS_OK(win_rc)) {
@@ -319,7 +326,7 @@ WERROR check_published_printers(struct messaging_context *msg_ctx)
        int snum;
        int n_services = lp_numservices();
        TALLOC_CTX *tmp_ctx = NULL;
-       struct auth_serversupplied_info *server_info = NULL;
+       struct auth_session_info *session_info = NULL;
        struct spoolss_PrinterInfo2 *pinfo2;
        NTSTATUS status;
        WERROR result;
@@ -345,10 +352,10 @@ WERROR check_published_printers(struct messaging_context *msg_ctx)
                goto done;
        }
 
-       status = make_server_info_system(tmp_ctx, &server_info);
+       status = make_session_info_system(tmp_ctx, &session_info);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("check_published_printers: "
-                         "Could not create system server_info\n"));
+                         "Could not create system session_info\n"));
                result = WERR_ACCESS_DENIED;
                goto done;
        }
@@ -358,8 +365,8 @@ WERROR check_published_printers(struct messaging_context *msg_ctx)
                        continue;
                }
 
-               result = winreg_get_printer(tmp_ctx, server_info, msg_ctx,
-                                           NULL, lp_servicename(snum),
+               result = winreg_get_printer_internal(tmp_ctx, session_info, msg_ctx,
+                                           lp_servicename(snum),
                                            &pinfo2);
                if (!W_ERROR_IS_OK(result)) {
                        continue;
@@ -381,9 +388,11 @@ done:
 }
 
 bool is_printer_published(TALLOC_CTX *mem_ctx,
-                         struct auth_serversupplied_info *server_info,
+                         const struct auth_session_info *session_info,
                          struct messaging_context *msg_ctx,
-                         char *servername, char *printer, struct GUID *guid,
+                         const char *servername,
+                         const char *printer,
+                         struct GUID *guid,
                          struct spoolss_PrinterInfo2 **info2)
 {
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
@@ -392,9 +401,18 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
        uint32_t data_size;
        WERROR result;
        NTSTATUS status;
+       struct dcerpc_binding_handle *b;
+
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return false;
+       }
 
-       result = winreg_get_printer(mem_ctx, server_info, msg_ctx,
-                                   servername, printer, &pinfo2);
+       result = winreg_get_printer(mem_ctx, b,
+                                   printer, &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
                return false;
        }
@@ -410,7 +428,7 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
 
        /* fetching printer guids really ought to be a separate function. */
 
-       result = winreg_get_printer_dataex(mem_ctx, server_info, msg_ctx,
+       result = winreg_get_printer_dataex(mem_ctx, b,
                                           printer,
                                           SPOOL_DSSPOOLER_KEY, "objectGUID",
                                           &type, &data, &data_size);
@@ -453,7 +471,7 @@ done:
 }
 #else
 WERROR nt_printer_publish(TALLOC_CTX *mem_ctx,
-                         struct auth_serversupplied_info *server_info,
+                         const struct auth_session_info *session_info,
                          struct messaging_context *msg_ctx,
                          struct spoolss_PrinterInfo2 *pinfo2,
                          int action)
@@ -467,9 +485,11 @@ WERROR check_published_printers(struct messaging_context *msg_ctx)
 }
 
 bool is_printer_published(TALLOC_CTX *mem_ctx,
-                         struct auth_serversupplied_info *server_info,
+                         const struct auth_session_info *session_info,
                          struct messaging_context *msg_ctx,
-                         char *servername, char *printer, struct GUID *guid,
+                         const char *servername,
+                         const char *printer,
+                         struct GUID *guid,
                          struct spoolss_PrinterInfo2 **info2)
 {
        return False;