summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs-xml/smbdotconf/printing/printnotifybackchannel.xml18
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/param/loadparm.c12
-rw-r--r--source3/rpc_server/spoolss/srv_spoolss_nt.c6
4 files changed, 37 insertions, 0 deletions
diff --git a/docs-xml/smbdotconf/printing/printnotifybackchannel.xml b/docs-xml/smbdotconf/printing/printnotifybackchannel.xml
new file mode 100644
index 0000000000..f895f9c70c
--- /dev/null
+++ b/docs-xml/smbdotconf/printing/printnotifybackchannel.xml
@@ -0,0 +1,18 @@
+<samba:parameter name="print notify backchannel"
+ context="S"
+ print="1"
+ type="boolean"
+ xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+<para>Windows print clients can update print queue status by expecting
+ the server to open a backchannel SMB connection to them. Due to
+ client firewall settings this can cause considerable timeouts
+ and will often fail, as there is no guarantee the client is even
+ running an SMB server. By setting this parameter to <constant>no</constant>
+ the Samba print server will not try to connect back to clients
+ and treat corresponding requests as if the connection back to
+ the client failed. The default setting of <constant>yes</constant>
+ causes smbd to attempt this connection.
+</description>
+<value type="default">yes</value>
+</samba:parameter>
diff --git a/source3/include/proto.h b/source3/include/proto.h
index f944b2a58d..9edbfc5902 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -3199,6 +3199,7 @@ bool lp_guest_ok(int );
bool lp_guest_only(int );
bool lp_administrative_share(int );
bool lp_print_ok(int );
+bool lp_print_notify_backchannel(int );
bool lp_map_hidden(int );
bool lp_map_archive(int );
bool lp_store_dos_attributes(int );
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 3314ad26ca..f9b8f70670 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -474,6 +474,7 @@ struct service {
bool bAdministrative_share;
bool bGuest_ok;
bool bPrint_ok;
+ bool bPrintNotifyBackchannel;
bool bMap_system;
bool bMap_hidden;
bool bMap_archive;
@@ -618,6 +619,7 @@ static struct service sDefault = {
False, /* bAdministrative_share */
False, /* bGuest_ok */
False, /* bPrint_ok */
+ True, /* bPrintNotifyBackchannel */
False, /* bMap_system */
False, /* bMap_hidden */
True, /* bMap_archive */
@@ -2713,6 +2715,15 @@ static struct parm_struct parm_table[] = {
.flags = FLAG_ADVANCED | FLAG_PRINT,
},
{
+ .label = "print notify backchannel",
+ .type = P_BOOL,
+ .p_class = P_LOCAL,
+ .ptr = &sDefault.bPrintNotifyBackchannel,
+ .special = NULL,
+ .enum_list = NULL,
+ .flags = FLAG_ADVANCED,
+ },
+ {
.label = "print ok",
.type = P_BOOL,
.p_class = P_LOCAL,
@@ -5918,6 +5929,7 @@ FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
FN_LOCAL_BOOL(lp_administrative_share, bAdministrative_share)
FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
+FN_LOCAL_BOOL(lp_print_notify_backchannel, bPrintNotifyBackchannel)
FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 3026a889e6..030324c085 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -2736,6 +2736,12 @@ WERROR _spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct pipes_struct *p,
DEBUG(10,("_spoolss_RemoteFindFirstPrinterChangeNotifyEx: "
"client_address is %s\n", p->client_id->addr));
+ if (!lp_print_notify_backchannel(snum)) {
+ DEBUG(10, ("_spoolss_RemoteFindFirstPrinterChangeNotifyEx: "
+ "backchannel disabled\n"));
+ return WERR_SERVER_UNAVAILABLE;
+ }
+
if (!interpret_string_addr(&client_ss, p->client_id->addr,
AI_NUMERICHOST)) {
return WERR_SERVER_UNAVAILABLE;