diff --git a/0001-cups-browsed.c-Make-NotifLeaseDuration-configurable-.patch b/0001-cups-browsed.c-Make-NotifLeaseDuration-configurable-.patch new file mode 100644 index 0000000..df62d0c --- /dev/null +++ b/0001-cups-browsed.c-Make-NotifLeaseDuration-configurable-.patch @@ -0,0 +1,128 @@ +From d90a4fc57b00b4a1f6c196bcb96025251b555dd9 Mon Sep 17 00:00:00 2001 +From: zdohnal +Date: Fri, 18 Jun 2021 12:27:53 +0200 +Subject: [PATCH] cups-browsed.c: Make NotifLeaseDuration configurable and + renew after half the lease duration not 60 sec before end + +1) NotifLeaseDuration directive for cups-browsed.conf - it will make + lease duration for notifications configurable by users. IMO it is not + useful for regular users, but it is helpful during sanity testing + (for verifying that we actually renew the subscription when time + comes). The current hardcoded 1 day is unusuable for that :( . + I implemented the lowest threshold to 300s to prevent a possible DoS. +2) Subscription renewal is set to happen in the middle of NotifLeaseDuration, + not one minute before lease expiration. This was a problem on busy servers, + where cups-browsed was busy and wasn't able to renew the subscription + before cupsd removed it. Then if some jobs had come before the subscription + was created again, the queue got disabled. The proposed approach is based + on behavior of DHCP. +--- + utils/cups-browsed.c | 17 +++++++++++++---- + utils/cups-browsed.conf.5 | 11 +++++++++++ + utils/cups-browsed.conf.in | 8 ++++++++ + 3 files changed, 32 insertions(+), 4 deletions(-) + +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index 61d6c551..2d367c59 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -142,7 +142,6 @@ static int ldap_rebind_proc(LDAP *RebindLDAPHandle, + #define TIMEOUT_REMOVE -1 + #define TIMEOUT_CHECK_LIST 2 + +-#define NOTIFY_LEASE_DURATION (24 * 60 * 60) + #define CUPS_DBUS_NAME "org.cups.cupsd.Notifier" + #define CUPS_DBUS_PATH "/org/cups/cupsd/Notifier" + #define CUPS_DBUS_INTERFACE "org.cups.cupsd.Notifier" +@@ -508,6 +507,7 @@ static int autoshutdown_timeout = 30; + static autoshutdown_inactivity_type_t autoshutdown_on = NO_QUEUES; + static guint autoshutdown_exec_id = 0; + static const char *default_printer = NULL; ++static unsigned int notify_lease_duration = 86400; + + static int debug_stderr = 0; + static int debug_logfile = 0; +@@ -5017,7 +5017,7 @@ create_subscription () + ippAddString (req, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, + "notify-recipient-uri", NULL, "dbus://"); + ippAddInteger (req, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, +- "notify-lease-duration", NOTIFY_LEASE_DURATION); ++ "notify-lease-duration", notify_lease_duration); + + resp = cupsDoRequest (conn, req, "/"); + if (!resp || cupsLastError() != IPP_STATUS_OK) { +@@ -5060,7 +5060,7 @@ renew_subscription (int id) + ippAddString (req, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, + "notify-recipient-uri", NULL, "dbus://"); + ippAddInteger (req, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, +- "notify-lease-duration", NOTIFY_LEASE_DURATION); ++ "notify-lease-duration", notify_lease_duration); + + resp = cupsDoRequest (conn, req, "/"); + if (!resp || cupsLastError() != IPP_STATUS_OK) { +@@ -11857,6 +11857,15 @@ read_configuration (const char *filename) + } else + debug_printf("Invalid %s value: %d\n", + line, t); ++ } else if (!strcasecmp(line, "NotifLeaseDuration") && value) { ++ int t = atoi(value); ++ if (t >= 300) { ++ notify_lease_duration = t; ++ debug_printf("Set %s to %d sec.\n", ++ line, t); ++ } else ++ debug_printf("Invalid %s value: %d\n", ++ line, t); + } else if (!strcasecmp(line, "HttpMaxRetries") && value) { + int t = atoi(value); + if (t > 0) { +@@ -12728,7 +12737,7 @@ int main(int argc, char*argv[]) { + /* Subscribe to CUPS' D-Bus notifications and create a proxy to receive + the notifications */ + subscription_id = create_subscription (); +- g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60, ++ g_timeout_add_seconds (notify_lease_duration / 2, + renew_subscription_timeout, + &subscription_id); + cups_notifier = cups_notifier_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, +diff --git a/utils/cups-browsed.conf.5 b/utils/cups-browsed.conf.5 +index c47f8e8d..263f0843 100644 +--- a/utils/cups-browsed.conf.5 ++++ b/utils/cups-browsed.conf.5 +@@ -966,6 +966,17 @@ shutdown. + + .fam T + .fi ++NotifLeaseDuration defines how long the D-BUS subscription created by cups-browsed ++in cupsd will last before cupsd cancels it. The default value is 1 day ++in seconds - 86400. The subscription renewal is set to happen after half of ++NotifLeaseDuration passed. The D-BUS notifications are used for watching over queues ++and doing specific actions when a D-BUS notification comes. ++.PP ++.nf ++.fam C ++ NotifLeaseDuration 86400 ++.fam T ++.fi + .SH SEE ALSO + + \fBcups-browsed\fP(8) +diff --git a/utils/cups-browsed.conf.in b/utils/cups-browsed.conf.in +index 3cc4ebb1..ffdf83d6 100644 +--- a/utils/cups-browsed.conf.in ++++ b/utils/cups-browsed.conf.in +@@ -741,3 +741,11 @@ BrowseRemoteProtocols @BROWSEREMOTEPROTOCOLS@ + # on the size of the file. + + # DebugLogFileSize 300 ++ ++# NotifLeaseDuration defines how long the D-BUS subscription created by cups-browsed ++# in cupsd will last before cupsd cancels it. The default value is 1 day ++# in seconds - 86400. The subscription renewal is set to happen after half of ++# NotifLeaseDuration passed. The D-BUS notifications are used for watching over queues ++# and doing specific actions when a D-BUS notification comes. ++ ++# NotifLeaseDuration 86400 +-- +2.31.1 + diff --git a/cups-filters.spec b/cups-filters.spec index 61b79f9..92a9557 100644 --- a/cups-filters.spec +++ b/cups-filters.spec @@ -4,7 +4,7 @@ Summary: OpenPrinting CUPS filters and backends Name: cups-filters Version: 1.28.7 -Release: 7%{?dist} +Release: 8%{?dist} # For a breakdown of the licensing, see COPYING file # GPLv2: filters: commandto*, imagetoraster, pdftops, rasterto*, @@ -25,6 +25,8 @@ Source0: http://www.openprinting.org/download/cups-filters/cups-filters-%{versio # 1954523 - cups-browsed doesn't save "*-default" options # upstream https://github.com/OpenPrinting/cups-filters/commit/cdd61132e1719a88dd8006c65e8e260c1aaa02e4 Patch01: 0001-cups-browsed-Always-save-.-default-option-entries-fr.patch +# 1973055 - cups-browsed doesn't renew DBus subscription in time and all printing comes to a halt +Patch02: 0001-cups-browsed.c-Make-NotifLeaseDuration-configurable-.patch # autogen.sh @@ -352,6 +354,9 @@ done %{_libdir}/pkgconfig/libfontembed.pc %changelog +* Mon Jun 21 2021 Zdenek Dohnal - 1.28.7-8 +- 1973055 - cups-browsed doesn't renew DBus subscription in time and all printing comes to a halt + * Thu May 20 2021 Zdenek Dohnal - 1.28.7-7 - 1954523 - cups-browsed doesn't save "*-default" options