[gnome-initial-setup] account: Ask domain admin for unique hostname if realmd says its bad
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-initial-setup] account: Ask domain admin for unique hostname if realmd says its bad
- Date: Mon, 27 May 2013 16:30:03 +0000 (UTC)
commit 7e33d3a164667089aef9604a5bfa28489ffde17c
Author: Stef Walter <stefw redhat com>
Date: Sun May 26 15:45:20 2013 +0200
account: Ask domain admin for unique hostname if realmd says its bad
When realmd tells us the hostname is not accessible put up the admin
prompt dialog, and ask for a new host name. This really does fit
conceptually in the domain admin prompt, since domain admin can guarantee
a unique name for the machine.
https://bugzilla.gnome.org/show_bug.cgi?id=700857
.../pages/account/gis-account-page.c | 136 ++++++++++++++------
.../pages/account/gis-account-page.ui | 11 +-
.../pages/account/um-realm-manager.c | 5 +
.../pages/account/um-realm-manager.h | 1 +
4 files changed, 110 insertions(+), 43 deletions(-)
---
diff --git a/gnome-initial-setup/pages/account/gis-account-page.c
b/gnome-initial-setup/pages/account/gis-account-page.c
index 8d58d31..f601dd1 100644
--- a/gnome-initial-setup/pages/account/gis-account-page.c
+++ b/gnome-initial-setup/pages/account/gis-account-page.c
@@ -42,6 +42,9 @@
#include <cheese-gtk.h>
#endif
+static void join_show_prompt (GisAccountPage *page,
+ GError *error);
+
static void on_join_login (GObject *source,
GAsyncResult *result,
gpointer user_data);
@@ -80,6 +83,9 @@ struct _GisAccountPagePrivate
guint realmd_watch;
UmRealmManager *realm_manager;
gboolean domain_chosen;
+
+ /* Valid during apply */
+ UmRealmObject *realm;
GCancellable *cancellable;
gboolean join_prompted;
@@ -612,11 +618,42 @@ enterprise_permit_user_login (GisAccountPage *page, UmRealmObject *realm)
}
static void
+on_set_static_hostname (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPage *page = user_data;
+ GError *error = NULL;
+ GVariant *retval;
+ const gchar *name;
+
+ retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error);
+ if (error != NULL) {
+ join_show_prompt (page, error);
+ g_error_free (error);
+ return;
+ }
+
+ g_variant_unref (retval);
+
+ name = gtk_entry_get_text (OBJ (GtkEntry *, "join-name"));
+ g_debug ("Logging in as admin user: %s", name);
+
+ /* Prompted for some admin credentials, try to use them to log in */
+ um_realm_login (page->priv->realm, name,
+ gtk_entry_get_text (OBJ (GtkEntry *, "join-password")),
+ page->priv->cancellable, on_join_login, page);
+}
+
+static void
on_join_response (GtkDialog *dialog,
gint response,
gpointer user_data)
{
GisAccountPage *page = user_data;
+ GDBusConnection *connection;
+ GError *error = NULL;
+ gchar hostname[128];
const gchar *name;
gtk_widget_hide (GTK_WIDGET (dialog));
@@ -625,18 +662,40 @@ on_join_response (GtkDialog *dialog,
return;
}
- name = gtk_entry_get_text (OBJ (GtkEntry *, "join-name"));
- g_debug ("Logging in as admin user: %s", name);
+ name = gtk_entry_get_text (OBJ (GtkEntry *, "join-computer"));
+ if (gethostname (hostname, sizeof (hostname)) == 0 &&
+ !g_str_equal (name, hostname)) {
+ g_debug ("Setting StaticHostname to '%s'", name);
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, page->priv->cancellable, &error);
+ if (error != NULL) {
+ gis_page_apply_complete (GIS_PAGE (page), FALSE);
+ g_warning ("Could not get DBus connection: %s", error->message);
+ g_error_free (error);
+ return;
+ }
- /* Prompted for some admin credentials, try to use them to log in */
- um_realm_login (g_object_get_data (G_OBJECT (dialog), "join-realm"),
- name, gtk_entry_get_text (OBJ (GtkEntry *, "join-password")),
- NULL, on_join_login, page);
+ g_dbus_connection_call (connection, "org.freedesktop.hostname1",
+ "/org/freedesktop/hostname1", "org.freedesktop.hostname1",
+ "SetStaticHostname",
+ g_variant_new ("(sb)", name, TRUE),
+ G_VARIANT_TYPE ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT, NULL, on_set_static_hostname, page);
+
+ } else {
+ name = gtk_entry_get_text (OBJ (GtkEntry *, "join-name"));
+ g_debug ("Logging in as admin user: %s", name);
+
+ /* Prompted for some admin credentials, try to use them to log in */
+ um_realm_login (page->priv->realm, name,
+ gtk_entry_get_text (OBJ (GtkEntry *, "join-password")),
+ NULL, on_join_login, page);
+ }
}
static void
join_show_prompt (GisAccountPage *page,
- UmRealmObject *realm,
GError *error)
{
UmRealmKerberosMembership *membership;
@@ -647,25 +706,25 @@ join_show_prompt (GisAccountPage *page,
GtkEntry *join_name;
GtkEntry *join_password;
GtkLabel *join_domain;
- GtkLabel *join_computer;
+ GtkEntry *join_computer;
join_dialog = OBJ (GtkDialog *, "join-dialog");
join_domain = OBJ (GtkLabel *, "join-domain");
join_name = OBJ (GtkEntry *, "join-name");
join_password = OBJ (GtkEntry *, "join-password");
- join_computer = OBJ (GtkLabel *, "join-computer");
+ join_computer = OBJ (GtkEntry *, "join-computer");
gtk_entry_set_text (join_password, "");
gtk_widget_grab_focus (GTK_WIDGET (join_password));
- kerberos = um_realm_object_get_kerberos (realm);
- membership = um_realm_object_get_kerberos_membership (realm);
+ kerberos = um_realm_object_get_kerberos (page->priv->realm);
+ membership = um_realm_object_get_kerberos_membership (page->priv->realm);
gtk_label_set_text (join_domain,
um_realm_kerberos_get_domain_name (kerberos));
if (gethostname (hostname, sizeof (hostname)) == 0)
- gtk_label_set_text (join_computer, hostname);
+ gtk_entry_set_text (join_computer, hostname);
clear_entry_validation_error (join_name);
clear_entry_validation_error (join_password);
@@ -679,6 +738,10 @@ join_show_prompt (GisAccountPage *page,
gtk_widget_grab_focus (GTK_WIDGET (join_name));
}
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME)) {
+ g_debug ("Bad host name: %s", error->message);
+ set_entry_validation_error (join_computer, error->message);
+
} else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD)) {
g_debug ("Bad admin password: %s", error->message);
set_entry_validation_error (join_password, error->message);
@@ -690,8 +753,6 @@ join_show_prompt (GisAccountPage *page,
}
g_debug ("Showing admin password dialog");
- g_object_set_data_full (G_OBJECT (join_dialog), "join-realm",
- g_object_ref (realm), g_object_unref);
gtk_window_set_transient_for (GTK_WINDOW (join_dialog),
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (page))));
gtk_window_set_modal (GTK_WINDOW (join_dialog), TRUE);
@@ -710,15 +771,14 @@ on_join_login (GObject *source,
gpointer user_data)
{
GisAccountPage *page = user_data;
- UmRealmObject *realm = UM_REALM_OBJECT (source);
GError *error = NULL;
GBytes *creds;
- um_realm_login_finish (realm, result, &creds, &error);
+ um_realm_login_finish (page->priv->realm, result, &creds, &error);
/* Logged in as admin successfully, use creds to join domain */
if (error == NULL) {
- if (!um_realm_join_as_admin (realm,
+ if (!um_realm_join_as_admin (page->priv->realm,
gtk_entry_get_text (OBJ (GtkEntry *, "join-name")),
gtk_entry_get_text (OBJ (GtkEntry *, "join-password")),
creds, NULL, on_realm_joined, page)) {
@@ -730,7 +790,7 @@ on_join_login (GObject *source,
/* Couldn't login as admin, show prompt again */
} else {
- join_show_prompt (page, realm, error);
+ join_show_prompt (page, error);
g_message ("Couldn't log in as admin to join domain: %s", error->message);
g_error_free (error);
}
@@ -742,22 +802,22 @@ on_realm_joined (GObject *source,
gpointer user_data)
{
GisAccountPage *page = user_data;
- UmRealmObject *realm = UM_REALM_OBJECT (source);
GError *error = NULL;
- um_realm_join_finish (realm, result, &error);
+ um_realm_join_finish (page->priv->realm, result, &error);
/* Yay, joined the domain, register the user locally */
if (error == NULL) {
g_debug ("Joining realm completed successfully");
- enterprise_permit_user_login (page, realm);
+ enterprise_permit_user_login (page, page->priv->realm);
/* Credential failure while joining domain, prompt for admin creds */
} else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN) ||
- g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD)) {
- g_debug ("Joining realm failed due to credentials");
+ g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD) ||
+ g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME)) {
+ g_debug ("Joining realm failed due to credentials or host name");
- join_show_prompt (page, realm, error);
+ join_show_prompt (page, error);
/* Other failure */
} else {
@@ -775,11 +835,10 @@ on_realm_login (GObject *source,
gpointer user_data)
{
GisAccountPage *page = user_data;
- UmRealmObject *realm = UM_REALM_OBJECT (source);
GError *error = NULL;
GBytes *creds = NULL;
- um_realm_login_finish (realm, result, &creds, &error);
+ um_realm_login_finish (page->priv->realm, result, &creds, &error);
/*
* User login is valid, but cannot authenticate right now (eg: user needs
@@ -793,13 +852,13 @@ on_realm_login (GObject *source,
if (error == NULL) {
/* Already joined to the domain, just register this user */
- if (um_realm_is_configured (realm)) {
+ if (um_realm_is_configured (page->priv->realm)) {
g_debug ("Already joined to this realm");
- enterprise_permit_user_login (page, realm);
+ enterprise_permit_user_login (page, page->priv->realm);
/* Join the domain, try using the user's creds */
} else if (creds == NULL ||
- !um_realm_join_as_user (realm,
+ !um_realm_join_as_user (page->priv->realm,
gtk_entry_get_text (OBJ (GtkEntry *, "enterprise-login")),
gtk_entry_get_text (OBJ (GtkEntry *, "enterprise-password")),
creds, page->priv->cancellable,
@@ -809,7 +868,7 @@ on_realm_login (GObject *source,
/* If we can't do user auth, try to authenticate as admin */
g_debug ("Cannot join with user credentials");
- join_show_prompt (page, realm, error);
+ join_show_prompt (page, error);
}
g_bytes_unref (creds);
@@ -838,11 +897,11 @@ on_realm_login (GObject *source,
}
static void
-enterprise_check_login (GisAccountPage *page, UmRealmObject *realm)
+enterprise_check_login (GisAccountPage *page)
{
- g_assert (realm);
+ g_assert (page->priv->realm);
- um_realm_login (realm,
+ um_realm_login (page->priv->realm,
gtk_entry_get_text (OBJ (GtkEntry *, "enterprise-login")),
gtk_entry_get_text (OBJ (GtkEntry *, "enterprise-password")),
page->priv->cancellable,
@@ -867,8 +926,8 @@ on_realm_discover_input (GObject *source,
if (error == NULL) {
UmRealmObject *realm;
g_assert (realms != NULL);
- realm = g_object_ref (realms->data);
- enterprise_check_login (page, realm);
+ priv->realm = g_object_ref (realms->data);
+ enterprise_check_login (page);
g_list_free_full (realms, g_object_unref);
} else {
@@ -891,12 +950,13 @@ enterprise_add_user (GisAccountPage *page)
GtkComboBox *domain = OBJ(GtkComboBox*, "enterprise-domain");
priv->join_prompted = FALSE;
+ g_clear_object (&priv->realm);
/* Already know about this realm, try to login as user */
if (gtk_combo_box_get_active_iter (domain, &iter)) {
gtk_tree_model_get (gtk_combo_box_get_model (domain),
- &iter, 1, &realm, -1);
- enterprise_check_login (page, realm);
+ &iter, 1, &priv->realm, -1);
+ enterprise_check_login (page);
/* Something the user typed, we need to discover realm */
} else {
@@ -1184,6 +1244,8 @@ gis_account_page_dispose (GObject *object)
g_bus_unwatch_name (priv->realmd_watch);
g_clear_object (&priv->realm_manager);
g_clear_object (&priv->action);
+ g_clear_object (&priv->realm);
+ g_clear_object (&priv->cancellable);
G_OBJECT_CLASS (gis_account_page_parent_class)->dispose (object);
}
diff --git a/gnome-initial-setup/pages/account/gis-account-page.ui
b/gnome-initial-setup/pages/account/gis-account-page.ui
index 9602dec..496f4b8 100644
--- a/gnome-initial-setup/pages/account/gis-account-page.ui
+++ b/gnome-initial-setup/pages/account/gis-account-page.ui
@@ -585,7 +585,8 @@
<property name="yalign">0</property>
<property name="label" translatable="yes">In order to use enterprise logins, this computer
needs to be
enrolled in the domain. Please have your network administrator
-type their domain password here.</property>
+type their domain password here, and choose a unique computer
+name for your computer.</property>
</object>
<packing>
<property name="expand">False</property>
@@ -655,12 +656,10 @@ type their domain password here.</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="join-computer">
+ <object class="GtkEntry" id="join-computer">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_top">5</property>
- <property name="margin_bottom">5</property>
- <property name="xalign">0</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">1</property>
diff --git a/gnome-initial-setup/pages/account/um-realm-manager.c
b/gnome-initial-setup/pages/account/um-realm-manager.c
index 0b0fe15..597c3b8 100644
--- a/gnome-initial-setup/pages/account/um-realm-manager.c
+++ b/gnome-initial-setup/pages/account/um-realm-manager.c
@@ -669,6 +669,11 @@ um_realm_join_finish (UmRealmObject *realm,
g_set_error (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN,
"%s", call_error->message);
g_error_free (call_error);
+ } else if (g_str_equal (dbus_error, "org.freedesktop.realmd.Error.BadHostname")) {
+ g_debug ("Join() failed because of invalid/conflicting host name");
+ g_set_error (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME,
+ "%s", call_error->message);
+ g_error_free (call_error);
} else {
g_debug ("Join() failed because of %s", call_error->message);
g_propagate_error (error, call_error);
diff --git a/gnome-initial-setup/pages/account/um-realm-manager.h
b/gnome-initial-setup/pages/account/um-realm-manager.h
index 6b7a47a..2003cda 100644
--- a/gnome-initial-setup/pages/account/um-realm-manager.h
+++ b/gnome-initial-setup/pages/account/um-realm-manager.h
@@ -30,6 +30,7 @@ typedef enum {
UM_REALM_ERROR_BAD_LOGIN,
UM_REALM_ERROR_BAD_PASSWORD,
UM_REALM_ERROR_CANNOT_AUTH,
+ UM_REALM_ERROR_BAD_HOSTNAME,
UM_REALM_ERROR_GENERIC,
} UmRealmErrors;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]