]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Limit DNS-SD advertisements to the loopback interface for "localhost" and
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 21:39:48 +0000 (16:39 -0500)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 21:39:48 +0000 (16:39 -0500)
support "off" for subtypes to turn off advertisements (Issue #5666)

CHANGES.md
man/ippeveprinter.1
tools/ippeveprinter.c

index f526061a0a08284fcbb92079b3f2c7d867b54b44..d129605d359fa3ed4acf2e0d19b42140262e8513 100644 (file)
@@ -20,6 +20,8 @@ Changes in CUPS v2.3.1
   permissions are wrong (Issue #5658)
 - Added paint can labels to Dymo driver (Issue #5662)
 - The `ippeveprinter` program now supports authentication (Issue #5665)
+- The `ippeveprinter` program now advertises DNS-SD services on the correct
+  interfaces, and provides a way to turn them off (Issue #5666)
 - The `--with-dbusdir` option was ignored by the configure script (Issue #5671)
 - Sandboxed applications were not able to get the default printer (Issue #5676)
 - Log file access controls were not preserved by `cupsctl` (Issue #5677)
index 6fc30d3ec16e13bf127bc45bae40cb360ee3dffb..28e54acc4c69195f032b9c9f947e97354449dbc5 100644 (file)
@@ -182,6 +182,9 @@ command.
 Specifies the port number to listen on.
 The default is a user-specific number from 8000 to 8999.
 .TP 5
+.B \-r off
+Turns off DNS-SD service advertisements entirely.
+.TP 5
 \fB\-r \fIsubtype[,subtype]\fR
 Specifies the DNS-SD subtype(s) to advertise.
 Separate multiple subtypes with a comma.
index a35c7321dc2775d28087c4a1b9b70cda6cf79c29..930331e0fe9d05111ca08a3e8d74a3851f9d65a5 100644 (file)
@@ -6743,6 +6743,10 @@ register_printer(
                        urf[252],       /* List of supported URF values */
                        *ptr;           /* Pointer into string */
 
+
+  if (!strcmp(subtypes, "off"))
+    return (1);
+
   color_supported           = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN);
   document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE);
   printer_location          = ippFindAttribute(printer->attrs, "printer-location", IPP_TAG_TEXT);
@@ -6788,6 +6792,7 @@ register_printer(
 #ifdef HAVE_DNSSD
   DNSServiceErrorType  error;          /* Error from Bonjour */
   char                 regtype[256];   /* Bonjour service type */
+  uint32_t             interface;      /* Interface index */
 
 
  /*
@@ -6820,9 +6825,11 @@ register_printer(
   * defend our service name but not actually support LPD...
   */
 
+  interface = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
+
   printer->printer_ref = DNSSDMaster;
 
-  if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, 0 /* interfaceIndex */, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error);
     return (0);
@@ -6840,7 +6847,7 @@ register_printer(
   else
     strlcpy(regtype, "_ipp._tcp", sizeof(regtype));
 
-  if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, 0 /* interfaceIndex */, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
     return (0);
@@ -6859,7 +6866,7 @@ register_printer(
   else
     strlcpy(regtype, "_ipps._tcp", sizeof(regtype));
 
-  if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, 0 /* interfaceIndex */, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
     return (0);
@@ -6873,7 +6880,7 @@ register_printer(
 
   printer->http_ref = DNSSDMaster;
 
-  if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, 0 /* interfaceIndex */, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error);
     return (0);