diff options
author | Ray Strode <rstrode@redhat.com> | 2023-04-04 16:21:59 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2023-04-04 16:27:27 -0400 |
commit | 4c2e8969ebe2d3a5238b08b08eea4749cf5b7663 (patch) | |
tree | 4ca7c06639a98842d8a6c01dcb80c6337fd197fa | |
parent | 00b9a89bdfcf69d5502aa12884589a7efe1a2946 (diff) | |
download | gnome-initial-setup-4c2e8969ebe2d3a5238b08b08eea4749cf5b7663.tar.gz |
wip! Sketch out a live user modewip/live-user-mode
This is just an untested, first cut at adding a live user mode as
described in https://pagure.io/fedora-workstation/issue/362#comment-850114
-rw-r--r-- | gnome-initial-setup/gis-driver.c | 6 | ||||
-rw-r--r-- | gnome-initial-setup/gis-driver.h | 6 | ||||
-rw-r--r-- | gnome-initial-setup/gnome-initial-setup.c | 90 | ||||
-rw-r--r-- | gnome-initial-setup/pages/account/gis-account-pages.c | 21 | ||||
-rw-r--r-- | gnome-initial-setup/pages/summary/gis-summary-page.c | 1 |
5 files changed, 94 insertions, 30 deletions
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c index f226576..e34893b 100644 --- a/gnome-initial-setup/gis-driver.c +++ b/gnome-initial-setup/gis-driver.c @@ -45,12 +45,14 @@ gis_driver_mode_get_type (void) { static GType enum_type_id = 0; if (G_UNLIKELY (!enum_type_id)) { - static const GEnumValue values[] = { + static const GFlagsValue values[] = { { GIS_DRIVER_MODE_NEW_USER, "GIS_DRIVER_MODE_NEW_USER", "new_user" }, { GIS_DRIVER_MODE_EXISTING_USER, "GIS_DRIVER_MODE_EXISTING_USER", "existing_user" }, + { GIS_DRIVER_MODE_LIVE_USER, "GIS_DRIVER_MODE_LIVE_USER", "live_user" }, + { GIS_DRIVER_MODE_ALL, "GIS_DRIVER_MODE_ALL", "all" }, { 0, NULL, NULL } }; - enum_type_id = g_enum_register_static("GisDriverMode", values); + enum_type_id = g_flags_register_static("GisDriverMode", values); } return enum_type_id; } diff --git a/gnome-initial-setup/gis-driver.h b/gnome-initial-setup/gis-driver.h index 9b935e2..cde9a0c 100644 --- a/gnome-initial-setup/gis-driver.h +++ b/gnome-initial-setup/gis-driver.h @@ -41,8 +41,10 @@ typedef enum { } UmAccountMode; typedef enum { - GIS_DRIVER_MODE_NEW_USER, - GIS_DRIVER_MODE_EXISTING_USER, + GIS_DRIVER_MODE_NEW_USER = 1 << 0, + GIS_DRIVER_MODE_EXISTING_USER = 1 << 1, + GIS_DRIVER_MODE_LIVE_USER = 1 << 2, + GIS_DRIVER_MODE_ALL = (GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_LIVE_USER), } GisDriverMode; GisAssistant *gis_driver_get_assistant (GisDriver *driver); diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c index 113ded3..704652b 100644 --- a/gnome-initial-setup/gnome-initial-setup.c +++ b/gnome-initial-setup/gnome-initial-setup.c @@ -46,8 +46,10 @@ #define VENDOR_SKIP_KEY "skip" #define VENDOR_NEW_USER_ONLY_KEY "new_user_only" #define VENDOR_EXISTING_USER_ONLY_KEY "existing_user_only" +#define VENDOR_LIVE_USER_ONLY_KEY "live_user_only" static gboolean force_existing_user_mode; +static gboolean force_live_user_mode; static GPtrArray *skipped_pages; @@ -56,27 +58,27 @@ typedef GisPage *(*PreparePage) (GisDriver *driver); typedef struct { const gchar *page_id; PreparePage prepare_page_func; - gboolean new_user_only; + GisDriverMode modes; } PageData; -#define PAGE(name, new_user_only) { #name, gis_prepare_ ## name ## _page, new_user_only } +#define PAGE(name, modes) { #name, gis_prepare_ ## name ## _page, modes } static PageData page_table[] = { - PAGE (welcome, FALSE), - PAGE (language, FALSE), - PAGE (keyboard, FALSE), - PAGE (network, FALSE), - PAGE (privacy, FALSE), - PAGE (timezone, TRUE), - PAGE (software, TRUE), - PAGE (goa, FALSE), - PAGE (account, TRUE), - PAGE (password, TRUE), + PAGE (welcome, GIS_DRIVER_MODE_ALL), + PAGE (language, GIS_DRIVER_MODE_ALL), + PAGE (keyboard, GIS_DRIVER_MODE_ALL), + PAGE (network, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (privacy, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (timezone, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER), + PAGE (software, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (goa, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (account, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER), + PAGE (password, GIS_DRIVER_MODE_NEW_USER), #ifdef HAVE_PARENTAL_CONTROLS - PAGE (parental_controls, TRUE), - PAGE (parent_password, TRUE), + PAGE (parental_controls, GIS_DRIVER_MODE_NEW_USER), + PAGE (parent_password, GIS_DRIVER_MODE_NEW_USER), #endif - PAGE (summary, FALSE), + PAGE (summary, GIS_DRIVER_MODE_ALL), { NULL }, }; @@ -122,17 +124,19 @@ strv_append (gchar **a, } static gchar ** -pages_to_skip_from_file (GisDriver *driver, - gboolean is_new_user) +pages_to_skip_from_file (GisDriver *driver) { + GisDriverMode driver_mode; GStrv skip_pages = NULL; GStrv additional_skip_pages = NULL; + const char *vendor_key; /* This code will read the keyfile containing vendor customization options and * look for options under the "pages" group, and supports the following keys: * - skip (optional): list of pages to be skipped always - * - new_user_only (optional): list of pages to be skipped in existing user mode - * - existing_user_only (optional): list of pages to be skipped in new user mode + * - new_user_only (optional): list of pages to be skipped in existing user and live user modes + * - existing_user_only (optional): list of pages to be skipped in new user and live user modes + * - live_user_only (optional): list of pages to be skipped in new user and existing user modes * * This is how this file might look on a vendor image: * @@ -141,12 +145,25 @@ pages_to_skip_from_file (GisDriver *driver, * existing_user_only=language;keyboard */ + driver_mode = gis_driver_get_mode (driver); + switch (driver_mode) { + case GIS_DRIVER_MODE_NEW_USER: + vendor_key = VENDOR_NEW_USER_ONLY_KEY; + break; + case GIS_DRIVER_MODE_LIVE_USER: + vendor_key = VENDOR_LIVE_USER_ONLY_KEY; + break; + case GIS_DRIVER_MODE_EXISTING_USER: + vendor_key = VENDOR_EXISTING_USER_ONLY_KEY; + break; + default: + g_assert_not_reached (); + } + skip_pages = gis_driver_conf_get_string_list (driver, VENDOR_PAGES_GROUP, VENDOR_SKIP_KEY, NULL); additional_skip_pages = - gis_driver_conf_get_string_list (driver, VENDOR_PAGES_GROUP, - is_new_user ? VENDOR_EXISTING_USER_ONLY_KEY : VENDOR_NEW_USER_ONLY_KEY, - NULL); + gis_driver_conf_get_string_list (driver, VENDOR_PAGES_GROUP, vendor_key, NULL); if (!skip_pages && additional_skip_pages) { skip_pages = additional_skip_pages; @@ -198,7 +215,8 @@ rebuild_pages_cb (GisDriver *driver) GisAssistant *assistant; GisPage *current_page; gchar **skip_pages; - gboolean is_new_user, skipped; + GisDriverMode driver_mode; + gboolean skipped; assistant = gis_driver_get_assistant (driver); current_page = gis_assistant_get_current_page (assistant); @@ -217,13 +235,13 @@ rebuild_pages_cb (GisDriver *driver) ++page_data; } - is_new_user = (gis_driver_get_mode (driver) == GIS_DRIVER_MODE_NEW_USER); - skip_pages = pages_to_skip_from_file (driver, is_new_user); + driver_mode = gis_driver_get_mode (driver); + skip_pages = pages_to_skip_from_file (driver); for (; page_data->page_id != NULL; ++page_data) { skipped = FALSE; - if ((page_data->new_user_only && !is_new_user) || + if (((page_data->modes & driver_mode) == 0) || (should_skip_page (page_data->page_id, skip_pages))) skipped = TRUE; @@ -247,6 +265,8 @@ get_mode (void) { if (force_existing_user_mode) return GIS_DRIVER_MODE_EXISTING_USER; + else if (force_live_user_mode) + return GIS_DRIVER_MODE_LIVE_USER; else return GIS_DRIVER_MODE_NEW_USER; } @@ -269,6 +289,19 @@ initial_setup_disabled_by_anaconda (void) return g_key_file_get_boolean (key_file, "General", "post_install_tools_disabled", NULL); } +static gboolean +live_user_forced_by_kernel_command_line (void) +{ + g_autoptr(GError) error = NULL; + g_autofree char *contents = NULL; + + if (!g_file_get_contents ("/proc/cmdline", &contents, NULL, &error)) { + return FALSE; + } + + return strstr (contents, "rd.live.image") != NULL; +} + int main (int argc, char *argv[]) { @@ -280,6 +313,8 @@ main (int argc, char *argv[]) GOptionEntry entries[] = { { "existing-user", 0, 0, G_OPTION_ARG_NONE, &force_existing_user_mode, _("Force existing user mode"), NULL }, + { "live-user", 0, 0, G_OPTION_ARG_NONE, &force_live_user_mode, + _("Force live user mode"), NULL }, { NULL } }; @@ -298,6 +333,9 @@ main (int argc, char *argv[]) g_option_context_parse (context, &argc, &argv, NULL); + if (live_user_forced_by_kernel_command_line ()) + force_live_user_mode = TRUE; + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); diff --git a/gnome-initial-setup/pages/account/gis-account-pages.c b/gnome-initial-setup/pages/account/gis-account-pages.c index d9cc8d9..37ee37e 100644 --- a/gnome-initial-setup/pages/account/gis-account-pages.c +++ b/gnome-initial-setup/pages/account/gis-account-pages.c @@ -26,6 +26,27 @@ GisPage * gis_prepare_account_page (GisDriver *driver) { + GisDriverMode driver_mode; + + driver_mode = gis_driver_get_mode (driver); + + if (driver_mode == GIS_DRIVER_MODE_LIVE_USER) { + ActUserManager *act_client = act_user_manager_get_default (); + const char *username = "liveuser"; + g_autoptr(ActUser) user = NULL; + g_autoptr(GError) error = NULL; + + user = act_user_manager_create_user (act_client, username, username, ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR, &error); + + if (user != NULL) { + act_user_set_password_mode (user, ACT_USER_PASSWORD_MODE_NONE); + gis_driver_set_username (driver, username); + gis_driver_set_account_mode (driver, UM_LOCAL); + gis_driver_set_user_permissions (driver, user, NULL); + } + return NULL; + } + return g_object_new (GIS_TYPE_ACCOUNT_PAGE, "driver", driver, NULL); diff --git a/gnome-initial-setup/pages/summary/gis-summary-page.c b/gnome-initial-setup/pages/summary/gis-summary-page.c index 0a8dcfd..d0f4a81 100644 --- a/gnome-initial-setup/pages/summary/gis-summary-page.c +++ b/gnome-initial-setup/pages/summary/gis-summary-page.c @@ -185,6 +185,7 @@ done_cb (GtkButton *button, GisSummaryPage *page) switch (gis_driver_get_mode (GIS_PAGE (page)->driver)) { case GIS_DRIVER_MODE_NEW_USER: + case GIS_DRIVER_MODE_LIVE_USER: gis_driver_hide_window (GIS_PAGE (page)->driver); log_user_in (page); break; |