Blame SOURCES/0001-Support-manually-setting-computer-name.patch

3a7434
From ec3c397cf50ace03f920502f34bca612f62333bf Mon Sep 17 00:00:00 2001
3a7434
From: Andrew Austin <aaustin@one.verizon.com>
3a7434
Date: Sun, 17 Apr 2016 12:17:04 -0500
3a7434
Subject: [PATCH 1/3] Support manually setting computer name
3a7434
3a7434
This change adds a computer-name option to the realm configuration.
3a7434
When set, the computer-name string will be used in place of either the
3a7434
system's hostname or an automatically truncated netbios name when joining
3a7434
an active directory domain.
3a7434
3a7434
https://bugs.freedesktop.org/show_bug.cgi?id=93739
3a7434
3a7434
Signed-off-by: Stef Walter <stefw@redhat.com>
3a7434
 * Squashed fixup patch
3a7434
---
3a7434
 dbus/realm-dbus-constants.h  |  1 +
3a7434
 service/realm-adcli-enroll.c | 11 +++++++++--
3a7434
 service/realm-options.c      | 21 +++++++++++++++++++++
3a7434
 service/realm-options.h      |  3 +++
3a7434
 service/realm-samba-enroll.c | 26 ++++++++++++++++++++------
3a7434
 service/realm-samba.c        | 10 +++++++++-
3a7434
 service/realm-sssd-ad.c      |  9 ++++++---
3a7434
 7 files changed, 69 insertions(+), 12 deletions(-)
3a7434
3a7434
diff --git a/dbus/realm-dbus-constants.h b/dbus/realm-dbus-constants.h
3a7434
index c68e958..3a67a00 100644
3a7434
--- a/dbus/realm-dbus-constants.h
3a7434
+++ b/dbus/realm-dbus-constants.h
3a7434
@@ -66,6 +66,7 @@ G_BEGIN_DECLS
3a7434
 #define   REALM_DBUS_OPTION_MEMBERSHIP_SOFTWARE    "membership-software"
3a7434
 #define   REALM_DBUS_OPTION_USER_PRINCIPAL         "user-principal"
3a7434
 #define   REALM_DBUS_OPTION_MANAGE_SYSTEM          "manage-system"
3a7434
+#define   REALM_DBUS_OPTION_COMPUTER_NAME          "computer-name"
3a7434
 
3a7434
 #define   REALM_DBUS_IDENTIFIER_ACTIVE_DIRECTORY   "active-directory"
3a7434
 #define   REALM_DBUS_IDENTIFIER_WINBIND            "winbind"
3a7434
diff --git a/service/realm-adcli-enroll.c b/service/realm-adcli-enroll.c
3a7434
index ef1b563..0c506f9 100644
3a7434
--- a/service/realm-adcli-enroll.c
3a7434
+++ b/service/realm-adcli-enroll.c
3a7434
@@ -84,6 +84,7 @@ realm_adcli_enroll_join_async (RealmDisco *disco,
3a7434
 	gchar *upn_arg = NULL;
3a7434
 	gchar *server_arg = NULL;
3a7434
 	gchar *ou_arg = NULL;
3a7434
+	const gchar *computer_name = NULL;
3a7434
 
3a7434
 	g_return_if_fail (cred != NULL);
3a7434
 	g_return_if_fail (disco != NULL);
3a7434
@@ -114,7 +115,14 @@ realm_adcli_enroll_join_async (RealmDisco *disco,
3a7434
 		g_ptr_array_add (args, (gpointer)disco->explicit_server);
3a7434
 	}
3a7434
 
3a7434
-	if (disco->explicit_netbios) {
3a7434
+		/* Pass manually configured or truncated computer name to adcli */
3a7434
+		computer_name = realm_options_computer_name (options, disco->domain_name);
3a7434
+		if (computer_name != NULL) {
3a7434
+			realm_diagnostics_info (invocation, "Joining using a manual netbios name: %s",
3a7434
+			                        computer_name);
3a7434
+			g_ptr_array_add (args, "--computer-name");
3a7434
+			g_ptr_array_add (args, (gpointer)computer_name);
3a7434
+		} else if (disco->explicit_netbios) {
3a7434
 		realm_diagnostics_info (invocation, "Joining using a truncated netbios name: %s",
3a7434
 		                        disco->explicit_netbios);
3a7434
 		g_ptr_array_add (args, "--computer-name");
3a7434
@@ -192,7 +200,6 @@ realm_adcli_enroll_join_async (RealmDisco *disco,
3a7434
 
3a7434
 	if (input)
3a7434
 		g_bytes_unref (input);
3a7434
-
3a7434
 	free (ccache_arg);
3a7434
 	free (upn_arg);
3a7434
 	free (server_arg);
3a7434
diff --git a/service/realm-options.c b/service/realm-options.c
3a7434
index bba3ee4..b9f59c6 100644
3a7434
--- a/service/realm-options.c
3a7434
+++ b/service/realm-options.c
3a7434
@@ -159,3 +159,24 @@ realm_options_check_domain_name (const gchar *name)
3a7434
 
3a7434
 	return TRUE;
3a7434
 }
3a7434
+
3a7434
+const gchar *
3a7434
+realm_options_computer_name (GVariant *options,
3a7434
+                           const gchar *realm_name)
3a7434
+{
3a7434
+	const gchar *computer_name = NULL;
3a7434
+	gchar *section;
3a7434
+
3a7434
+	if (options) {
3a7434
+		if (!g_variant_lookup (options, REALM_DBUS_OPTION_COMPUTER_NAME, "&s", &computer_name))
3a7434
+			computer_name = NULL;
3a7434
+	}
3a7434
+
3a7434
+	if (realm_name && !computer_name) {
3a7434
+		section = g_utf8_casefold (realm_name, -1);
3a7434
+		computer_name = realm_settings_value (section, REALM_DBUS_OPTION_COMPUTER_NAME);
3a7434
+		g_free (section);
3a7434
+	}
3a7434
+
3a7434
+	return g_strdup (computer_name);
3a7434
+}
3a7434
diff --git a/service/realm-options.h b/service/realm-options.h
3a7434
index 4890cba..e31cddc 100644
3a7434
--- a/service/realm-options.h
3a7434
+++ b/service/realm-options.h
3a7434
@@ -41,6 +41,9 @@ gboolean       realm_options_qualify_names            (const gchar *realm_name);
3a7434
 
3a7434
 gboolean       realm_options_check_domain_name        (const gchar *domain_name);
3a7434
 
3a7434
+const gchar *  realm_options_computer_name           (GVariant *options,
3a7434
+                                                       const gchar *realm_name);
3a7434
+
3a7434
 G_END_DECLS
3a7434
 
3a7434
 #endif /* __REALM_OPTIONS_H__ */
3a7434
diff --git a/service/realm-samba-enroll.c b/service/realm-samba-enroll.c
3a7434
index e749764..f2392a9 100644
3a7434
--- a/service/realm-samba-enroll.c
3a7434
+++ b/service/realm-samba-enroll.c
3a7434
@@ -84,27 +84,37 @@ fallback_workgroup (const gchar *realm)
3a7434
 static JoinClosure *
3a7434
 join_closure_init (GTask *task,
3a7434
                    RealmDisco *disco,
3a7434
+                   GVariant *options,
3a7434
                    GDBusMethodInvocation *invocation)
3a7434
 {
3a7434
 	JoinClosure *join;
3a7434
 	gchar *workgroup;
3a7434
 	GError *error = NULL;
3a7434
 	int temp_fd;
3a7434
+	const gchar *explicit_computer_name = NULL;
3a7434
+	const gchar *authid = NULL;
3a7434
 
3a7434
 	join = g_new0 (JoinClosure, 1);
3a7434
 	join->disco = realm_disco_ref (disco);
3a7434
 	join->invocation = invocation ? g_object_ref (invocation) : NULL;
3a7434
 	g_task_set_task_data (task, join, join_closure_free);
3a7434
 
3a7434
+	explicit_computer_name = realm_options_computer_name (options, disco->domain_name);
3a7434
+	/* Set netbios name to explicit or truncated name if available */
3a7434
+	if (explicit_computer_name != NULL)
3a7434
+		authid = explicit_computer_name;
3a7434
+	else if (disco->explicit_netbios)
3a7434
+		authid = disco->explicit_netbios;
3a7434
+
3a7434
 	join->config = realm_ini_config_new (REALM_INI_NO_WATCH | REALM_INI_PRIVATE);
3a7434
 	realm_ini_config_set (join->config, REALM_SAMBA_CONFIG_GLOBAL,
3a7434
 	                      "security", "ads",
3a7434
 	                      "kerberos method", "system keytab",
3a7434
 	                      "realm", disco->kerberos_realm,
3a7434
-	                      "netbios name", disco->explicit_netbios,
3a7434
+	                      "netbios name", authid,
3a7434
 	                      NULL);
3a7434
 
3a7434
-	/*
3a7434
+    /*
3a7434
 	 * Samba complains if we don't set a 'workgroup' setting for the realm we're
3a7434
 	 * going to join. If we didn't yet manage to lookup the workgroup, then go ahead
3a7434
 	 * and assume that the first domain component is the workgroup name.
3a7434
@@ -377,14 +387,18 @@ realm_samba_enroll_join_async (RealmDisco *disco,
3a7434
 {
3a7434
 	GTask *task;
3a7434
 	JoinClosure *join;
3a7434
+	const gchar *explicit_computer_name;
3a7434
 
3a7434
 	g_return_if_fail (disco != NULL);
3a7434
 	g_return_if_fail (cred != NULL);
3a7434
 
3a7434
 	task = g_task_new (NULL, NULL, callback, user_data);
3a7434
-	join = join_closure_init (task, disco, invocation);
3a7434
-
3a7434
-	if (disco->explicit_netbios) {
3a7434
+	join = join_closure_init (task, disco, options, invocation);
3a7434
+	explicit_computer_name = realm_options_computer_name (options, disco->domain_name);
3a7434
+	if (explicit_computer_name != NULL) {
3a7434
+		realm_diagnostics_info (invocation, "Joining using a manual netbios name: %s",
3a7434
+		                        explicit_computer_name);
3a7434
+	} else if (disco->explicit_netbios) {
3a7434
 		realm_diagnostics_info (invocation, "Joining using a truncated netbios name: %s",
3a7434
 		                        disco->explicit_netbios);
3a7434
 	}
3a7434
@@ -448,7 +462,7 @@ realm_samba_enroll_leave_async (RealmDisco *disco,
3a7434
 	JoinClosure *join;
3a7434
 
3a7434
 	task = g_task_new (NULL, NULL, callback, user_data);
3a7434
-	join = join_closure_init (task, disco, invocation);
3a7434
+	join = join_closure_init (task, disco, options, invocation);
3a7434
 
3a7434
 	switch (cred->type) {
3a7434
 	case REALM_CREDENTIAL_PASSWORD:
3a7434
diff --git a/service/realm-samba.c b/service/realm-samba.c
3a7434
index eca65aa..5cf2aa8 100644
3a7434
--- a/service/realm-samba.c
3a7434
+++ b/service/realm-samba.c
3a7434
@@ -183,6 +183,13 @@ on_join_do_winbind (GObject *source,
3a7434
 	GHashTable *settings = NULL;
3a7434
 	GError *error = NULL;
3a7434
 	const gchar *name;
3a7434
+	const gchar *computer_name;
3a7434
+
3a7434
+	computer_name = realm_options_computer_name (enroll->options, enroll->disco->domain_name);
3a7434
+	/* Use truncated name if set and explicit name is not available */
3a7434
+	if (enroll->disco->explicit_netbios && computer_name == NULL)
3a7434
+		computer_name = enroll->disco->explicit_netbios;
3a7434
+
3a7434
 
3a7434
 	realm_samba_enroll_join_finish (result, &error);
3a7434
 	if (error == NULL) {
3a7434
@@ -192,12 +199,13 @@ on_join_do_winbind (GObject *source,
3a7434
 		                         "workgroup", enroll->disco->workgroup,
3a7434
 		                         "template homedir", realm_settings_string ("users", "default-home"),
3a7434
 		                         "template shell", realm_settings_string ("users", "default-shell"),
3a7434
-		                         "netbios name", enroll->disco->explicit_netbios,
3a7434
+		                         "netbios name", computer_name,
3a7434
 		                         "password server", enroll->disco->explicit_server,
3a7434
 		                         "kerberos method", "system keytab",
3a7434
 		                         NULL);
3a7434
 	}
3a7434
 
3a7434
+
3a7434
 	if (error == NULL) {
3a7434
 		name = realm_kerberos_get_name (REALM_KERBEROS (self));
3a7434
 		realm_samba_winbind_configure_async (self->config, name, enroll->options,
3a7434
diff --git a/service/realm-sssd-ad.c b/service/realm-sssd-ad.c
3a7434
index c7ffe8a..5ed384d 100644
3a7434
--- a/service/realm-sssd-ad.c
3a7434
+++ b/service/realm-sssd-ad.c
3a7434
@@ -163,6 +163,7 @@ configure_sssd_for_domain (RealmIniConfig *config,
3a7434
 	GString *realmd_tags;
3a7434
 	const gchar *access_provider;
3a7434
 	const gchar *shell;
3a7434
+    const gchar *explicit_computer_name;
3a7434
 	gchar *authid = NULL;
3a7434
 	gboolean qualify;
3a7434
 	gboolean ret;
3a7434
@@ -172,17 +173,19 @@ configure_sssd_for_domain (RealmIniConfig *config,
3a7434
 	home = realm_sssd_build_default_home (realm_settings_string ("users", "default-home"));
3a7434
 	qualify = realm_options_qualify_names (disco->domain_name);
3a7434
 	shell = realm_settings_string ("users", "default-shell");
3a7434
-
3a7434
+	explicit_computer_name = realm_options_computer_name (options, disco->domain_name);
3a7434
 	realmd_tags = g_string_new ("");
3a7434
 	if (realm_options_manage_system (options, disco->domain_name))
3a7434
 		g_string_append (realmd_tags, "manages-system ");
3a7434
 	g_string_append (realmd_tags, use_adcli ? "joined-with-adcli " : "joined-with-samba ");
3a7434
 
3a7434
 	/*
3a7434
-	 * Explicitly set the netbios authid for sssd to use in this case, since
3a7434
+	 * Explicitly set the netbios authid for sssd to use in these cases, since
3a7434
 	 * otherwise sssd won't know which kerberos principal to use
3a7434
 	 */
3a7434
-	if (disco->explicit_netbios)
3a7434
+	if (explicit_computer_name != NULL)
3a7434
+		authid = g_strdup_printf ("%s$", explicit_computer_name);
3a7434
+	else if (disco->explicit_netbios)
3a7434
 		authid = g_strdup_printf ("%s$", disco->explicit_netbios);
3a7434
 
3a7434
 	ret = realm_sssd_config_add_domain (config, disco->domain_name, error,
3a7434
-- 
3a7434
2.7.4
3a7434