diff --git a/DistUpgrade/DistUpgradeController.py b/DistUpgrade/DistUpgradeController.py index b7dd0af7..dd9d171d 100644 --- a/DistUpgrade/DistUpgradeController.py +++ b/DistUpgrade/DistUpgradeController.py @@ -2700,18 +2700,84 @@ class DistUpgradeController(object): try: import dbus + import dbus.bus + # Root D-Bus bridge + bus_address = None + try: + uid_str = os.environ.get('SUDO_UID') or os.environ.get('PKEXEC_UID') + if uid_str: + import subprocess + # Find the PID of mate-session for this user + pid = subprocess.check_output(["pgrep", "-u", uid_str, "-n", "mate-session"]).decode().strip() + if pid: + with open(f"/proc/{pid}/environ", "r") as f: + for line in f.read().split('\0'): + if line.startswith("DBUS_SESSION_BUS_ADDRESS="): + bus_address = line.split("=", 1)[1] + os.environ["DBUS_SESSION_BUS_ADDRESS"] = bus_address + logging.debug("D-Bus successfully bridged: " + bus_address) + break + except Exception as e: + logging.debug("Failed to create D-Bus bridge: " + str(e)) + + # Drop root privileges self._setNonRootEUID() # The org.freedesktop.ScreenSaver.Inhibit effect lasts only # as long as the dbus connection remains open. Once u-r-u # exits, the connection will be closed and screen inhibition # will be removed. - self._session_bus = dbus.SessionBus() - proxy = self._session_bus.get_object('org.freedesktop.ScreenSaver', - '/org/freedesktop/ScreenSaver') - screensaver = dbus.Interface(proxy, dbus_interface='org.freedesktop.ScreenSaver') - screensaver.Inhibit('trisquel-release-upgrader', 'Upgrading Trisquel') + if bus_address: + self._session_bus = dbus.bus.BusConnection(bus_address) + else: + self._session_bus = dbus.SessionBus() + + inhibited = False + + # Attempt 1: Generic Freedesktop + try: + proxy = self._session_bus.get_object('org.freedesktop.ScreenSaver', + '/org/freedesktop/ScreenSaver') + screensaver = dbus.Interface(proxy, dbus_interface='org.freedesktop.ScreenSaver') + screensaver.Inhibit('trisquel-release-upgrader', 'Upgrading System', timeout=2) + logging.debug('Freedesktop ScreenSaver inhibited') + inhibited = True + except Exception as e: + logging.debug('Freedesktop Inhibit failed: ' + str(e)) + + # Attempt 2: MATE ScreenSaver + try: + proxy_ss = self._session_bus.get_object('org.mate.ScreenSaver', + '/org/mate/ScreenSaver') + screensaver_mate = dbus.Interface(proxy_ss, dbus_interface='org.mate.ScreenSaver') + screensaver_mate.Inhibit('trisquel-release-upgrader', 'Upgrading System') + logging.debug('MATE ScreenSaver successfully inhibited') + inhibited = True + except Exception as e: + logging.debug('Failed to inhibit MATE ScreenSaver: ' + str(e)) + + # Attempt 3: SessionManager - MATE, fallback to GNOME namespace + try: + try: + proxy_sm = self._session_bus.get_object('org.mate.SessionManager', + '/org/mate/SessionManager') + session_mate = dbus.Interface(proxy_sm, dbus_interface='org.mate.SessionManager') + session_mate.Inhibit('trisquel-release-upgrader', 0, 'Upgrading System', 8) + except Exception: + # Fallback for MATE systems using legacy GNOME namespace + proxy_sm = self._session_bus.get_object('org.gnome.SessionManager', + '/org/gnome/SessionManager') + session_mate = dbus.Interface(proxy_sm, dbus_interface='org.gnome.SessionManager') + session_mate.Inhibit('trisquel-release-upgrader', 0, 'Upgrading System', 8) + + logging.debug('SessionManager DPMS successfully inhibited') + inhibited = True + except Exception as e: + logging.debug('Failed to inhibit SessionManager DPMS: ' + str(e)) + + if not inhibited: + raise Exception("Neither Freedesktop, nor MATE, nor GNOME namespaces could be inhibited") summary = _("Lock screen disabled") message = _("Your lock screen has been "