From 4f2aa7291f77b75efd7ec3a1a36371dc1a2bd7e9 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Sun, 13 Aug 2023 10:30:11 -0400 Subject: [PATCH 6/7] gnome-initial-setup: Add OEM mode OEM mode is designed to get run when a site has imaged a bunch of machines, and handed them off to the user. In this scenario, the user never saw the installer, so we need to ask the user questions that the installer would have normally asked them already. For example, the installer likely asks language, but if the user never saw the installer, then we need to ask language again. --- gnome-initial-setup/gis-driver.c | 1 + gnome-initial-setup/gis-driver.h | 5 +++-- gnome-initial-setup/gnome-initial-setup.c | 22 ++++++++++++++-------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c index 41cd6e38..55b2493c 100644 --- a/gnome-initial-setup/gis-driver.c +++ b/gnome-initial-setup/gis-driver.c @@ -20,60 +20,61 @@ */ #include "config.h" #include "gnome-initial-setup.h" #include #include #include #ifdef HAVE_WEBKITGTK_6_0 #include #else #include #endif #include "cc-common-language.h" #include "gis-assistant.h" /* Statically include this for now. Maybe later * we'll generate this from glib-mkenums. */ GType gis_driver_mode_get_type (void) { static GType enum_type_id = 0; if (G_UNLIKELY (!enum_type_id)) { 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_OEM, "GIS_DRIVER_MODE_OEM", "oem" }, { GIS_DRIVER_MODE_SYSTEM, "GIS_DRIVER_MODE_SYSTEM", "system" }, { GIS_DRIVER_MODE_ALL, "GIS_DRIVER_MODE_ALL", "all" }, { 0, NULL, NULL } }; enum_type_id = g_flags_register_static("GisDriverMode", values); } return enum_type_id; } enum { REBUILD_PAGES, LOCALE_CHANGED, LAST_SIGNAL, }; static guint signals[LAST_SIGNAL]; typedef enum { PROP_MODE = 1, PROP_USERNAME, PROP_SMALL_SCREEN, PROP_PARENTAL_CONTROLS_ENABLED, PROP_FULL_NAME, PROP_AVATAR, } GisDriverProperty; static GParamSpec *obj_props[PROP_AVATAR + 1]; struct _GisDriver { AdwApplication parent_instance; diff --git a/gnome-initial-setup/gis-driver.h b/gnome-initial-setup/gis-driver.h index aedb9a73..49639bef 100644 --- a/gnome-initial-setup/gis-driver.h +++ b/gnome-initial-setup/gis-driver.h @@ -18,62 +18,63 @@ * Written by: * Jasper St. Pierre */ #ifndef __GIS_DRIVER_H__ #define __GIS_DRIVER_H__ #include "gis-assistant.h" #include "gis-page.h" #include #include #include G_BEGIN_DECLS #define GIS_TYPE_DRIVER (gis_driver_get_type ()) #define GIS_TYPE_DRIVER_MODE (gis_driver_mode_get_type ()) G_DECLARE_FINAL_TYPE (GisDriver, gis_driver, GIS, DRIVER, AdwApplication) typedef enum { UM_LOCAL, UM_ENTERPRISE, NUM_MODES, } UmAccountMode; typedef enum { GIS_DRIVER_MODE_NEW_USER = 1 << 0, GIS_DRIVER_MODE_EXISTING_USER = 1 << 1, GIS_DRIVER_MODE_LIVE_USER = 1 << 2, - GIS_DRIVER_MODE_SYSTEM = (GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER), - GIS_DRIVER_MODE_ALL = (GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_LIVE_USER), + GIS_DRIVER_MODE_OEM = 1 << 3, + GIS_DRIVER_MODE_SYSTEM = (GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER | GIS_DRIVER_MODE_OEM), + GIS_DRIVER_MODE_ALL = (GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_LIVE_USER | GIS_DRIVER_MODE_OEM), } GisDriverMode; GType gis_driver_mode_get_type (void); GisAssistant *gis_driver_get_assistant (GisDriver *driver); void gis_driver_set_user_permissions (GisDriver *driver, ActUser *user, const gchar *password); void gis_driver_get_user_permissions (GisDriver *driver, ActUser **user, const gchar **password); void gis_driver_set_parent_permissions (GisDriver *driver, ActUser *parent, const gchar *password); void gis_driver_get_parent_permissions (GisDriver *driver, ActUser **parent, const gchar **password); void gis_driver_set_account_mode (GisDriver *driver, UmAccountMode mode); UmAccountMode gis_driver_get_account_mode (GisDriver *driver); void gis_driver_set_parental_controls_enabled (GisDriver *driver, gboolean parental_controls_enabled); diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c index 78c62cd8..d9e9ca6e 100644 --- a/gnome-initial-setup/gnome-initial-setup.c +++ b/gnome-initial-setup/gnome-initial-setup.c @@ -26,90 +26,91 @@ #include #include #include #include #include #include "pages/welcome/gis-welcome-page.h" #include "pages/language/gis-language-page.h" #include "pages/keyboard/gis-keyboard-page.h" #include "pages/network/gis-network-page.h" #include "pages/timezone/gis-timezone-page.h" #include "pages/privacy/gis-privacy-page.h" #include "pages/software/gis-software-page.h" #include "pages/goa/gis-goa-page.h" #include "pages/account/gis-account-pages.h" #include "pages/parental-controls/gis-parental-controls-page.h" #include "pages/password/gis-password-page.h" #include "pages/summary/gis-summary-page.h" #include "pages/install/gis-install-page.h" #define VENDOR_PAGES_GROUP "pages" #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" #define STATE_FILE GIS_WORKING_DIR "/state" static gboolean force_existing_user_mode; static gboolean force_live_user_mode; +static gboolean force_oem_mode; static GPtrArray *skipped_pages; typedef GisPage *(*PreparePage) (GisDriver *driver); typedef struct { const gchar *page_id; PreparePage prepare_page_func; GisDriverMode modes; } PageData; #define PAGE(name, modes) { #name, gis_prepare_ ## name ## _page, modes } static PageData page_table[] = { PAGE (welcome, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), PAGE (language, GIS_DRIVER_MODE_ALL), PAGE (keyboard, GIS_DRIVER_MODE_ALL), PAGE (network, GIS_DRIVER_MODE_ALL), - PAGE (privacy, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (privacy, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_OEM), PAGE (timezone, GIS_DRIVER_MODE_ALL), - 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 (software, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_OEM), + PAGE (goa, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_OEM), /* In live user mode, the account page isn't displayed, it just quietly creates the live user */ - PAGE (account, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER), - PAGE (password, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER), + PAGE (account, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER | GIS_DRIVER_MODE_OEM), + PAGE (password, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_LIVE_USER | GIS_DRIVER_MODE_OEM), #ifdef HAVE_PARENTAL_CONTROLS - PAGE (parental_controls, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), - PAGE (parent_password, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER), + PAGE (parental_controls, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_OEM), + PAGE (parent_password, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_EXISTING_USER | GIS_DRIVER_MODE_OEM), #endif - PAGE (summary, GIS_DRIVER_MODE_NEW_USER), + PAGE (summary, GIS_DRIVER_MODE_NEW_USER | GIS_DRIVER_MODE_OEM), PAGE (install, GIS_DRIVER_MODE_LIVE_USER), { NULL }, }; #undef PAGE static gboolean should_skip_page (const gchar *page_id, gchar **skip_pages) { guint i = 0; /* special case welcome. We only want to show it if language * is skipped */ if (strcmp (page_id, "welcome") == 0) return !should_skip_page ("language", skip_pages); /* check through our skip pages list for pages we don't want */ if (skip_pages) { while (skip_pages[i]) { if (g_strcmp0 (skip_pages[i], page_id) == 0) return TRUE; i++; } } return FALSE; } @@ -315,81 +316,86 @@ static gboolean initial_setup_disabled_by_anaconda (void) { const gchar *file_name = SYSCONFDIR "/sysconfig/anaconda"; g_autoptr(GError) error = NULL; g_autoptr(GKeyFile) key_file = g_key_file_new (); if (!g_key_file_load_from_file (key_file, file_name, G_KEY_FILE_NONE, &error)) { if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT) && !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) { g_warning ("Could not read %s: %s", file_name, error->message); } return FALSE; } return g_key_file_get_boolean (key_file, "General", "post_install_tools_disabled", NULL); } int main (int argc, char *argv[]) { GisDriver *driver; int status; GOptionContext *context; GisDriverMode mode; 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 }, + { "oem", 0, 0, G_OPTION_ARG_NONE, &force_oem_mode, + _("Force OEM mode"), NULL }, { NULL } }; g_unsetenv ("GIO_USE_VFS"); /* By default, libadwaita reads settings from the Settings portal, which causes * the portal to be started, which causes gnome-keyring to be started. This * interferes with our attempt below to manually start gnome-keyring and set * the login keyring password to a well-known value, which we overwrite with * the user's password once they choose one. */ g_setenv ("ADW_DISABLE_PORTAL", "1", TRUE); context = g_option_context_new (_("— GNOME initial setup")); g_option_context_add_main_entries (context, entries, NULL); g_option_context_parse (context, &argc, &argv, NULL); if (gis_kernel_command_line_has_argument ((const char *[]) { "rd.live.image", "endless.live_boot", NULL })) force_live_user_mode = TRUE; + if (gis_kernel_command_line_has_argument ((const char *[]) { "gnome.oem_mode", NULL })) + force_oem_mode = TRUE; + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); g_message ("Starting gnome-initial-setup"); if (gis_get_mock_mode ()) g_message ("Mock mode: changes will not be saved to disk"); else g_message ("Production mode: changes will be saved to disk"); skipped_pages = g_ptr_array_new_with_free_func (destroy_page); mode = get_mode (); /* When we are running as the gnome-initial-setup user we * dont have a normal user session and need to initialize * the keyring manually so that we can pass the credentials * along to the new user in the handoff. */ if ((mode & GIS_DRIVER_MODE_SYSTEM) && !gis_get_mock_mode ()) gis_ensure_login_keyring (); driver = gis_driver_new (mode); adw_style_manager_set_color_scheme (adw_style_manager_get_default (), ADW_COLOR_SCHEME_PREFER_LIGHT); /* On first login, GNOME Shell offers to run a tour. If we also run Initial * Setup, the two immovable, centred windows will sit atop one another. * Until we have the ability to run Initial Setup in the "kiosk" mode, like * it does in new-user mode, disable Initial Setup for existing users. * -- 2.41.0.rc2