gboolean polkit_backend_session_monitor_is_session_local (PolkitBackendSessionMonitor *monitor, PolkitSubject *session) { char *seat; if (!sd_session_get_seat (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)), &seat)) { free (seat); return TRUE; } return FALSE; }
/** * polkit_backend_session_monitor_get_user: * @monitor: A #PolkitBackendSessionMonitor. * @subject: A #PolkitSubject. * @error: Return location for error. * * Gets the user corresponding to @subject or %NULL if no user exists. * * Returns: %NULL if @error is set otherwise a #PolkitUnixUser that should be freed with g_object_unref(). */ PolkitIdentity * polkit_backend_session_monitor_get_user_for_subject (PolkitBackendSessionMonitor *monitor, PolkitSubject *subject, GError **error) { PolkitIdentity *ret; guint32 uid; ret = NULL; if (POLKIT_IS_UNIX_PROCESS (subject)) { uid = polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)); if ((gint) uid == -1) { g_set_error (error, POLKIT_ERROR, POLKIT_ERROR_FAILED, "Unix process subject does not have uid set"); goto out; } ret = polkit_unix_user_new (uid); } else if (POLKIT_IS_SYSTEM_BUS_NAME (subject)) { ret = (PolkitIdentity*)polkit_system_bus_name_get_user_sync (POLKIT_SYSTEM_BUS_NAME (subject), NULL, error); } else if (POLKIT_IS_UNIX_SESSION (subject)) { if (sd_session_get_uid (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject)), &uid) < 0) { g_set_error (error, POLKIT_ERROR, POLKIT_ERROR_FAILED, "Error getting uid for session"); goto out; } ret = polkit_unix_user_new (uid); } out: return ret; }
gboolean polkit_backend_session_monitor_is_session_active (PolkitBackendSessionMonitor *monitor, PolkitSubject *session) { const char *session_id; char *state; uid_t uid; gboolean is_active = FALSE; session_id = polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)); g_debug ("Checking whether session %s is active.", session_id); /* Check whether *any* of the user's current sessions are active. */ if (sd_session_get_uid (session_id, &uid) < 0) goto fallback; g_debug ("Session %s has UID %u.", session_id, uid); if (sd_uid_get_state (uid, &state) < 0) goto fallback; g_debug ("UID %u has state %s.", uid, state); is_active = (g_strcmp0 (state, "active") == 0); free (state); return is_active; fallback: /* Fall back to checking the session. This is not ideal, since the user * might have multiple sessions, and we cannot guarantee to have chosen * the active one. * * See: https://bugs.freedesktop.org/show_bug.cgi?id=76358. */ return sd_session_is_active (session_id); }
gboolean polkit_backend_session_monitor_is_session_active (PolkitBackendSessionMonitor *monitor, PolkitSubject *session) { return sd_session_is_active (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session))); }
/** * polkit_backend_session_monitor_get_user: * @monitor: A #PolkitBackendSessionMonitor. * @subject: A #PolkitSubject. * @error: Return location for error. * * Gets the user corresponding to @subject or %NULL if no user exists. * * Returns: %NULL if @error is set otherwise a #PolkitUnixUser that should be freed with g_object_unref(). */ PolkitIdentity * polkit_backend_session_monitor_get_user_for_subject (PolkitBackendSessionMonitor *monitor, PolkitSubject *subject, GError **error) { PolkitIdentity *ret; guint32 uid; ret = NULL; if (POLKIT_IS_UNIX_PROCESS (subject)) { uid = polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)); if ((gint) uid == -1) { g_set_error (error, POLKIT_ERROR, POLKIT_ERROR_FAILED, "Unix process subject does not have uid set"); goto out; } ret = polkit_unix_user_new (uid); } else if (POLKIT_IS_SYSTEM_BUS_NAME (subject)) { GVariant *result; result = g_dbus_connection_call_sync (monitor->system_bus, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetConnectionUnixUser", g_variant_new ("(s)", polkit_system_bus_name_get_name (POLKIT_SYSTEM_BUS_NAME (subject))), G_VARIANT_TYPE ("(u)"), G_DBUS_CALL_FLAGS_NONE, -1, /* timeout_msec */ NULL, /* GCancellable */ error); if (result == NULL) goto out; g_variant_get (result, "(u)", &uid); g_variant_unref (result); ret = polkit_unix_user_new (uid); } else if (POLKIT_IS_UNIX_SESSION (subject)) { if (sd_session_get_uid (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject)), &uid) < 0) { g_set_error (error, POLKIT_ERROR, POLKIT_ERROR_FAILED, "Error getting uid for session"); goto out; } ret = polkit_unix_user_new (uid); } out: return ret; }