#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
/*****************************************************************
****************************************************************/
-static void store_printer_guid(const char *printer, struct GUID guid)
+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;
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,
- smbd_messaging_context(),
+ result = winreg_set_printer_dataex_internal(tmp_ctx, session_info, msg_ctx,
printer,
SPOOL_DSSPOOLER_KEY, "objectGUID",
REG_SZ, blob.data, blob.length);
talloc_free(tmp_ctx);
}
-static WERROR nt_printer_publish_ads(ADS_STRUCT *ads,
+static WERROR nt_printer_publish_ads(struct messaging_context *msg_ctx,
+ ADS_STRUCT *ads,
struct spoolss_PrinterInfo2 *pinfo2)
{
ADS_STATUS ads_rc;
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(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,
- smbd_messaging_context(),
+ 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)) {
switch (action) {
case DSPRINT_PUBLISH:
case DSPRINT_UPDATE:
- win_rc = nt_printer_publish_ads(ads, pinfo2);
+ win_rc = nt_printer_publish_ads(msg_ctx, ads, pinfo2);
break;
case DSPRINT_UNPUBLISH:
win_rc = nt_printer_unpublish_ads(ads, pinfo2->sharename);
return win_rc;
}
-WERROR check_published_printers(void)
+WERROR check_published_printers(struct messaging_context *msg_ctx)
{
ADS_STATUS ads_rc;
ADS_STRUCT *ads = NULL;
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,
- smbd_messaging_context(), NULL,
- lp_servicename(snum), &pinfo2);
+ result = winreg_get_printer_internal(tmp_ctx, session_info, msg_ctx,
+ lp_servicename(snum),
+ &pinfo2);
if (!W_ERROR_IS_OK(result)) {
continue;
}
if (pinfo2->attributes & PRINTER_ATTRIBUTE_PUBLISHED) {
- nt_printer_publish_ads(ads, pinfo2);
+ nt_printer_publish_ads(msg_ctx, ads, pinfo2);
}
TALLOC_FREE(pinfo2);
}
bool is_printer_published(TALLOC_CTX *mem_ctx,
- struct auth_serversupplied_info *server_info,
- char *servername, char *printer, struct GUID *guid,
+ const struct auth_session_info *session_info,
+ struct messaging_context *msg_ctx,
+ 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,
- smbd_messaging_context(),
- 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, printer,
+ result = winreg_get_printer_dataex(mem_ctx, b,
+ printer,
SPOOL_DSSPOOLER_KEY, "objectGUID",
&type, &data, &data_size);
if (!W_ERROR_IS_OK(result)) {
}
#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)
{
return WERR_OK;
}
-WERROR check_published_printers(void)
+WERROR check_published_printers(struct messaging_context *msg_ctx)
{
return WERR_OK;
}
bool is_printer_published(TALLOC_CTX *mem_ctx,
- struct auth_serversupplied_info *server_info,
- char *servername, char *printer, struct GUID *guid,
+ const struct auth_session_info *session_info,
+ struct messaging_context *msg_ctx,
+ const char *servername,
+ const char *printer,
+ struct GUID *guid,
struct spoolss_PrinterInfo2 **info2)
{
return False;