summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2023-04-04 16:21:59 -0400
committerRay Strode <rstrode@redhat.com>2023-04-04 16:27:27 -0400
commit4c2e8969ebe2d3a5238b08b08eea4749cf5b7663 (patch)
tree4ca7c06639a98842d8a6c01dcb80c6337fd197fa
parent00b9a89bdfcf69d5502aa12884589a7efe1a2946 (diff)
downloadgnome-initial-setup-wip/live-user-mode.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.c6
-rw-r--r--gnome-initial-setup/gis-driver.h6
-rw-r--r--gnome-initial-setup/gnome-initial-setup.c90
-rw-r--r--gnome-initial-setup/pages/account/gis-account-pages.c21
-rw-r--r--gnome-initial-setup/pages/summary/gis-summary-page.c1
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;