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);