Update to 3.30.2
This commit is contained in:
parent
f517b81933
commit
e1d80fc449
1
.gitignore
vendored
1
.gitignore
vendored
@ -118,3 +118,4 @@ gdm-2.30.2.tar.bz2
|
||||
/gdm-3.29.91.tar.xz
|
||||
/gdm-3.30.0.tar.xz
|
||||
/gdm-3.30.1.tar.xz
|
||||
/gdm-3.30.2.tar.xz
|
||||
|
@ -1,87 +0,0 @@
|
||||
From a3904bf5f9e6fe6bc3bb2ad9c856cf1361b8194d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 1 Oct 2018 11:05:57 -0400
|
||||
Subject: [PATCH] manager: correct display confusion
|
||||
|
||||
commit c5c5bf1f reworked autologin and broke it.
|
||||
|
||||
This commit addresses the breakage by accessing
|
||||
the proper display variable.
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gdm/issues/426
|
||||
---
|
||||
daemon/gdm-manager.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||
index b1e9b68be..62a967389 100644
|
||||
--- a/daemon/gdm-manager.c
|
||||
+++ b/daemon/gdm-manager.c
|
||||
@@ -1662,62 +1662,62 @@ on_start_user_session (StartUserSessionOperation *operation)
|
||||
if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
|
||||
g_debug ("GdmManager: closing down initial setup display");
|
||||
gdm_display_stop_greeter_session (display);
|
||||
gdm_display_unmanage (display);
|
||||
gdm_display_finish (display);
|
||||
}
|
||||
} else {
|
||||
g_debug ("GdmManager: session has its display server, reusing our server for another login screen");
|
||||
}
|
||||
|
||||
/* The user session is going to follow the session worker
|
||||
* into the new display. Untie it from this display and
|
||||
* create a new session for a future user login. */
|
||||
allowed_uid = gdm_session_get_allowed_user (operation->session);
|
||||
g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
|
||||
g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
|
||||
create_user_session_for_display (operation->manager, display, allowed_uid);
|
||||
|
||||
/* Give the user session a new display object for bookkeeping purposes */
|
||||
create_display_for_user_session (operation->manager,
|
||||
operation->session,
|
||||
session_id);
|
||||
|
||||
|
||||
if (g_strcmp0 (operation->service_name, "gdm-autologin") == 0) {
|
||||
/* remove the unused prepared greeter display since we're not going
|
||||
* to have a greeter */
|
||||
gdm_display_store_remove (self->priv->display_store, display);
|
||||
g_object_unref (display);
|
||||
|
||||
- self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
|
||||
- g_object_add_weak_pointer (G_OBJECT (display), (gpointer *) &self->priv->automatic_login_display);
|
||||
+ self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
|
||||
+ g_object_add_weak_pointer (G_OBJECT (self->priv->automatic_login_display), (gpointer *) &self->priv->automatic_login_display);
|
||||
}
|
||||
}
|
||||
|
||||
start_user_session (operation->manager, operation);
|
||||
|
||||
out:
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_start_user_session (GdmManager *manager,
|
||||
GdmSession *session,
|
||||
const char *service_name)
|
||||
{
|
||||
StartUserSessionOperation *operation;
|
||||
|
||||
operation = g_slice_new0 (StartUserSessionOperation);
|
||||
operation->manager = manager;
|
||||
operation->session = g_object_ref (session);
|
||||
operation->service_name = g_strdup (service_name);
|
||||
|
||||
operation->idle_id = g_idle_add ((GSourceFunc) on_start_user_session, operation);
|
||||
g_object_set_data (G_OBJECT (session), "start-user-session-operation", operation);
|
||||
}
|
||||
|
||||
static void
|
||||
start_user_session_if_ready (GdmManager *manager,
|
||||
GdmSession *session,
|
||||
const char *service_name)
|
||||
{
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,694 +0,0 @@
|
||||
From 1984b36ba08506ea65dcb95e565f7d24ecbd1703 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Thu, 6 Sep 2018 19:31:50 -0400
|
||||
Subject: [PATCH] manager: do initial-setup post work in manager code
|
||||
|
||||
Right now we do the initial-setup related post work
|
||||
when stopping the greeter, but the problem is we delay
|
||||
stopping the greeter now until after the user session
|
||||
is started.
|
||||
|
||||
That post-work needs to be done before the user session
|
||||
is started.
|
||||
|
||||
This commit moves the code to a more logical place.
|
||||
---
|
||||
daemon/gdm-display.c | 132 -------------------------------------------
|
||||
daemon/gdm-manager.c | 132 +++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 132 insertions(+), 132 deletions(-)
|
||||
|
||||
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
|
||||
index 5e193f2f5..511a5ca3f 100644
|
||||
--- a/daemon/gdm-display.c
|
||||
+++ b/daemon/gdm-display.c
|
||||
@@ -22,61 +22,60 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "gdm-common.h"
|
||||
#include "gdm-display.h"
|
||||
#include "gdm-display-glue.h"
|
||||
#include "gdm-display-access-file.h"
|
||||
#include "gdm-launch-environment.h"
|
||||
|
||||
#include "gdm-settings-direct.h"
|
||||
#include "gdm-settings-keys.h"
|
||||
|
||||
#include "gdm-launch-environment.h"
|
||||
#include "gdm-dbus-util.h"
|
||||
|
||||
-#define INITIAL_SETUP_USERNAME "gnome-initial-setup"
|
||||
#define GNOME_SESSION_SESSIONS_PATH DATADIR "/gnome-session/sessions"
|
||||
|
||||
#define GDM_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_DISPLAY, GdmDisplayPrivate))
|
||||
|
||||
struct GdmDisplayPrivate
|
||||
{
|
||||
char *id;
|
||||
char *seat_id;
|
||||
char *session_id;
|
||||
char *session_class;
|
||||
char *session_type;
|
||||
|
||||
char *remote_hostname;
|
||||
int x11_display_number;
|
||||
char *x11_display_name;
|
||||
int status;
|
||||
time_t creation_time;
|
||||
GTimer *server_timer;
|
||||
|
||||
char *x11_cookie;
|
||||
gsize x11_cookie_size;
|
||||
GdmDisplayAccessFile *access_file;
|
||||
|
||||
guint finish_idle_id;
|
||||
|
||||
xcb_connection_t *xcb_connection;
|
||||
int xcb_screen_number;
|
||||
|
||||
GDBusConnection *connection;
|
||||
GdmDisplayAccessFile *user_access_file;
|
||||
@@ -100,131 +99,60 @@ enum {
|
||||
PROP_0,
|
||||
PROP_ID,
|
||||
PROP_STATUS,
|
||||
PROP_SEAT_ID,
|
||||
PROP_SESSION_ID,
|
||||
PROP_SESSION_CLASS,
|
||||
PROP_SESSION_TYPE,
|
||||
PROP_REMOTE_HOSTNAME,
|
||||
PROP_X11_DISPLAY_NUMBER,
|
||||
PROP_X11_DISPLAY_NAME,
|
||||
PROP_X11_COOKIE,
|
||||
PROP_X11_AUTHORITY_FILE,
|
||||
PROP_IS_CONNECTED,
|
||||
PROP_IS_LOCAL,
|
||||
PROP_LAUNCH_ENVIRONMENT,
|
||||
PROP_IS_INITIAL,
|
||||
PROP_ALLOW_TIMED_LOGIN,
|
||||
PROP_HAVE_EXISTING_USER_ACCOUNTS,
|
||||
PROP_DOING_INITIAL_SETUP,
|
||||
};
|
||||
|
||||
static void gdm_display_class_init (GdmDisplayClass *klass);
|
||||
static void gdm_display_init (GdmDisplay *self);
|
||||
static void gdm_display_finalize (GObject *object);
|
||||
static void queue_finish (GdmDisplay *self);
|
||||
static void _gdm_display_set_status (GdmDisplay *self,
|
||||
int status);
|
||||
static gboolean wants_initial_setup (GdmDisplay *self);
|
||||
G_DEFINE_ABSTRACT_TYPE (GdmDisplay, gdm_display, G_TYPE_OBJECT)
|
||||
|
||||
-static gboolean
|
||||
-chown_file (GFile *file,
|
||||
- uid_t uid,
|
||||
- gid_t gid,
|
||||
- GError **error)
|
||||
-{
|
||||
- if (!g_file_set_attribute_uint32 (file, G_FILE_ATTRIBUTE_UNIX_UID, uid,
|
||||
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
- NULL, error)) {
|
||||
- return FALSE;
|
||||
- }
|
||||
- if (!g_file_set_attribute_uint32 (file, G_FILE_ATTRIBUTE_UNIX_GID, gid,
|
||||
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
- NULL, error)) {
|
||||
- return FALSE;
|
||||
- }
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
-static gboolean
|
||||
-chown_recursively (GFile *dir,
|
||||
- uid_t uid,
|
||||
- gid_t gid,
|
||||
- GError **error)
|
||||
-{
|
||||
- GFile *file = NULL;
|
||||
- GFileInfo *info = NULL;
|
||||
- GFileEnumerator *enumerator = NULL;
|
||||
- gboolean retval = FALSE;
|
||||
-
|
||||
- if (chown_file (dir, uid, gid, error) == FALSE) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- enumerator = g_file_enumerate_children (dir,
|
||||
- G_FILE_ATTRIBUTE_STANDARD_TYPE","
|
||||
- G_FILE_ATTRIBUTE_STANDARD_NAME,
|
||||
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
- NULL, error);
|
||||
- if (!enumerator) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- while ((info = g_file_enumerator_next_file (enumerator, NULL, error)) != NULL) {
|
||||
- file = g_file_get_child (dir, g_file_info_get_name (info));
|
||||
-
|
||||
- if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
|
||||
- if (chown_recursively (file, uid, gid, error) == FALSE) {
|
||||
- goto out;
|
||||
- }
|
||||
- } else if (chown_file (file, uid, gid, error) == FALSE) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- g_clear_object (&file);
|
||||
- g_clear_object (&info);
|
||||
- }
|
||||
-
|
||||
- if (*error) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- retval = TRUE;
|
||||
-out:
|
||||
- g_clear_object (&file);
|
||||
- g_clear_object (&info);
|
||||
- g_clear_object (&enumerator);
|
||||
-
|
||||
- return retval;
|
||||
-}
|
||||
-
|
||||
GQuark
|
||||
gdm_display_error_quark (void)
|
||||
{
|
||||
static GQuark ret = 0;
|
||||
if (ret == 0) {
|
||||
ret = g_quark_from_static_string ("gdm_display_error");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
time_t
|
||||
gdm_display_get_creation_time (GdmDisplay *self)
|
||||
{
|
||||
g_return_val_if_fail (GDM_IS_DISPLAY (self), 0);
|
||||
|
||||
return self->priv->creation_time;
|
||||
}
|
||||
|
||||
int
|
||||
gdm_display_get_status (GdmDisplay *self)
|
||||
{
|
||||
g_return_val_if_fail (GDM_IS_DISPLAY (self), 0);
|
||||
|
||||
return self->priv->status;
|
||||
}
|
||||
|
||||
const char *
|
||||
gdm_display_get_session_id (GdmDisplay *self)
|
||||
{
|
||||
@@ -1631,145 +1559,85 @@ gdm_display_start_greeter_session (GdmDisplay *self)
|
||||
G_CALLBACK (on_launch_environment_session_stopped),
|
||||
self, 0);
|
||||
g_signal_connect_object (self->priv->launch_environment,
|
||||
"exited",
|
||||
G_CALLBACK (on_launch_environment_session_exited),
|
||||
self, 0);
|
||||
g_signal_connect_object (self->priv->launch_environment,
|
||||
"died",
|
||||
G_CALLBACK (on_launch_environment_session_died),
|
||||
self, 0);
|
||||
|
||||
if (auth_file != NULL) {
|
||||
g_object_set (self->priv->launch_environment,
|
||||
"x11-authority-file", auth_file,
|
||||
NULL);
|
||||
}
|
||||
|
||||
gdm_launch_environment_start (self->priv->launch_environment);
|
||||
|
||||
session = gdm_launch_environment_get_session (self->priv->launch_environment);
|
||||
g_object_set (G_OBJECT (session),
|
||||
"display-is-initial", self->priv->is_initial,
|
||||
NULL);
|
||||
|
||||
g_free (display_name);
|
||||
g_free (seat_id);
|
||||
g_free (hostname);
|
||||
g_free (auth_file);
|
||||
}
|
||||
|
||||
-static void
|
||||
-chown_initial_setup_home_dir (void)
|
||||
-{
|
||||
- GFile *dir;
|
||||
- GError *error;
|
||||
- char *gis_dir_path;
|
||||
- char *gis_uid_path;
|
||||
- char *gis_uid_contents;
|
||||
- struct passwd *pwe;
|
||||
- uid_t uid;
|
||||
-
|
||||
- if (!gdm_get_pwent_for_name (INITIAL_SETUP_USERNAME, &pwe)) {
|
||||
- g_warning ("Unknown user %s", INITIAL_SETUP_USERNAME);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- gis_dir_path = g_strdup (pwe->pw_dir);
|
||||
-
|
||||
- gis_uid_path = g_build_filename (gis_dir_path,
|
||||
- "gnome-initial-setup-uid",
|
||||
- NULL);
|
||||
- if (!g_file_get_contents (gis_uid_path, &gis_uid_contents, NULL, NULL)) {
|
||||
- g_warning ("Unable to read %s", gis_uid_path);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- uid = (uid_t) atoi (gis_uid_contents);
|
||||
- pwe = getpwuid (uid);
|
||||
- if (uid == 0 || pwe == NULL) {
|
||||
- g_warning ("UID '%s' in %s is not valid", gis_uid_contents, gis_uid_path);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- error = NULL;
|
||||
- dir = g_file_new_for_path (gis_dir_path);
|
||||
- if (!chown_recursively (dir, pwe->pw_uid, pwe->pw_gid, &error)) {
|
||||
- g_warning ("Failed to change ownership for %s: %s", gis_dir_path, error->message);
|
||||
- g_error_free (error);
|
||||
- }
|
||||
- g_object_unref (dir);
|
||||
-out:
|
||||
- g_free (gis_uid_contents);
|
||||
- g_free (gis_uid_path);
|
||||
- g_free (gis_dir_path);
|
||||
-}
|
||||
-
|
||||
void
|
||||
gdm_display_stop_greeter_session (GdmDisplay *self)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (self->priv->launch_environment != NULL) {
|
||||
|
||||
g_signal_handlers_disconnect_by_func (self->priv->launch_environment,
|
||||
G_CALLBACK (on_launch_environment_session_opened),
|
||||
self);
|
||||
g_signal_handlers_disconnect_by_func (self->priv->launch_environment,
|
||||
G_CALLBACK (on_launch_environment_session_started),
|
||||
self);
|
||||
g_signal_handlers_disconnect_by_func (self->priv->launch_environment,
|
||||
G_CALLBACK (on_launch_environment_session_stopped),
|
||||
self);
|
||||
g_signal_handlers_disconnect_by_func (self->priv->launch_environment,
|
||||
G_CALLBACK (on_launch_environment_session_exited),
|
||||
self);
|
||||
g_signal_handlers_disconnect_by_func (self->priv->launch_environment,
|
||||
G_CALLBACK (on_launch_environment_session_died),
|
||||
self);
|
||||
gdm_launch_environment_stop (self->priv->launch_environment);
|
||||
g_clear_object (&self->priv->launch_environment);
|
||||
}
|
||||
-
|
||||
- if (self->priv->doing_initial_setup) {
|
||||
- chown_initial_setup_home_dir ();
|
||||
-
|
||||
- if (!g_file_set_contents (ALREADY_RAN_INITIAL_SETUP_ON_THIS_BOOT,
|
||||
- "1",
|
||||
- 1,
|
||||
- &error)) {
|
||||
- g_warning ("GdmDisplay: Could not write initial-setup-done marker to %s: %s",
|
||||
- ALREADY_RAN_INITIAL_SETUP_ON_THIS_BOOT,
|
||||
- error->message);
|
||||
- g_clear_error (&error);
|
||||
- }
|
||||
- }
|
||||
}
|
||||
|
||||
static xcb_window_t
|
||||
get_root_window (xcb_connection_t *connection,
|
||||
int screen_number)
|
||||
{
|
||||
xcb_screen_t *screen = NULL;
|
||||
xcb_screen_iterator_t iter;
|
||||
|
||||
iter = xcb_setup_roots_iterator (xcb_get_setup (connection));
|
||||
while (iter.rem) {
|
||||
if (screen_number == 0)
|
||||
screen = iter.data;
|
||||
screen_number--;
|
||||
xcb_screen_next (&iter);
|
||||
}
|
||||
|
||||
if (screen != NULL) {
|
||||
return screen->root;
|
||||
}
|
||||
|
||||
return XCB_WINDOW_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdm_display_set_windowpath (GdmDisplay *self)
|
||||
{
|
||||
/* setting WINDOWPATH for clients */
|
||||
xcb_intern_atom_cookie_t atom_cookie;
|
||||
xcb_intern_atom_reply_t *atom_reply = NULL;
|
||||
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
||||
index 62a967389..4d2ad9dec 100644
|
||||
--- a/daemon/gdm-manager.c
|
||||
+++ b/daemon/gdm-manager.c
|
||||
@@ -35,60 +35,61 @@
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <act/act-user-manager.h>
|
||||
|
||||
#include <systemd/sd-login.h>
|
||||
|
||||
#include "gdm-common.h"
|
||||
|
||||
#include "gdm-dbus-util.h"
|
||||
#include "gdm-manager.h"
|
||||
#include "gdm-manager-glue.h"
|
||||
#include "gdm-display-store.h"
|
||||
#include "gdm-display-factory.h"
|
||||
#include "gdm-launch-environment.h"
|
||||
#include "gdm-local-display.h"
|
||||
#include "gdm-local-display-factory.h"
|
||||
#include "gdm-session.h"
|
||||
#include "gdm-session-record.h"
|
||||
#include "gdm-settings-direct.h"
|
||||
#include "gdm-settings-keys.h"
|
||||
#include "gdm-xdmcp-display-factory.h"
|
||||
#include "gdm-xdmcp-chooser-display.h"
|
||||
|
||||
#define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate))
|
||||
|
||||
#define GDM_DBUS_PATH "/org/gnome/DisplayManager"
|
||||
#define GDM_MANAGER_PATH GDM_DBUS_PATH "/Manager"
|
||||
#define GDM_MANAGER_DISPLAYS_PATH GDM_DBUS_PATH "/Displays"
|
||||
|
||||
#define INITIAL_SETUP_USERNAME "gnome-initial-setup"
|
||||
+#define ALREADY_RAN_INITIAL_SETUP_ON_THIS_BOOT GDM_RUN_DIR "/gdm.ran-initial-setup"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GdmManager *manager;
|
||||
GdmSession *session;
|
||||
char *service_name;
|
||||
guint idle_id;
|
||||
} StartUserSessionOperation;
|
||||
|
||||
struct GdmManagerPrivate
|
||||
{
|
||||
GdmDisplayStore *display_store;
|
||||
GdmLocalDisplayFactory *local_factory;
|
||||
#ifdef HAVE_LIBXDMCP
|
||||
GdmXdmcpDisplayFactory *xdmcp_factory;
|
||||
#endif
|
||||
GdmDisplay *automatic_login_display;
|
||||
GList *user_sessions;
|
||||
GHashTable *transient_sessions;
|
||||
GHashTable *open_reauthentication_requests;
|
||||
gboolean xdmcp_enabled;
|
||||
|
||||
gboolean started;
|
||||
gboolean show_local_greeter;
|
||||
|
||||
GDBusConnection *connection;
|
||||
GDBusObjectManagerServer *object_manager;
|
||||
|
||||
#ifdef WITH_PLYMOUTH
|
||||
guint plymouth_is_running : 1;
|
||||
@@ -1568,130 +1569,261 @@ start_user_session (GdmManager *manager,
|
||||
|
||||
destroy_start_user_session_operation (operation);
|
||||
}
|
||||
|
||||
static void
|
||||
create_display_for_user_session (GdmManager *self,
|
||||
GdmSession *session,
|
||||
const char *session_id)
|
||||
{
|
||||
GdmDisplay *display;
|
||||
/* at the moment we only create GdmLocalDisplay objects on seat0 */
|
||||
const char *seat_id = "seat0";
|
||||
|
||||
display = gdm_local_display_new ();
|
||||
|
||||
g_object_set (G_OBJECT (display),
|
||||
"session-class", "user",
|
||||
"seat-id", seat_id,
|
||||
"session-id", session_id,
|
||||
NULL);
|
||||
gdm_display_store_add (self->priv->display_store,
|
||||
display);
|
||||
g_object_set_data (G_OBJECT (session), "gdm-display", display);
|
||||
g_object_set_data_full (G_OBJECT (display),
|
||||
"gdm-user-session",
|
||||
g_object_ref (session),
|
||||
(GDestroyNotify)
|
||||
clean_user_session);
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+chown_file (GFile *file,
|
||||
+ uid_t uid,
|
||||
+ gid_t gid,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ if (!g_file_set_attribute_uint32 (file, G_FILE_ATTRIBUTE_UNIX_UID, uid,
|
||||
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
+ NULL, error)) {
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ if (!g_file_set_attribute_uint32 (file, G_FILE_ATTRIBUTE_UNIX_GID, gid,
|
||||
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
+ NULL, error)) {
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+chown_recursively (GFile *dir,
|
||||
+ uid_t uid,
|
||||
+ gid_t gid,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ GFile *file = NULL;
|
||||
+ GFileInfo *info = NULL;
|
||||
+ GFileEnumerator *enumerator = NULL;
|
||||
+ gboolean retval = FALSE;
|
||||
+
|
||||
+ if (chown_file (dir, uid, gid, error) == FALSE) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ enumerator = g_file_enumerate_children (dir,
|
||||
+ G_FILE_ATTRIBUTE_STANDARD_TYPE","
|
||||
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
|
||||
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
+ NULL, error);
|
||||
+ if (!enumerator) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ while ((info = g_file_enumerator_next_file (enumerator, NULL, error)) != NULL) {
|
||||
+ file = g_file_get_child (dir, g_file_info_get_name (info));
|
||||
+
|
||||
+ if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
|
||||
+ if (chown_recursively (file, uid, gid, error) == FALSE) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+ } else if (chown_file (file, uid, gid, error) == FALSE) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ g_clear_object (&file);
|
||||
+ g_clear_object (&info);
|
||||
+ }
|
||||
+
|
||||
+ if (*error) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ retval = TRUE;
|
||||
+out:
|
||||
+ g_clear_object (&file);
|
||||
+ g_clear_object (&info);
|
||||
+ g_clear_object (&enumerator);
|
||||
+
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+chown_initial_setup_home_dir (void)
|
||||
+{
|
||||
+ GFile *dir;
|
||||
+ GError *error;
|
||||
+ char *gis_dir_path;
|
||||
+ char *gis_uid_path;
|
||||
+ char *gis_uid_contents;
|
||||
+ struct passwd *pwe;
|
||||
+ uid_t uid;
|
||||
+
|
||||
+ if (!gdm_get_pwent_for_name (INITIAL_SETUP_USERNAME, &pwe)) {
|
||||
+ g_warning ("Unknown user %s", INITIAL_SETUP_USERNAME);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ gis_dir_path = g_strdup (pwe->pw_dir);
|
||||
+
|
||||
+ gis_uid_path = g_build_filename (gis_dir_path,
|
||||
+ "gnome-initial-setup-uid",
|
||||
+ NULL);
|
||||
+ if (!g_file_get_contents (gis_uid_path, &gis_uid_contents, NULL, NULL)) {
|
||||
+ g_warning ("Unable to read %s", gis_uid_path);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ uid = (uid_t) atoi (gis_uid_contents);
|
||||
+ pwe = getpwuid (uid);
|
||||
+ if (uid == 0 || pwe == NULL) {
|
||||
+ g_warning ("UID '%s' in %s is not valid", gis_uid_contents, gis_uid_path);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ error = NULL;
|
||||
+ dir = g_file_new_for_path (gis_dir_path);
|
||||
+ if (!chown_recursively (dir, pwe->pw_uid, pwe->pw_gid, &error)) {
|
||||
+ g_warning ("Failed to change ownership for %s: %s", gis_dir_path, error->message);
|
||||
+ g_error_free (error);
|
||||
+ }
|
||||
+ g_object_unref (dir);
|
||||
+out:
|
||||
+ g_free (gis_uid_contents);
|
||||
+ g_free (gis_uid_path);
|
||||
+ g_free (gis_dir_path);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
on_start_user_session (StartUserSessionOperation *operation)
|
||||
{
|
||||
GdmManager *self = operation->manager;
|
||||
gboolean migrated;
|
||||
gboolean fail_if_already_switched = TRUE;
|
||||
gboolean doing_initial_setup = FALSE;
|
||||
GdmDisplay *display;
|
||||
const char *session_id;
|
||||
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
|
||||
g_autofree char *display_session_type = NULL;
|
||||
#endif
|
||||
|
||||
g_debug ("GdmManager: start or jump to session");
|
||||
|
||||
/* If there's already a session running, jump to it.
|
||||
* If the only session running is the one we just opened,
|
||||
* start a session on it.
|
||||
*/
|
||||
migrated = switch_to_compatible_user_session (operation->manager, operation->session, fail_if_already_switched);
|
||||
|
||||
g_debug ("GdmManager: migrated: %d", migrated);
|
||||
if (migrated) {
|
||||
/* We don't stop the manager here because
|
||||
when Xorg exits it switches to the VT it was
|
||||
started from. That interferes with fast
|
||||
user switching. */
|
||||
gdm_session_reset (operation->session);
|
||||
destroy_start_user_session_operation (operation);
|
||||
goto out;
|
||||
}
|
||||
|
||||
display = get_display_for_user_session (operation->session);
|
||||
|
||||
g_object_get (G_OBJECT (display),
|
||||
"doing-initial-setup", &doing_initial_setup,
|
||||
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
|
||||
"session-type", &display_session_type,
|
||||
#endif
|
||||
NULL);
|
||||
|
||||
session_id = gdm_session_get_conversation_session_id (operation->session,
|
||||
operation->service_name);
|
||||
|
||||
if (gdm_session_get_display_mode (operation->session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) {
|
||||
/* In this case, the greeter's display is morphing into
|
||||
* the user session display. Kill the greeter on this session
|
||||
* and let the user session follow the same display. */
|
||||
gdm_display_stop_greeter_session (display);
|
||||
g_object_set (G_OBJECT (display),
|
||||
"session-class", "user",
|
||||
"session-id", session_id,
|
||||
NULL);
|
||||
} else {
|
||||
uid_t allowed_uid;
|
||||
|
||||
g_object_ref (display);
|
||||
if (doing_initial_setup) {
|
||||
+ g_autoptr(GError) error = NULL;
|
||||
+
|
||||
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
|
||||
if (g_strcmp0 (display_session_type, "wayland") == 0) {
|
||||
g_debug ("GdmManager: closing down initial setup display in background");
|
||||
g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_WAITING_TO_FINISH, NULL);
|
||||
}
|
||||
#endif
|
||||
if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
|
||||
g_debug ("GdmManager: closing down initial setup display");
|
||||
gdm_display_stop_greeter_session (display);
|
||||
gdm_display_unmanage (display);
|
||||
gdm_display_finish (display);
|
||||
}
|
||||
+
|
||||
+ chown_initial_setup_home_dir ();
|
||||
+
|
||||
+ if (!g_file_set_contents (ALREADY_RAN_INITIAL_SETUP_ON_THIS_BOOT,
|
||||
+ "1",
|
||||
+ 1,
|
||||
+ &error)) {
|
||||
+ g_warning ("GdmDisplay: Could not write initial-setup-done marker to %s: %s",
|
||||
+ ALREADY_RAN_INITIAL_SETUP_ON_THIS_BOOT,
|
||||
+ error->message);
|
||||
+ g_clear_error (&error);
|
||||
+ }
|
||||
} else {
|
||||
g_debug ("GdmManager: session has its display server, reusing our server for another login screen");
|
||||
}
|
||||
|
||||
/* The user session is going to follow the session worker
|
||||
* into the new display. Untie it from this display and
|
||||
* create a new session for a future user login. */
|
||||
allowed_uid = gdm_session_get_allowed_user (operation->session);
|
||||
g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
|
||||
g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
|
||||
create_user_session_for_display (operation->manager, display, allowed_uid);
|
||||
|
||||
/* Give the user session a new display object for bookkeeping purposes */
|
||||
create_display_for_user_session (operation->manager,
|
||||
operation->session,
|
||||
session_id);
|
||||
|
||||
|
||||
if (g_strcmp0 (operation->service_name, "gdm-autologin") == 0) {
|
||||
/* remove the unused prepared greeter display since we're not going
|
||||
* to have a greeter */
|
||||
gdm_display_store_remove (self->priv->display_store, display);
|
||||
g_object_unref (display);
|
||||
|
||||
self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
|
||||
g_object_add_weak_pointer (G_OBJECT (self->priv->automatic_login_display), (gpointer *) &self->priv->automatic_login_display);
|
||||
}
|
||||
}
|
||||
|
||||
start_user_session (operation->manager, operation);
|
||||
--
|
||||
2.17.1
|
||||
|
13
gdm.spec
13
gdm.spec
@ -9,22 +9,18 @@
|
||||
|
||||
Name: gdm
|
||||
Epoch: 1
|
||||
Version: 3.30.1
|
||||
Release: 2%{?dist}
|
||||
Version: 3.30.2
|
||||
Release: 1%{?dist}
|
||||
Summary: The GNOME Display Manager
|
||||
|
||||
License: GPLv2+
|
||||
URL: https://wiki.gnome.org/Projects/GDM
|
||||
Source0: http://download.gnome.org/sources/gdm/3.29/gdm-%{version}.tar.xz
|
||||
Source0: http://download.gnome.org/sources/gdm/3.30/gdm-%{version}.tar.xz
|
||||
Source1: org.gnome.login-screen.gschema.override
|
||||
Patch0: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
|
||||
|
||||
Patch11: 0001-manager-correct-display-confusion.patch
|
||||
|
||||
Patch21: 0001-local-display-factory-defer-initialization-for-CanGr.patch
|
||||
|
||||
Patch31: 0001-manager-do-initial-setup-post-work-in-manager-code.patch
|
||||
|
||||
Patch99: system-dconf.patch
|
||||
|
||||
BuildRequires: pam-devel >= 0:%{pam_version}
|
||||
@ -318,6 +314,9 @@ fi
|
||||
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
|
||||
|
||||
%changelog
|
||||
* Wed Dec 19 2018 Kalev Lember <klember@redhat.com> - 1:3.30.2-1
|
||||
- Update to 3.30.2
|
||||
|
||||
* Sat Oct 06 2018 Ray Strode <rstrode@redhat.com> - 1:3.30.1-2
|
||||
- Fix login screen for machines that boot to fast
|
||||
- Fix autologin crash
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (gdm-3.30.1.tar.xz) = 60e830ea76fac5e8cf275993e42cac9f342bf0eca86a9463fe5317a8b5e6dcf40672f466970c26fb4fe93a5fdf84c6e38cd78e9e2d172b2ca9ba038438c16f16
|
||||
SHA512 (gdm-3.30.2.tar.xz) = c87fe7945e36b90aa4a341617d5b96dc38aa894cff09c2b02ebc16f66c9eafc8f3ad4b01beb0fa20c126e97f3d4721bf6b3df2d18f6811ac3da5f794c5bb7aa3
|
||||
|
Loading…
Reference in New Issue
Block a user