Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions js/misc/gnomeSession.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,15 @@ var SessionManagerIface = '\
<method name="GetInhibitors"> \
<arg type="ao" name="inhibitors" direction="out"/> \
</method> \
<method name="RestartCinnamonLauncher" /> \
<signal name="InhibitorAdded"> \
<arg type="o" name="id" direction="out"/> \
</signal> \
<signal name="InhibitorRemoved"> \
<arg type="o" name="id" direction="out"/> \
</signal> \
<property name="InhibitedActions" type="u" access="read"/> \
<property name="SessionId" type="s" access="read"/> \
</interface> \
</node>';

Expand Down
22 changes: 20 additions & 2 deletions js/ui/polkitAuthenticationAgent.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
7 changes: 6 additions & 1 deletion src/cinnamon-polkit-authentication-agent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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,
Expand All @@ -117,6 +120,8 @@ cinnamon_polkit_authentication_agent_register (CinnamonPolkitAuthenticationAgent

if (subject != NULL)
g_object_unref (subject);

return session_id;
}

static void
Expand Down
2 changes: 1 addition & 1 deletion src/cinnamon-polkit-authentication-agent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Loading