summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Koegel <eric.koegel@gmail.com>2015-08-22 10:51:20 +0300
committerEric Koegel <eric.koegel@gmail.com>2015-08-22 10:51:20 +0300
commit1e3f7f9862dceec3fa11ee4205c343ed64ce5b63 (patch)
treebd4011fdef994f8b026eb9360ef5e9d98e649eff
parente72da85a0e9a851a84c09091a2fb356f4c1ae323 (diff)
downloadConsoleKit2-1e3f7f9862dceec3fa11ee4205c343ed64ce5b63.tar.gz
Revert "Minor code refactoring"
This reverts commit bee63889f4a0b8f57807a61d8396346cec8cd5b1. There are some cases where ConsoleKit2 would crash after successfully suspending so revert this commit.
-rw-r--r--src/ck-manager.c160
-rw-r--r--src/ck-session.c56
-rw-r--r--src/ck-sysdeps-unix.c59
-rw-r--r--src/ck-sysdeps.h6
-rw-r--r--tools/Makefile.am3
5 files changed, 163 insertions, 121 deletions
diff --git a/src/ck-manager.c b/src/ck-manager.c
index db5f906..66da8b2 100644
--- a/src/ck-manager.c
+++ b/src/ck-manager.c
@@ -960,11 +960,13 @@ logind_ready_cb (PolkitAuthority *authority,
g_object_unref (ret);
}
+/* We use this to avoid breaking API compability with ConsoleKit1 for
+ * CanStop and CanRestart, but this method emulates how logind
+ * presents it's API */
static void
-get_polkit_permissions_for_callback (CkManager *manager,
- const char *action,
- GDBusMethodInvocation *context,
- GAsyncReadyCallback callback)
+get_polkit_logind_permissions (CkManager *manager,
+ const char *action,
+ GDBusMethodInvocation *context)
{
const char *sender;
PolkitSubject *subject;
@@ -980,37 +982,96 @@ get_polkit_permissions_for_callback (CkManager *manager,
NULL,
0,
NULL,
- callback,
+ (GAsyncReadyCallback) logind_ready_cb,
context);
g_object_unref (subject);
}
-/* We use this to avoid breaking API compability with ConsoleKit1 for
- * CanStop and CanRestart, but this method emulates how logind
- * presents it's API */
-static void
-get_polkit_logind_permissions (CkManager *manager,
- const char *action,
- GDBusMethodInvocation *context)
-{
- get_polkit_permissions_for_callback (manager,
- action,
- context,
- (GAsyncReadyCallback) logind_ready_cb);
-}
-
static void
get_polkit_permissions (CkManager *manager,
const char *action,
GDBusMethodInvocation *context)
{
- get_polkit_permissions_for_callback (manager,
- action,
- context,
- (GAsyncReadyCallback) ready_cb);
+ const char *sender;
+ PolkitSubject *subject;
+
+ g_debug ("get permissions for action %s", action);
+
+ sender = g_dbus_method_invocation_get_sender (context);
+ subject = polkit_system_bus_name_new (sender);
+
+ polkit_authority_check_authorization (manager->priv->pol_ctx,
+ subject,
+ action,
+ NULL,
+ 0,
+ NULL,
+ (GAsyncReadyCallback) ready_cb,
+ context);
+ g_object_unref (subject);
}
#endif
+/* adapted from PolicyKit */
+static gboolean
+get_caller_info (CkManager *manager,
+ const char *sender,
+ uid_t *calling_uid,
+ pid_t *calling_pid)
+{
+ gboolean res = FALSE;
+ GVariant *value = NULL;
+ GError *error = NULL;
+
+ if (sender == NULL) {
+ g_debug ("sender == NULL");
+ goto out;
+ }
+
+ if (manager->priv->bus_proxy == NULL) {
+ g_debug ("manager->priv->bus_proxy == NULL");
+ goto out;
+ }
+
+ value = g_dbus_proxy_call_sync (manager->priv->bus_proxy, "GetConnectionUnixUser",
+ g_variant_new ("(s)", sender),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &error);
+
+ if (value == NULL) {
+ g_warning ("GetConnectionUnixUser() failed: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+ g_variant_get (value, "(u)", calling_uid);
+ g_variant_unref (value);
+
+ value = g_dbus_proxy_call_sync (manager->priv->bus_proxy, "GetConnectionUnixProcessID",
+ g_variant_new ("(s)", sender),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &error);
+
+ if (value == NULL) {
+ g_warning ("GetConnectionUnixProcessID() failed: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+ g_variant_get (value, "(u)", calling_pid);
+ g_variant_unref (value);
+
+ res = TRUE;
+
+ g_debug ("uid = %d", *calling_uid);
+ g_debug ("pid = %d", *calling_pid);
+
+out:
+ return res;
+}
+
static char *
get_user_name (uid_t uid)
{
@@ -1118,7 +1179,7 @@ check_rbac_permissions (CkManager *manager,
username = NULL;
sender = g_dbus_method_invocation_get_sender (context);
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&uid,
&pid);
@@ -2055,7 +2116,7 @@ dbus_inhibit (ConsoleKitManager *ckmanager,
priv = CK_MANAGER_GET_PRIVATE (CK_MANAGER (ckmanager));
sender = g_dbus_method_invocation_get_sender (context);
- res = get_caller_info (priv->bus_proxy,
+ res = get_caller_info (CK_MANAGER (ckmanager),
sender,
&uid,
&pid);
@@ -2698,7 +2759,7 @@ create_session_for_sender (CkManager *manager,
g_debug ("CkManager: create session for sender: %s", sender);
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&uid,
&pid);
@@ -2767,7 +2828,7 @@ dbus_get_session_for_cookie (ConsoleKitManager *ckmanager,
sender = g_dbus_method_invocation_get_sender (context);
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&calling_uid,
&calling_pid);
@@ -2852,7 +2913,7 @@ dbus_get_session_for_unix_process (ConsoleKitManager *ckmanager,
TRACE ();
g_debug ("pid: %u", pid);
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&calling_uid,
&calling_pid);
@@ -2900,7 +2961,7 @@ dbus_get_current_session (ConsoleKitManager *ckmanager,
g_debug ("CkManager: get current session");
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&calling_uid,
&calling_pid);
@@ -3100,7 +3161,7 @@ dbus_close_session (ConsoleKitManager *ckmanager,
manager = CK_MANAGER (ckmanager);
sender = g_dbus_method_invocation_get_sender (context);
- res = get_caller_info (manager->priv->bus_proxy,
+ res = get_caller_info (manager,
sender,
&calling_uid,
&calling_pid);
@@ -3443,17 +3504,6 @@ create_seats (CkManager *manager)
}
static void
-cancel_timeout_and_call_system_action (CkManagerPrivate *priv)
-{
- /* The inhibit lock for this action was removed.
- * Stop the timeout and call the system action now.
- */
- g_source_remove (priv->system_action_idle_id);
- priv->system_action_idle_id = 0;
- system_action_idle_cb (priv->system_action_data);
-}
-
-static void
on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode, gint event, gboolean enabled, gpointer user_data)
{
CkManagerPrivate *priv;
@@ -3472,6 +3522,17 @@ on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode,
return;
}
+ /* this system action must be for a sleep or shutdown operation */
+ if (priv->system_action_data->signal != PREPARE_FOR_SLEEP &&
+ priv->system_action_data->signal != PREPARE_FOR_SHUTDOWN) {
+ return;
+ }
+
+ /* the inhibit change must be for sleep or shutdown */
+ if (event != CK_INHIBIT_EVENT_SUSPEND && event != CK_INHIBIT_EVENT_SHUTDOWN) {
+ return;
+ }
+
/* must be a delay inhibitor */
if (inhibit_mode != CK_INHIBIT_MODE_DELAY) {
return;
@@ -3482,17 +3543,12 @@ on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode,
return;
}
- /* Did we stop inhibiting sleep? */
- if (priv->system_action_data->signal == PREPARE_FOR_SLEEP &&
- event == CK_INHIBIT_EVENT_SUSPEND) {
- cancel_timeout_and_call_system_action (priv);
- }
-
- /* Did we stop inhibiting shutdown? */
- if (priv->system_action_data->signal == PREPARE_FOR_SHUTDOWN &&
- event == CK_INHIBIT_EVENT_SHUTDOWN) {
- cancel_timeout_and_call_system_action (priv);
- }
+ /* The inhibit lock for this action was removed.
+ * Stop the timeout and call the system action now.
+ */
+ g_source_remove (priv->system_action_idle_id);
+ priv->system_action_idle_id = 0;
+ system_action_idle_cb (priv->system_action_data);
}
static void
diff --git a/src/ck-session.c b/src/ck-session.c
index 478dce2..ca0f8ca 100644
--- a/src/ck-session.c
+++ b/src/ck-session.c
@@ -248,6 +248,60 @@ dbus_unlock (ConsoleKitSession *cksession,
return TRUE;
}
+/* adapted from PolicyKit */
+static gboolean
+get_caller_info (CkSession *session,
+ const char *sender,
+ uid_t *calling_uid,
+ pid_t *calling_pid)
+{
+ gboolean res = FALSE;
+ GVariant *value = NULL;
+ GError *error = NULL;
+
+ if (sender == NULL) {
+ goto out;
+ }
+
+ value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixUser",
+ g_variant_new ("(s)", sender),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &error);
+
+ if (value == NULL) {
+ g_warning ("GetConnectionUnixUser() failed: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+ g_variant_get (value, "(u)", calling_uid);
+ g_variant_unref (value);
+
+ value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixProcessID",
+ g_variant_new ("(s)", sender),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &error);
+
+ if (value == NULL) {
+ g_warning ("GetConnectionUnixProcessID() failed: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+ g_variant_get (value, "(u)", calling_pid);
+ g_variant_unref (value);
+
+ res = TRUE;
+
+ g_debug ("uid = %d", *calling_uid);
+ g_debug ("pid = %d", *calling_pid);
+
+out:
+ return res;
+}
+
static gboolean
session_set_idle_hint_internal (CkSession *session,
gboolean idle_hint)
@@ -326,7 +380,7 @@ dbus_set_idle_hint (ConsoleKitSession *cksession,
sender = g_dbus_method_invocation_get_sender (context);
- res = get_caller_info (session->priv->bus_proxy,
+ res = get_caller_info (session,
sender,
&calling_uid,
&calling_pid);
diff --git a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c
index 87333d1..0f751b9 100644
--- a/src/ck-sysdeps-unix.c
+++ b/src/ck-sysdeps-unix.c
@@ -132,65 +132,6 @@ ck_get_socket_peer_credentials (int socket_fd,
return ret;
}
-/* adapted from PolicyKit */
-gboolean
-get_caller_info (GDBusProxy *bus_proxy,
- const char *sender,
- uid_t *calling_uid,
- pid_t *calling_pid)
-{
- gboolean res = FALSE;
- GVariant *value = NULL;
- GError *error = NULL;
-
- if (sender == NULL) {
- g_debug ("sender == NULL");
- goto out;
- }
-
- if (bus_proxy == NULL) {
- g_debug ("bus_proxy == NULL");
- goto out;
- }
-
- value = g_dbus_proxy_call_sync (bus_proxy, "GetConnectionUnixUser",
- g_variant_new ("(s)", sender),
- G_DBUS_CALL_FLAGS_NONE,
- 2000,
- NULL,
- &error);
-
- if (value == NULL) {
- g_warning ("GetConnectionUnixUser() failed: %s", error->message);
- g_error_free (error);
- goto out;
- }
- g_variant_get (value, "(u)", calling_uid);
- g_variant_unref (value);
-
- value = g_dbus_proxy_call_sync (bus_proxy, "GetConnectionUnixProcessID",
- g_variant_new ("(s)", sender),
- G_DBUS_CALL_FLAGS_NONE,
- 2000,
- NULL,
- &error);
-
- if (value == NULL) {
- g_warning ("GetConnectionUnixProcessID() failed: %s", error->message);
- g_error_free (error);
- goto out;
- }
- g_variant_get (value, "(u)", calling_pid);
- g_variant_unref (value);
-
- res = TRUE;
-
- g_debug ("uid = %d", *calling_uid);
- g_debug ("pid = %d", *calling_pid);
-
-out:
- return res;
-}
/*
* getfd.c
diff --git a/src/ck-sysdeps.h b/src/ck-sysdeps.h
index 66df581..bc32631 100644
--- a/src/ck-sysdeps.h
+++ b/src/ck-sysdeps.h
@@ -24,7 +24,6 @@
#include "config.h"
#include <glib.h>
-#include <gio/gio.h>
G_BEGIN_DECLS
@@ -55,11 +54,6 @@ gboolean ck_get_socket_peer_credentials (int socket_fd,
uid_t *uid,
GError **error);
-gboolean get_caller_info (GDBusProxy *bus_proxy,
- const char *sender,
- uid_t *calling_uid,
- pid_t *calling_pid);
-
int ck_get_a_console_fd (void);
gboolean ck_fd_is_a_console (int fd);
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 69dd1eb..81f4d1f 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -131,7 +131,6 @@ ck_collect_session_info_SOURCES = \
$(NULL)
ck_collect_session_info_LDADD = \
- $(CONSOLE_KIT_LIBS) \
$(TOOLS_LIBS) \
$(top_builddir)/src/libck.la \
$(NULL)
@@ -141,7 +140,6 @@ ck_get_x11_server_pid_SOURCES = \
$(NULL)
ck_get_x11_server_pid_LDADD = \
- $(CONSOLE_KIT_LIBS) \
$(TOOLS_LIBS) \
$(XLIB_LIBS) \
$(top_builddir)/src/libck.la \
@@ -152,7 +150,6 @@ ck_get_x11_display_device_SOURCES = \
$(NULL)
ck_get_x11_display_device_LDADD = \
- $(CONSOLE_KIT_LIBS) \
$(TOOLS_LIBS) \
$(top_builddir)/src/libck.la \
$(NULL)