summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/gdm-manager.c503
1 files changed, 61 insertions, 442 deletions
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index f2c00eda..ad0ac63f 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -253,251 +253,6 @@ get_uid_for_session_id (GDBusConnection *connection,
return FALSE;
}
-#ifdef WITH_SYSTEMD
-static char *
-get_session_id_for_user_on_seat_systemd (const char *username,
- const char *seat,
- GError **error)
-{
- struct passwd *pwent;
- uid_t uid;
- int i;
- char **sessions;
- char *session = NULL;
- int ret;
-
- pwent = NULL;
- gdm_get_pwent_for_name (username, &pwent);
-
- if (pwent == NULL) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Unable to look up UID of user %s"),
- username);
- return NULL;
- }
-
- uid = pwent->pw_uid;
-
- session = NULL;
- ret = sd_seat_get_sessions (seat, &sessions, NULL, NULL);
- if (ret < 0 || sessions == NULL) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- "Error getting session ids from systemd: %s",
- ret < 0? g_strerror (-ret) : _("no sessions available"));
- return NULL;
- }
-
- for (i = 0; sessions[i] != NULL; i++) {
- char *type;
- char *state;
- gboolean is_closing;
- gboolean is_x11;
- uid_t session_uid;
-
- ret = sd_session_get_uid (sessions[i], &session_uid);
-
- if (ret < 0) {
- g_warning ("GdmManager: could not fetch uid of session '%s': %s",
- sessions[i], strerror (-ret));
- continue;
- }
-
- if (uid != session_uid) {
- continue;
- }
-
- ret = sd_session_get_type (sessions[i], &type);
-
- if (ret < 0) {
- g_warning ("GdmManager: could not fetch type of session '%s': %s",
- sessions[i], strerror (-ret));
- continue;
- }
-
- is_x11 = g_strcmp0 (type, "x11") == 0;
- free (type);
-
- if (!is_x11) {
- continue;
- }
-
- ret = sd_session_get_state (sessions[i], &state);
- if (ret < 0) {
- g_warning ("GdmManager: could not fetch state of session '%s': %s",
- sessions[i], strerror (-ret));
- continue;
- }
-
- is_closing = g_strcmp0 (state, "closing") == 0;
-
- if (is_closing) {
- continue;
- }
-
- session = g_strdup (sessions[i]);
- break;
-
- }
-
- if (session == NULL) {
- g_debug ("GdmManager: There are no applicable sessions (%d looked at)", i);
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("No sessions for %s available for reauthentication"),
- username);
- return NULL;
- }
-
- g_debug ("GdmManager: session %s is available for reauthentication", session);
-
- return session;
-}
-#endif
-
-#ifdef WITH_CONSOLE_KIT
-static char *
-get_session_id_for_user_on_seat_consolekit (GDBusConnection *connection,
- const char *username,
- const char *seat,
- GError **error)
-{
- GVariant *reply;
- const gchar **sessions;
- char *session = NULL;
- struct passwd *pwent;
- uid_t uid;
- int i;
-
- pwent = NULL;
- gdm_get_pwent_for_name (username, &pwent);
-
- if (pwent == NULL) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Unable to look up UID of user %s"),
- username);
- return NULL;
- }
-
- uid = pwent->pw_uid;
-
- reply = g_dbus_connection_call_sync (connection,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
- "GetSessionsForUnixUser",
- g_variant_new ("(u)", (guint32) uid),
- G_VARIANT_TYPE ("(ao)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- error);
- if (reply == NULL) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Unable to find session for user %s"),
- username);
- return NULL;
- }
-
- g_variant_get_child (reply, 0, "^a&o", &sessions);
- for (i = 0; sessions[i] != NULL; i++) {
- GVariant *reply2;
- GError *error2 = NULL;
- gchar *display;
- gchar *session_seat_id;
-
- reply2 = g_dbus_connection_call_sync (connection,
- "org.freedesktop.ConsoleKit",
- sessions[i],
- "org.freedesktop.ConsoleKit.Session",
- "GetSeatId",
- NULL,
- G_VARIANT_TYPE ("(o)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error2);
- if (reply2 == NULL) {
- continue;
- }
-
- g_variant_get (reply2, "(o)", &session_seat_id);
- g_variant_unref (reply2);
-
- if (g_strcmp0 (seat, session_seat_id) != 0) {
- g_free (session_seat_id);
- continue;
- }
- g_free (session_seat_id);
-
- reply2 = g_dbus_connection_call_sync (connection,
- "org.freedesktop.ConsoleKit",
- sessions[i],
- "org.freedesktop.ConsoleKit.Session",
- "GetX11DisplayDevice",
- NULL,
- G_VARIANT_TYPE ("(s)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error2);
- if (reply2 == NULL) {
- continue;
- }
-
- g_variant_get (reply2, "(s)", &display);
- g_variant_unref (reply2);
-
- if (display[0] == '\0') {
- g_free (display);
- continue;
- }
-
- session = g_strdup (sessions[i]);
- break;
-
- }
- g_free (sessions);
- g_variant_unref (reply);
-
- if (session == NULL) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Unable to find appropriate session for user %s"),
- username);
- }
- return session;
-}
-#endif
-
-static char *
-get_session_id_for_user_on_seat (GDBusConnection *connection,
- const char *username,
- const char *seat,
- GError **error)
-{
-#ifdef WITH_SYSTEMD
- if (LOGIND_RUNNING()) {
- return get_session_id_for_user_on_seat_systemd (username, seat, error);
- }
-#endif
-
-#ifdef WITH_CONSOLE_KIT
- return get_session_id_for_user_on_seat_consolekit (connection, username, seat, error);
-#endif
-
- return NULL;
-}
-
static gboolean
lookup_by_session_id (const char *id,
GdmDisplay *display,
@@ -516,100 +271,73 @@ lookup_by_session_id (const char *id,
return res;
}
-#ifdef WITH_SYSTEMD
-static char *
-get_seat_id_for_pid_systemd (pid_t pid,
- GError **error)
+static GdmDisplay *
+get_display_and_details_for_bus_sender (GdmManager *self,
+ GDBusConnection *connection,
+ const char *sender,
+ GPid *out_pid,
+ uid_t *out_uid)
{
- char *session;
- char *seat, *gseat;
- int ret;
+ GdmDisplay *display = NULL;
+ char *session_id = NULL;
+ GError *error = NULL;
+ int ret;
+ GPid pid;
+ uid_t caller_uid, session_uid;
- session = get_session_id_for_pid_systemd (pid, error);
+ ret = gdm_dbus_get_pid_for_name (sender, &pid, &error);
- if (session == NULL) {
- return NULL;
+ if (!ret) {
+ g_debug ("GdmManager: Error while retrieving pid for sender: %s",
+ error->message);
+ g_error_free (error);
+ goto out;
}
- seat = NULL;
- ret = sd_session_get_seat (session, &seat);
- free (session);
+ ret = gdm_dbus_get_uid_for_name (sender, &caller_uid, &error);
- if (ret < 0) {
- g_set_error (error,
- GDM_DISPLAY_ERROR,
- GDM_DISPLAY_ERROR_GETTING_SESSION_INFO,
- "Error getting seat id from systemd: %s",
- g_strerror (-ret));
- return NULL;
+ if (!ret) {
+ g_debug ("GdmManager: Error while retrieving uid for sender: %s",
+ error->message);
+ g_error_free (error);
+ goto out;
}
- if (seat != NULL) {
- gseat = g_strdup (seat);
- free (seat);
+ session_id = get_session_id_for_pid (connection, pid, &error);
- return gseat;
- } else {
- return NULL;
+ if (session_id == NULL) {
+ g_debug ("GdmManager: Error while retrieving session id for sender: %s",
+ error->message);
+ g_error_free (error);
+ goto out;
}
-}
-#endif
-
-#ifdef WITH_CONSOLE_KIT
-static char *
-get_seat_id_for_pid_consolekit (GDBusConnection *connection,
- pid_t pid,
- GError **error)
-{
- char *session;
- GVariant *reply;
- char *retval;
- session = get_session_id_for_pid_consolekit (connection, pid, error);
-
- if (session == NULL) {
- return NULL;
+ if (!get_uid_for_session_id (connection, session_id, &session_uid, &error)) {
+ g_debug ("GdmManager: Error while retrieving uid for session: %s",
+ error->message);
+ g_error_free (error);
+ goto out;
}
- reply = g_dbus_connection_call_sync (connection,
- "org.freedesktop.ConsoleKit",
- session,
- "org.freedesktop.ConsoleKit.Session",
- "GetSeatId",
- NULL,
- G_VARIANT_TYPE ("(o)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL, error);
- g_free (session);
-
- if (reply == NULL) {
- return NULL;
+ if (caller_uid != session_uid) {
+ g_debug ("GdmManager: uid for sender and uid for session don't match");
+ goto out;
}
- g_variant_get (reply, "(o)", &retval);
- g_variant_unref (reply);
+ display = gdm_display_store_find (self->priv->display_store,
+ lookup_by_session_id,
+ (gpointer) session_id);
+out:
+ g_free (session_id);
- return retval;
-}
-#endif
+ if (display != NULL) {
+ if (out_pid != NULL)
+ *out_pid = pid;
-static char *
-get_seat_id_for_pid (GDBusConnection *connection,
- pid_t pid,
- GError **error)
-{
-#ifdef WITH_SYSTEMD
- if (LOGIND_RUNNING()) {
- return get_seat_id_for_pid_systemd (pid, error);
+ if (out_uid != NULL)
+ *out_uid = session_uid;
}
-#endif
-
-#ifdef WITH_CONSOLE_KIT
- return get_seat_id_for_pid_consolekit (connection, pid, error);
-#endif
-
- return NULL;
+ return display;
}
static gboolean
@@ -617,64 +345,19 @@ gdm_manager_handle_open_session (GdmDBusManager *manager,
GDBusMethodInvocation *invocation)
{
GdmManager *self = GDM_MANAGER (manager);
+ const char *sender = NULL;
+ GError *error = NULL;
GDBusConnection *connection;
GdmDisplay *display;
- const char *sender;
- char *session_id;
- GError *error;
char *address;
- int ret;
GPid pid;
- uid_t caller_uid, session_uid;
+ uid_t uid;
- sender = g_dbus_method_invocation_get_sender (invocation);
- error = NULL;
- ret = gdm_dbus_get_pid_for_name (sender, &pid, &error);
-
- if (!ret) {
- g_prefix_error (&error, "Error while retrieving caller session id: ");
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_error_free (error);
- return TRUE;
- }
-
- ret = gdm_dbus_get_uid_for_name (sender, &caller_uid, &error);
-
- if (!ret) {
- g_prefix_error (&error, "Error while retrieving caller session id: ");
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_error_free (error);
- return TRUE;
- }
+ g_debug ("GdmManager: trying to open new session");
+ sender = g_dbus_method_invocation_get_sender (invocation);
connection = g_dbus_method_invocation_get_connection (invocation);
- session_id = get_session_id_for_pid (connection, pid, &error);
-
- if (session_id == NULL) {
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_error_free (error);
- return TRUE;
- }
-
- if (!get_uid_for_session_id (connection, session_id, &session_uid, &error)) {
- g_prefix_error (&error, "Error while retrieving caller session id: ");
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_error_free (error);
- return TRUE;
- }
-
- if (caller_uid != session_uid) {
- g_dbus_method_invocation_return_error_literal (invocation,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("User doesn't own session"));
- return TRUE;
- }
-
- display = gdm_display_store_find (self->priv->display_store,
- lookup_by_session_id,
- (gpointer) session_id);
- g_free (session_id);
+ display = get_display_and_details_for_bus_sender (self, connection, sender, &pid, &uid);
if (display == NULL) {
g_dbus_method_invocation_return_error_literal (invocation,
@@ -685,7 +368,7 @@ gdm_manager_handle_open_session (GdmDBusManager *manager,
return TRUE;
}
- address = gdm_display_open_session_sync (display, pid, session_uid, NULL, &error);
+ address = gdm_display_open_session_sync (display, pid, uid, NULL, &error);
if (address == NULL) {
g_dbus_method_invocation_return_gerror (invocation, error);
@@ -707,83 +390,19 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager
const char *username)
{
GdmManager *self = GDM_MANAGER (manager);
+ const char *sender = NULL;
+ GError *error = NULL;
GDBusConnection *connection;
GdmDisplay *display;
- const char *sender;
- char *seat_id;
- char *session_id = NULL;
- GError *error;
char *address;
- int ret;
GPid pid;
- uid_t caller_uid;
+ uid_t uid;
g_debug ("GdmManager: trying to open reauthentication channel for user %s", username);
sender = g_dbus_method_invocation_get_sender (invocation);
- error = NULL;
- ret = gdm_dbus_get_pid_for_name (sender, &pid, &error);
-
- if (!ret) {
- g_debug ("GdmManager: could not get pid of caller: %s",
- error->message);
- g_error_free (error);
-
- g_dbus_method_invocation_return_error_literal (invocation,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- "Error getting process id of caller");
- return TRUE;
-
- }
-
- ret = gdm_dbus_get_uid_for_name (sender, &caller_uid, &error);
-
- if (!ret) {
- g_debug ("GdmManager: could not get uid of caller: %s",
- error->message);
- g_error_free (error);
-
- g_dbus_method_invocation_return_error_literal (invocation,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- "Error getting user id of caller");
- return TRUE;
- }
-
connection = g_dbus_method_invocation_get_connection (invocation);
-
- seat_id = get_seat_id_for_pid (connection, pid, &error);
-
- if (seat_id == NULL) {
- g_debug ("GdmManager: could not get seat id of caller: %s",
- error->message);
- g_error_free (error);
-
- g_dbus_method_invocation_return_error_literal (invocation,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- "Error getting seat id of caller");
- return TRUE;
- }
-
- session_id = get_session_id_for_user_on_seat (connection, username, seat_id, &error);
- if (session_id == NULL) {
- g_debug ("GdmManager: could not get session id for caller: %s",
- error->message);
- g_error_free (error);
-
- g_dbus_method_invocation_return_error_literal (invocation,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- "Error getting session id for caller");
- return TRUE;
- }
-
- display = gdm_display_store_find (self->priv->display_store,
- lookup_by_session_id,
- (gpointer) session_id);
- g_free (session_id);
+ display = get_display_and_details_for_bus_sender (self, connection, sender, &pid, &uid);
if (display == NULL) {
g_dbus_method_invocation_return_error_literal (invocation,
@@ -797,7 +416,7 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager
address = gdm_display_open_reauthentication_channel_sync (display,
username,
pid,
- caller_uid,
+ uid,
NULL,
&error);