#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
/*****************************************************************
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;
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;
}
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);
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. */
/* 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);
/* 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);
* 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)
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)) {
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;
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;
}
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;
}
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;
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;
}
/* 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);
}
#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)
}
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;