Blob Blame History Raw
From 5f92f96fbe96751087db19de94b0619a0f2e2419 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Mon, 18 May 2015 08:40:12 -0400
Subject: [PATCH 1/5] Create keyring initially unencrypted

This avoids a possible problem when we run gnome-initial-setup
in the user session for a passwordless user - gnome-keyring will
not create a keyring in this situation, and we will not ask
the user to change his password, so we end up creating a keyring
with the password "gis", which the user can't unlock.
---
 gnome-initial-setup/gis-keyring.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gnome-initial-setup/gis-keyring.c b/gnome-initial-setup/gis-keyring.c
index 42e1a64..6459591 100644
--- a/gnome-initial-setup/gis-keyring.c
+++ b/gnome-initial-setup/gis-keyring.c
@@ -2,61 +2,61 @@
 /*
  * Copyright (C) 2014 Red Hat
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  *
  * Written by:
  *     Matthias Clasen <mclasen@redhat.com>
  */
 
 #include "config.h"
 
 #include <string.h>
 
 #include <gio/gio.h>
 
 #include "gis-keyring.h"
 
 #include <libsecret/secret.h>
 
-#define DUMMY_PWD "gis"
+#define DUMMY_PWD ""
 
 /* We never want to see a keyring dialog, but we need to make
  * sure a keyring is present.
  *
  * To achieve this, install a prompter for gnome-keyring that
  * never shows any UI, and create a keyring, if one does not
  * exist yet.
  */
 
 void
 gis_ensure_login_keyring ()
 {
 	GSubprocess *subprocess = NULL;
 	GSubprocessLauncher *launcher = NULL;
 	GError *error = NULL;
 
 	g_debug ("launching gnome-keyring-daemon --login");
 	launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_SILENCE);
 	subprocess = g_subprocess_launcher_spawn (launcher, &error, "gnome-keyring-daemon", "--unlock", NULL);
 	if (subprocess == NULL) {
 		g_warning ("Failed to spawn gnome-keyring-daemon --unlock: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
 
 	if (!g_subprocess_communicate_utf8 (subprocess, DUMMY_PWD, NULL, NULL, NULL, &error)) {
 		g_warning ("Failed to communicate with gnome-keyring-daemon: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
-- 
2.3.7


From f34f0b70ddb9bff2c439e730e69992e7209aa456 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 28 Jul 2015 14:20:38 -0400
Subject: [PATCH 2/5] keyring: don't change keyring password explicitly

It will happen automatically by the pam stack
---
 gnome-initial-setup/gis-keyring.c                  | 57 ----------------------
 gnome-initial-setup/gis-keyring.h                  |  1 -
 .../pages/password/gis-password-page.c             |  2 -
 3 files changed, 60 deletions(-)

diff --git a/gnome-initial-setup/gis-keyring.c b/gnome-initial-setup/gis-keyring.c
index 6459591..cbef4f2 100644
--- a/gnome-initial-setup/gis-keyring.c
+++ b/gnome-initial-setup/gis-keyring.c
@@ -40,87 +40,30 @@
  */
 
 void
 gis_ensure_login_keyring ()
 {
 	GSubprocess *subprocess = NULL;
 	GSubprocessLauncher *launcher = NULL;
 	GError *error = NULL;
 
 	g_debug ("launching gnome-keyring-daemon --login");
 	launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_SILENCE);
 	subprocess = g_subprocess_launcher_spawn (launcher, &error, "gnome-keyring-daemon", "--unlock", NULL);
 	if (subprocess == NULL) {
 		g_warning ("Failed to spawn gnome-keyring-daemon --unlock: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
 
 	if (!g_subprocess_communicate_utf8 (subprocess, DUMMY_PWD, NULL, NULL, NULL, &error)) {
 		g_warning ("Failed to communicate with gnome-keyring-daemon: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
 
 out:
 	if (subprocess)
 		g_object_unref (subprocess);
 	if (launcher)
 		g_object_unref (launcher);
 }
-
-void
-gis_update_login_keyring_password (const gchar *new_)
-{
-	GDBusConnection *bus = NULL;
-	SecretService *service = NULL;
-	SecretValue *old_secret = NULL;
-	SecretValue *new_secret = NULL;
-	GError *error = NULL;
-	
-	service = secret_service_get_sync (SECRET_SERVICE_OPEN_SESSION, NULL, &error);
-	if (service == NULL) {
-		g_warning ("Failed to get secret service: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-
-	bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
-	if (bus == NULL) {
-		g_warning ("Failed to get session bus: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-
-	old_secret = secret_value_new (DUMMY_PWD, strlen (DUMMY_PWD), "text/plain");
-	new_secret = secret_value_new (new_, strlen (new_), "text/plain");
-
-	g_dbus_connection_call_sync (bus,
-                                     "org.gnome.keyring",
-                                     "/org/freedesktop/secrets",
-                                     "org.gnome.keyring.InternalUnsupportedGuiltRiddenInterface",
-                                     "ChangeWithMasterPassword",
-                                     g_variant_new ("(o@(oayays)@(oayays))",
-                                                    "/org/freedesktop/secrets/collection/login",
-                                                    secret_service_encode_dbus_secret (service, old_secret),
-                                                    secret_service_encode_dbus_secret (service, new_secret)),
-                                     NULL,
-                                     0,
-                                     G_MAXINT,
-                                     NULL, &error);
-
-        if (error != NULL) {
-          g_warning ("Failed to change keyring password: %s", error->message);
-          g_error_free (error);
-        }
-
-out:
-
-	if (service)
-		g_object_unref (service);
-	if (bus)
-		g_object_unref (bus);
-	if (old_secret)
-		secret_value_unref (old_secret);
-	if (new_secret)
-		secret_value_unref (new_secret);
-}
diff --git a/gnome-initial-setup/gis-keyring.h b/gnome-initial-setup/gis-keyring.h
index 764f1e6..496b153 100644
--- a/gnome-initial-setup/gis-keyring.h
+++ b/gnome-initial-setup/gis-keyring.h
@@ -1,35 +1,34 @@
 
 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 /*
  * Copyright (C) 2014 Red Hat
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  *
  * Written by:
  *     Matthias Clasen <mclasen@redhat.com>
  */
 
 #ifndef __GIS_KEYRING_H__
 #define __GIS_KEYRING_H__
 
 #include <glib-object.h>
 
 G_BEGIN_DECLS
 
 void	gis_ensure_login_keyring	  ();
-void	gis_update_login_keyring_password (const gchar *new_);
 
 G_END_DECLS
 
 #endif /* __GIS_KEYRING_H__ */
diff --git a/gnome-initial-setup/pages/password/gis-password-page.c b/gnome-initial-setup/pages/password/gis-password-page.c
index 6d55c39..3ce3752 100644
--- a/gnome-initial-setup/pages/password/gis-password-page.c
+++ b/gnome-initial-setup/pages/password/gis-password-page.c
@@ -65,62 +65,60 @@ page_validate (GisPasswordPage *page)
 static void
 update_page_validation (GisPasswordPage *page)
 {
   gis_page_set_complete (GIS_PAGE (page), page_validate (page));
 }
 
 static void
 gis_password_page_save_data (GisPage *gis_page)
 {
   GisPasswordPage *page = GIS_PASSWORD_PAGE (gis_page);
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
   ActUser *act_user;
   const gchar *password;
 
   if (gis_page->driver == NULL)
     return;
 
   gis_driver_get_user_permissions (gis_page->driver, &act_user, &password);
 
   if (act_user == NULL) /* enterprise account */
     return;
 
   password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
 
   if (strlen (password) == 0)
     act_user_set_password_mode (act_user, ACT_USER_PASSWORD_MODE_NONE);
   else
     act_user_set_password (act_user, password, "");
 
   gis_driver_set_user_permissions (gis_page->driver, act_user, password);
-
-  gis_update_login_keyring_password (password);
 }
 
 static void
 gis_password_page_shown (GisPage *gis_page)
 {
   GisPasswordPage *page = GIS_PASSWORD_PAGE (gis_page);
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
 
   gtk_widget_grab_focus (priv->password_entry);
 }
 
 static gboolean
 validate (GisPasswordPage *page)
 {
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
   const gchar *password;
   const gchar *verify;
   gint strength_level;
   const gchar *hint;
   const gchar *long_hint;
 
   if (priv->timeout_id != 0) {
     g_source_remove (priv->timeout_id);
     priv->timeout_id = 0;
   }
 
   password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
   verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
 
   pw_strength (password, NULL, priv->username, &hint, &long_hint, &strength_level);
-- 
2.3.7


From 82a1a59dfa1c831942491ac8c4e11703c5bfa863 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 27 Jul 2015 15:38:56 -0400
Subject: [PATCH 3/5] password: detect enterprise account by NULL username when
 saving

Right now we detect an enterprise account by the lack of an
ActUser object.  That can't work going forward though, since other
bits of the code need an ActUser object for enterprise accounts.

This commit changes the heuristic to look for a NULL username.
---
 gnome-initial-setup/pages/password/gis-password-page.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/gnome-initial-setup/pages/password/gis-password-page.c b/gnome-initial-setup/pages/password/gis-password-page.c
index 3ce3752..a860dc5 100644
--- a/gnome-initial-setup/pages/password/gis-password-page.c
+++ b/gnome-initial-setup/pages/password/gis-password-page.c
@@ -47,70 +47,73 @@ struct _GisPasswordPagePrivate
   GtkWidget *confirm_explanation;
   gboolean valid_confirm;
   gboolean valid_password;
   guint timeout_id;
   const gchar *username;
 };
 typedef struct _GisPasswordPagePrivate GisPasswordPagePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GisPasswordPage, gis_password_page, GIS_TYPE_PAGE);
 
 static gboolean
 page_validate (GisPasswordPage *page)
 {
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
 
   return priv->valid_confirm;
 }
 
 static void
 update_page_validation (GisPasswordPage *page)
 {
   gis_page_set_complete (GIS_PAGE (page), page_validate (page));
 }
 
 static void
 gis_password_page_save_data (GisPage *gis_page)
 {
   GisPasswordPage *page = GIS_PASSWORD_PAGE (gis_page);
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
   ActUser *act_user;
+  const gchar *username;
   const gchar *password;
 
   if (gis_page->driver == NULL)
     return;
 
-  gis_driver_get_user_permissions (gis_page->driver, &act_user, &password);
+  username = gis_driver_get_username (gis_page->driver);
 
-  if (act_user == NULL) /* enterprise account */
+  if (username == NULL) /* enterprise account */
     return;
 
+  gis_driver_get_user_permissions (gis_page->driver, &act_user, &password);
+
   password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
 
   if (strlen (password) == 0)
     act_user_set_password_mode (act_user, ACT_USER_PASSWORD_MODE_NONE);
   else
     act_user_set_password (act_user, password, "");
 
   gis_driver_set_user_permissions (gis_page->driver, act_user, password);
 }
 
 static void
 gis_password_page_shown (GisPage *gis_page)
 {
   GisPasswordPage *page = GIS_PASSWORD_PAGE (gis_page);
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
 
   gtk_widget_grab_focus (priv->password_entry);
 }
 
 static gboolean
 validate (GisPasswordPage *page)
 {
   GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
   const gchar *password;
   const gchar *verify;
   gint strength_level;
   const gchar *hint;
   const gchar *long_hint;
 
   if (priv->timeout_id != 0) {
-- 
2.3.7


From 53de9c3565bbb3c007894c00008a32fa97a88ca1 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 27 Jul 2015 14:47:15 -0400
Subject: [PATCH 4/5] account: set act_user object on driver

The summary page expects the act-user object to be set in
the driver.  That only happens at the moment for local
users, not enterprise login users.

This commit fixes things, so it happens for enterprise login
users as well.
---
 .../pages/account/gis-account-page-enterprise.c         |  5 +++++
 gnome-initial-setup/pages/account/gis-account-page.c    | 17 +++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/gnome-initial-setup/pages/account/gis-account-page-enterprise.c b/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
index f33688c..4c9feb3 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
+++ b/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
@@ -52,60 +52,61 @@ struct _GisAccountPageEnterprisePrivate
   GtkWidget *domain_entry;
   GtkTreeModel *realms_model;
 
   GtkWidget *join_dialog;
   GtkWidget *join_name;
   GtkWidget *join_password;
   GtkWidget *join_domain;
   GtkWidget *join_computer;
 
   ActUserManager *act_client;
   ActUser *act_user;
 
   guint realmd_watch;
   UmRealmManager *realm_manager;
   gboolean domain_chosen;
 
   /* Valid during apply */
   UmRealmObject *realm;
   GCancellable *cancellable;
   gboolean join_prompted;
 
   GisPageApplyCallback apply_complete_callback;
   gpointer apply_complete_data;
 };
 typedef struct _GisAccountPageEnterprisePrivate GisAccountPageEnterprisePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GisAccountPageEnterprise, gis_account_page_enterprise, GTK_TYPE_BIN);
 
 enum {
   VALIDATION_CHANGED,
+  USER_CACHED,
   LAST_SIGNAL,
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
 static void
 validation_changed (GisAccountPageEnterprise *page)
 {
   g_signal_emit (page, signals[VALIDATION_CHANGED], 0);
 }
 
 static void
 apply_complete (GisAccountPageEnterprise *page,
                 gboolean                  valid)
 {
   GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
   priv->apply_complete_callback (NULL, valid, priv->apply_complete_data);
 }
 
 static void
 show_error_dialog (GisAccountPageEnterprise *page,
                    const gchar *message,
                    GError *error)
 {
   GtkWidget *dialog;
 
   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
     return;
 
   dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (page))),
@@ -146,60 +147,61 @@ gis_account_page_enterprise_validate (GisAccountPageEnterprise *page)
   valid_domain = is_valid_name (name);
   return valid_name && valid_domain;
 }
 
 static void
 on_permit_user_login (GObject *source,
                       GAsyncResult *result,
                       gpointer user_data)
 {
   GisAccountPageEnterprise *page = user_data;
   GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
   UmRealmCommon *common;
   GError *error = NULL;
   gchar *login;
 
   common = UM_REALM_COMMON (source);
   um_realm_common_call_change_login_policy_finish (common, result, &error);
   if (error == NULL) {
 
     /*
      * Now tell the account service about this user. The account service
      * should also lookup information about this via the realm and make
      * sure all that is functional.
      */
     login = um_realm_calculate_login (common, gtk_entry_get_text (GTK_ENTRY (priv->login)));
     g_return_if_fail (login != NULL);
 
     g_debug ("Caching remote user: %s", login);
 
     priv->act_user = act_user_manager_cache_user (priv->act_client, login, NULL);
+    g_signal_emit (page, signals[USER_CACHED], 0, priv->act_user, gtk_entry_get_text (GTK_ENTRY (priv->password)));
     apply_complete (page, TRUE);
 
     g_free (login);
   } else {
     show_error_dialog (page, _("Failed to register account"), error);
     g_message ("Couldn't permit logins on account: %s", error->message);
     g_error_free (error);
     apply_complete (page, FALSE);
   }
 }
 
 static void
 enterprise_permit_user_login (GisAccountPageEnterprise *page, UmRealmObject *realm)
 {
   GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
   UmRealmCommon *common;
   gchar *login;
   const gchar *add[2];
   const gchar *remove[1];
   GVariant *options;
 
   common = um_realm_object_get_common (realm);
 
   login = um_realm_calculate_login (common, gtk_entry_get_text (GTK_ENTRY (priv->login)));
   g_return_if_fail (login != NULL);
 
   add[0] = login;
   add[1] = NULL;
   remove[0] = NULL;
 
@@ -794,45 +796,48 @@ gis_account_page_enterprise_dispose (GObject *object)
 }
 
 static void
 gis_account_page_enterprise_class_init (GisAccountPageEnterpriseClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->constructed = gis_account_page_enterprise_constructed;
   object_class->dispose = gis_account_page_enterprise_dispose;
 
   gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/initial-setup/gis-account-page-enterprise.ui");
 
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, login);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, password);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, domain);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, domain_entry);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, realms_model);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, image);
 
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, join_dialog);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, join_name);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, join_password);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, join_domain);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, join_computer);
 
   gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (klass), gis_account_page_enterprise_hierarchy_changed);
 
   signals[VALIDATION_CHANGED] = g_signal_new ("validation-changed", GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE,
                                               G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
                                               G_TYPE_NONE, 0);
+  signals[USER_CACHED] = g_signal_new ("user-cached", GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE,
+                                       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
+                                       G_TYPE_NONE, 2, ACT_TYPE_USER, G_TYPE_STRING);
 }
 
 static void
 gis_account_page_enterprise_init (GisAccountPageEnterprise *page)
 {
   gtk_widget_init_template (GTK_WIDGET (page));
 }
 
 void
 gis_account_page_enterprise_shown (GisAccountPageEnterprise *page)
 {
   GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
 
   gtk_widget_grab_focus (priv->domain_entry);
 }
diff --git a/gnome-initial-setup/pages/account/gis-account-page.c b/gnome-initial-setup/pages/account/gis-account-page.c
index 9cf5231..60bb947 100644
--- a/gnome-initial-setup/pages/account/gis-account-page.c
+++ b/gnome-initial-setup/pages/account/gis-account-page.c
@@ -168,76 +168,93 @@ gis_account_page_shown (GisPage *gis_page)
 {
   GisAccountPage *page = GIS_ACCOUNT_PAGE (gis_page);
   GisAccountPagePrivate *priv = gis_account_page_get_instance_private (page);
 
   gis_account_page_local_shown (GIS_ACCOUNT_PAGE_LOCAL (priv->page_local));
 }
 
 static void
 on_local_user_created (GtkWidget      *page_local,
                        ActUser        *user,
                        char           *password,
                        GisAccountPage *page)
 {
   const gchar *language;
 
   language = gis_driver_get_user_language (GIS_PAGE (page)->driver);
   if (language)
     act_user_set_language (user, language);
 
   gis_driver_set_user_permissions (GIS_PAGE (page)->driver, user, password);
 }
 
 static void
 on_local_page_confirmed (GisAccountPageLocal *local,
                          GisAccountPage      *page)
 {
   gis_assistant_next_page (gis_driver_get_assistant (GIS_PAGE (page)->driver));
 }
 
 static void
+on_local_user_cached (GtkWidget      *page_local,
+                      ActUser        *user,
+                      char           *password,
+                      GisAccountPage *page)
+{
+  const gchar *language;
+
+  language = gis_driver_get_user_language (GIS_PAGE (page)->driver);
+  if (language)
+    act_user_set_language (user, language);
+
+  gis_driver_set_user_permissions (GIS_PAGE (page)->driver, user, password);
+}
+
+static void
 gis_account_page_constructed (GObject *object)
 {
   GisAccountPage *page = GIS_ACCOUNT_PAGE (object);
   GisAccountPagePrivate *priv = gis_account_page_get_instance_private (page);
 
   G_OBJECT_CLASS (gis_account_page_parent_class)->constructed (object);
 
   g_signal_connect (priv->page_local, "validation-changed",
                     G_CALLBACK (on_validation_changed), page);
   g_signal_connect (priv->page_local, "user-created",
                     G_CALLBACK (on_local_user_created), page);
   g_signal_connect (priv->page_local, "confirm",
                     G_CALLBACK (on_local_page_confirmed), page);
 
   g_signal_connect (priv->page_enterprise, "validation-changed",
                     G_CALLBACK (on_validation_changed), page);
+  g_signal_connect (priv->page_enterprise, "user-cached",
+                    G_CALLBACK (on_local_user_cached), page);
 
   update_page_validation (page);
 
   g_signal_connect (priv->page_toggle, "toggled", G_CALLBACK (toggle_mode), page);
   g_object_bind_property (page, "applying", priv->page_toggle, "sensitive", G_BINDING_INVERT_BOOLEAN);
   g_object_bind_property (priv->page_enterprise, "visible", priv->page_toggle, "visible", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
 
   /* force a refresh by setting to an invalid value */
   priv->mode = NUM_MODES;
   set_mode (page, UM_LOCAL);
 
   gtk_widget_show (GTK_WIDGET (page));
 }
 
 static void
 gis_account_page_locale_changed (GisPage *page)
 {
   gis_page_set_title (GIS_PAGE (page), _("About You"));
 }
 
 static void
 gis_account_page_class_init (GisAccountPageClass *klass)
 {
   GisPageClass *page_class = GIS_PAGE_CLASS (klass);
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/initial-setup/gis-account-page.ui");
 
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPage, page_local);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPage, page_enterprise);
-- 
2.3.7


From 7a221199fe4dc5a8e5b2b451d809df2c10b7030c Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 27 Jul 2015 16:31:58 -0400
Subject: [PATCH 5/5] driver: duplicate password

Otherwise it will get freed at an inopportune moment.
---
 gnome-initial-setup/gis-driver.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index cbc4410..bfa35ce 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -42,79 +42,80 @@ gis_driver_mode_get_type (void) {
         { GIS_DRIVER_MODE_EXISTING_USER, "GIS_DRIVER_MODE_EXISTING_USER", "existing_user" },
         { 0, NULL, NULL }
       };
       enum_type_id = g_enum_register_static("GisDriverMode", values);
     }
   return enum_type_id;
 }
 
 enum {
   REBUILD_PAGES,
   LOCALE_CHANGED,
   LAST_SIGNAL,
 };
 
 static guint signals[LAST_SIGNAL];
 
 enum {
   PROP_0,
   PROP_MODE,
   PROP_USERNAME,
   PROP_LAST,
 };
 
 static GParamSpec *obj_props[PROP_LAST];
 
 struct _GisDriverPrivate {
   GtkWindow *main_window;
   GisAssistant *assistant;
 
   ActUser *user_account;
-  const gchar *user_password;
+  gchar *user_password;
 
   gchar *lang_id;
   gchar *username;
 
   GisDriverMode mode;
 };
 typedef struct _GisDriverPrivate GisDriverPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE(GisDriver, gis_driver, GTK_TYPE_APPLICATION)
 
 static void
 gis_driver_finalize (GObject *object)
 {
   GisDriver *driver = GIS_DRIVER (object);
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
 
   g_free (priv->lang_id);
   g_free (priv->username);
+  g_free (priv->user_password);
 
   G_OBJECT_CLASS (gis_driver_parent_class)->finalize (object);
 }
 
 static void
 prepare_main_window (GisDriver *driver)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   GdkGeometry size_hints;
 
   if (gis_driver_is_small_screen (driver))
     {
       GtkWidget *child, *sw;
 
       child = g_object_ref (gtk_bin_get_child (GTK_BIN (priv->main_window)));
       gtk_container_remove (GTK_CONTAINER (priv->main_window), child);
       sw = gtk_scrolled_window_new (NULL, NULL);
       gtk_widget_show (sw);
       gtk_container_add (GTK_CONTAINER (priv->main_window), sw);
       gtk_container_add (GTK_CONTAINER (sw), child);
       g_object_unref (child);
 
       gtk_window_maximize (priv->main_window);
     }
   else
     {
       size_hints.min_width = 1024;
       size_hints.min_height = 768;
       size_hints.win_gravity = GDK_GRAVITY_CENTER;
 
@@ -153,61 +154,61 @@ gis_driver_set_user_language (GisDriver *driver, const gchar *lang_id)
 
 const gchar *
 gis_driver_get_user_language (GisDriver *driver)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   return priv->lang_id;
 }
 
 void
 gis_driver_set_username (GisDriver *driver, const gchar *username)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   g_free (priv->username);
   priv->username = g_strdup (username);
   g_object_notify (G_OBJECT (driver), "username");
 }
 
 const gchar *
 gis_driver_get_username (GisDriver *driver)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   return priv->username;
 }
 void
 gis_driver_set_user_permissions (GisDriver   *driver,
                                  ActUser     *user,
                                  const gchar *password)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   priv->user_account = user;
-  priv->user_password = password;
+  priv->user_password = g_strdup (password);
 }
 
 void
 gis_driver_get_user_permissions (GisDriver    *driver,
                                  ActUser     **user,
                                  const gchar **password)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   *user = priv->user_account;
   *password = priv->user_password;
 }
 
 void
 gis_driver_add_page (GisDriver *driver,
                      GisPage   *page)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
   gis_assistant_add_page (priv->assistant, page);
 }
 
 void
 gis_driver_hide_window (GisDriver *driver)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
 
   gtk_widget_hide (GTK_WIDGET (priv->main_window));
 }
 
 static void
 gis_driver_real_locale_changed (GisDriver *driver)
-- 
2.3.7