242 lines
7.9 KiB
Diff
242 lines
7.9 KiB
Diff
|
From 42d8bdfc0d37460cedf6fb3fe59bdfc0769c48ec Mon Sep 17 00:00:00 2001
|
|||
|
From: Ray Strode <rstrode@redhat.com>
|
|||
|
Date: Fri, 25 Aug 2023 21:30:42 -0400
|
|||
|
Subject: [PATCH 05/10] summary: Write uid file with other state files
|
|||
|
|
|||
|
When creating a user account gnome-initial-setup writes a file
|
|||
|
saying what the uid of the new user is, so that GDM can make
|
|||
|
gnome-initial-setup's configuration available to the user.
|
|||
|
|
|||
|
It does this from the summary page, but it would be better to do
|
|||
|
it more centrally along with other state files so it can be used
|
|||
|
for modes that don't have the summary page.
|
|||
|
|
|||
|
This is important groundwork for a "live user" mode that will
|
|||
|
get added in a future commit.
|
|||
|
---
|
|||
|
gnome-initial-setup/gnome-initial-setup.c | 37 +++++++++++++++++++
|
|||
|
.../pages/summary/gis-summary-page.c | 24 ------------
|
|||
|
2 files changed, 37 insertions(+), 24 deletions(-)
|
|||
|
|
|||
|
diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c
|
|||
|
index 49e8e6ca..3635f293 100644
|
|||
|
--- a/gnome-initial-setup/gnome-initial-setup.c
|
|||
|
+++ b/gnome-initial-setup/gnome-initial-setup.c
|
|||
|
@@ -418,61 +418,98 @@ write_state (GisDriver *driver)
|
|||
|
g_auto(GStrv) visited_pages = NULL;
|
|||
|
GisAssistant *assistant;
|
|||
|
GList *pages, *node;
|
|||
|
|
|||
|
state = g_key_file_new ();
|
|||
|
|
|||
|
builder = g_strv_builder_new ();
|
|||
|
|
|||
|
assistant = gis_driver_get_assistant (driver);
|
|||
|
pages = gis_assistant_get_all_pages (assistant);
|
|||
|
for (node = pages; node != NULL; node = node->next) {
|
|||
|
GisPage *page = node->data;
|
|||
|
g_strv_builder_add (builder, GIS_PAGE_GET_CLASS (page)->page_id);
|
|||
|
}
|
|||
|
|
|||
|
visited_pages = g_strv_builder_end (builder);
|
|||
|
|
|||
|
g_key_file_set_string_list (state,
|
|||
|
VENDOR_PAGES_GROUP,
|
|||
|
VENDOR_SKIP_KEY,
|
|||
|
(const char * const *)
|
|||
|
visited_pages,
|
|||
|
g_strv_length (visited_pages));
|
|||
|
|
|||
|
if (!g_key_file_save_to_file (state, STATE_FILE, &error)) {
|
|||
|
g_warning ("Unable to save state to %s: %s", STATE_FILE, error->message);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
+static void
|
|||
|
+add_uid_file (GisDriver *driver)
|
|||
|
+{
|
|||
|
+ gchar *gis_uid_path;
|
|||
|
+ gchar *uid_str;
|
|||
|
+ uid_t uid;
|
|||
|
+ g_autoptr(GError) error = NULL;
|
|||
|
+ ActUser *user_account = NULL;
|
|||
|
+
|
|||
|
+ gis_driver_get_user_permissions (driver, &user_account, NULL);
|
|||
|
+
|
|||
|
+ if (user_account == NULL)
|
|||
|
+ return;
|
|||
|
+
|
|||
|
+ uid = act_user_get_uid (user_account);
|
|||
|
+
|
|||
|
+ gis_uid_path = g_build_filename (g_get_home_dir (),
|
|||
|
+ "gnome-initial-setup-uid",
|
|||
|
+ NULL);
|
|||
|
+ uid_str = g_strdup_printf ("%u", uid);
|
|||
|
+
|
|||
|
+ if (!g_file_set_contents (gis_uid_path, uid_str, -1, &error))
|
|||
|
+ g_warning ("Unable to create %s: %s", gis_uid_path, error->message);
|
|||
|
+
|
|||
|
+ g_free (uid_str);
|
|||
|
+ g_free (gis_uid_path);
|
|||
|
+}
|
|||
|
+
|
|||
|
void
|
|||
|
gis_ensure_stamp_files (GisDriver *driver)
|
|||
|
{
|
|||
|
g_autofree gchar *done_file = NULL;
|
|||
|
g_autoptr(GError) error = NULL;
|
|||
|
+ GisDriverMode driver_mode;
|
|||
|
|
|||
|
done_file = g_build_filename (g_get_user_config_dir (), "gnome-initial-setup-done", NULL);
|
|||
|
if (!g_file_set_contents (done_file, "yes", -1, &error)) {
|
|||
|
g_warning ("Unable to create %s: %s", done_file, error->message);
|
|||
|
g_clear_error (&error);
|
|||
|
}
|
|||
|
|
|||
|
+ driver_mode = gis_driver_get_mode (driver);
|
|||
|
+
|
|||
|
+ /* If we're in a system mode write out which UID the created user is so GDM can make the
|
|||
|
+ * gnome-initial-setup home directory readable to the created user.
|
|||
|
+ */
|
|||
|
+ if (driver_mode & GIS_DRIVER_MODE_SYSTEM)
|
|||
|
+ add_uid_file (driver);
|
|||
|
+
|
|||
|
write_state (driver);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* gis_get_mock_mode:
|
|||
|
*
|
|||
|
* Gets whether gnome-initial-setup has been built for development, and hence
|
|||
|
* shouldn’t permanently change any system configuration.
|
|||
|
*
|
|||
|
* By default, mock mode is enabled when running in a build environment. This
|
|||
|
* heuristic may be changed in future.
|
|||
|
*
|
|||
|
* Returns: %TRUE if in mock mode, %FALSE otherwise
|
|||
|
*/
|
|||
|
gboolean
|
|||
|
gis_get_mock_mode (void)
|
|||
|
{
|
|||
|
return (g_getenv ("UNDER_JHBUILD") != NULL);
|
|||
|
}
|
|||
|
diff --git a/gnome-initial-setup/pages/summary/gis-summary-page.c b/gnome-initial-setup/pages/summary/gis-summary-page.c
|
|||
|
index 0aee2dad..b072f7fc 100644
|
|||
|
--- a/gnome-initial-setup/pages/summary/gis-summary-page.c
|
|||
|
+++ b/gnome-initial-setup/pages/summary/gis-summary-page.c
|
|||
|
@@ -91,110 +91,86 @@ static void
|
|||
|
on_secret_info_query (GdmUserVerifier *user_verifier,
|
|||
|
const char *service_name,
|
|||
|
const char *question,
|
|||
|
GisSummaryPage *page)
|
|||
|
{
|
|||
|
GisSummaryPagePrivate *priv = gis_summary_page_get_instance_private (page);
|
|||
|
gboolean should_send_password = priv->user_password != NULL;
|
|||
|
|
|||
|
g_debug ("PAM module secret info query: %s", question);
|
|||
|
if (should_send_password) {
|
|||
|
g_debug ("sending password\n");
|
|||
|
gdm_user_verifier_call_answer_query (user_verifier,
|
|||
|
service_name,
|
|||
|
priv->user_password,
|
|||
|
NULL, NULL, NULL);
|
|||
|
priv->user_password = NULL;
|
|||
|
} else {
|
|||
|
request_info_query (page, user_verifier, question, TRUE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static void
|
|||
|
on_session_opened (GdmGreeter *greeter,
|
|||
|
const char *service_name,
|
|||
|
GisSummaryPage *page)
|
|||
|
{
|
|||
|
gdm_greeter_call_start_session_when_ready_sync (greeter, service_name,
|
|||
|
TRUE, NULL, NULL);
|
|||
|
}
|
|||
|
|
|||
|
-static void
|
|||
|
-add_uid_file (uid_t uid)
|
|||
|
-{
|
|||
|
- gchar *gis_uid_path;
|
|||
|
- gchar *uid_str;
|
|||
|
- g_autoptr(GError) error = NULL;
|
|||
|
-
|
|||
|
- gis_uid_path = g_build_filename (g_get_home_dir (),
|
|||
|
- "gnome-initial-setup-uid",
|
|||
|
- NULL);
|
|||
|
- uid_str = g_strdup_printf ("%u", uid);
|
|||
|
-
|
|||
|
- if (!g_file_set_contents (gis_uid_path, uid_str, -1, &error))
|
|||
|
- g_warning ("Unable to create %s: %s", gis_uid_path, error->message);
|
|||
|
-
|
|||
|
- g_free (uid_str);
|
|||
|
- g_free (gis_uid_path);
|
|||
|
-}
|
|||
|
-
|
|||
|
static void
|
|||
|
log_user_in (GisSummaryPage *page)
|
|||
|
{
|
|||
|
GisSummaryPagePrivate *priv = gis_summary_page_get_instance_private (page);
|
|||
|
g_autoptr(GError) error = NULL;
|
|||
|
GdmGreeter *greeter = NULL;
|
|||
|
GdmUserVerifier *user_verifier = NULL;
|
|||
|
|
|||
|
if (!gis_driver_get_gdm_objects (GIS_PAGE (page)->driver,
|
|||
|
&greeter, &user_verifier)) {
|
|||
|
g_warning ("No GDM connection; not initiating login");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
g_signal_connect (user_verifier, "info",
|
|||
|
G_CALLBACK (on_info), page);
|
|||
|
g_signal_connect (user_verifier, "problem",
|
|||
|
G_CALLBACK (on_problem), page);
|
|||
|
g_signal_connect (user_verifier, "info-query",
|
|||
|
G_CALLBACK (on_info_query), page);
|
|||
|
g_signal_connect (user_verifier, "secret-info-query",
|
|||
|
G_CALLBACK (on_secret_info_query), page);
|
|||
|
|
|||
|
g_signal_connect (greeter, "session-opened",
|
|||
|
G_CALLBACK (on_session_opened), page);
|
|||
|
|
|||
|
- /* We are in NEW_USER mode and we want to make it possible for third
|
|||
|
- * parties to find out which user ID we created.
|
|||
|
- */
|
|||
|
- add_uid_file (act_user_get_uid (priv->user_account));
|
|||
|
-
|
|||
|
gdm_user_verifier_call_begin_verification_for_user_sync (user_verifier,
|
|||
|
SERVICE_NAME,
|
|||
|
act_user_get_user_name (priv->user_account),
|
|||
|
NULL, &error);
|
|||
|
|
|||
|
if (error != NULL)
|
|||
|
g_warning ("Could not begin verification: %s", error->message);
|
|||
|
}
|
|||
|
|
|||
|
static void
|
|||
|
done_cb (GtkButton *button, GisSummaryPage *page)
|
|||
|
{
|
|||
|
gis_ensure_stamp_files (GIS_PAGE (page)->driver);
|
|||
|
|
|||
|
switch (gis_driver_get_mode (GIS_PAGE (page)->driver))
|
|||
|
{
|
|||
|
case GIS_DRIVER_MODE_NEW_USER:
|
|||
|
gis_driver_hide_window (GIS_PAGE (page)->driver);
|
|||
|
log_user_in (page);
|
|||
|
break;
|
|||
|
case GIS_DRIVER_MODE_EXISTING_USER:
|
|||
|
g_application_quit (G_APPLICATION (GIS_PAGE (page)->driver));
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static void
|
|||
|
gis_summary_page_shown (GisPage *page)
|
|||
|
{
|
|||
|
--
|
|||
|
2.41.0.rc2
|
|||
|
|