From 77a956873a1992e070ebeb2495e48a901a64610a Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Wed, 21 May 2025 09:33:14 -0400 Subject: [PATCH] polkitAuthenticationAgent.js: Ensure Cinnamon is part of the correct login session when registering. Compare Cinnamon's session id with cinnamon-session's (which should never change), and have cinnamon-session restart us if there is a mismatch. Ref: #12669, #12728. See: https://github.com/linuxmint/cinnamon-session/pull/184. --- js/misc/gnomeSession.js | 2 ++ js/ui/polkitAuthenticationAgent.js | 22 ++++++++++++++++++++-- src/cinnamon-polkit-authentication-agent.c | 7 ++++++- src/cinnamon-polkit-authentication-agent.h | 2 +- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js index c942dd9955..7564b92f29 100644 --- a/js/misc/gnomeSession.js +++ b/js/misc/gnomeSession.js @@ -75,6 +75,7 @@ var SessionManagerIface = '\ \ \ \ + \ \ \ \ @@ -82,6 +83,7 @@ var SessionManagerIface = '\ \ \ \ + \ \ '; diff --git a/js/ui/polkitAuthenticationAgent.js b/js/ui/polkitAuthenticationAgent.js index d60e73eb31..44b445223c 100644 --- a/js/ui/polkitAuthenticationAgent.js +++ b/js/ui/polkitAuthenticationAgent.js @@ -32,6 +32,8 @@ const GLib = imports.gi.GLib; const Mainloop = imports.mainloop; const Polkit = imports.gi.Polkit; const PolkitAgent = imports.gi.PolkitAgent; +const GnomeSession = imports.misc.gnomeSession; +const Meta = imports.gi.Meta; const Dialog = imports.ui.dialog; const Main = imports.ui.main; @@ -551,9 +553,25 @@ var AuthenticationAgent = class { this._native.connect('cancel', this._onCancel.bind(this)); // TODO - maybe register probably should wait until later, especially at first login? try { - this._native.register(); + const session = new GnomeSession.SessionManager(); + const csSessionId = session.SessionId; + + let procSessionId = this._native.register(); + if (!Meta.is_wayland_compositor() && procSessionId !== csSessionId) { + global.logWarning("Unable to register as the polkit agent for login session '%s'. Cinnamon is running under '%s'" + .format(csSessionId, procSessionId)); + this._native.unregister(); + this._native = null; + + // Starting cinnamon over SSH can be useful when debugging and profiling. Provide a way to prevent a restart. + if (!GLib.getenv("CINNAMON_ALLOW_SSH")) { + global.logWarning('Restarting Cinnamon in 5 seconds.'); + GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => session.RestartCinnamonLauncherRemote()) + return; + } + } } catch(e) { - global.logWarning('Failed to register Polkit Agent'); + global.log('Failed to register Polkit Agent', e); } this._currentDialog = null; } diff --git a/src/cinnamon-polkit-authentication-agent.c b/src/cinnamon-polkit-authentication-agent.c index 945aa586c3..6c9cb2725b 100644 --- a/src/cinnamon-polkit-authentication-agent.c +++ b/src/cinnamon-polkit-authentication-agent.c @@ -87,12 +87,14 @@ cinnamon_polkit_authentication_agent_init (CinnamonPolkitAuthenticationAgent *ag { } -void +gchar * cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent *agent, GError **error_out) { GError *error = NULL; PolkitSubject *subject; + gchar *session_id = NULL; + subject = polkit_unix_session_new_for_process_sync (getpid (), NULL, /* GCancellable* */ &error); @@ -104,6 +106,7 @@ cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent goto out; } + session_id = g_strdup (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject))); agent->handle = polkit_agent_listener_register (POLKIT_AGENT_LISTENER (agent), POLKIT_AGENT_REGISTER_FLAGS_NONE, subject, @@ -117,6 +120,8 @@ cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent if (subject != NULL) g_object_unref (subject); + + return session_id; } static void diff --git a/src/cinnamon-polkit-authentication-agent.h b/src/cinnamon-polkit-authentication-agent.h index 5fbbeefd6d..85a4a794ce 100644 --- a/src/cinnamon-polkit-authentication-agent.h +++ b/src/cinnamon-polkit-authentication-agent.h @@ -27,7 +27,7 @@ CinnamonPolkitAuthenticationAgent *cinnamon_polkit_authentication_agent_new (voi void cinnamon_polkit_authentication_agent_complete (CinnamonPolkitAuthenticationAgent *agent, gboolean dismissed); -void cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent *agent, +gchar * cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent *agent, GError **error_out); void cinnamon_polkit_authentication_agent_unregister (CinnamonPolkitAuthenticationAgent *agent);