Blame SOURCES/0004-library-make-sure-server-side-SPNs-are-preserved.patch

2e5ed6
From 972f1a2f35829ed89f5353bd204683aa9ad6a2d2 Mon Sep 17 00:00:00 2001
2e5ed6
From: Sumit Bose <sbose@redhat.com>
2e5ed6
Date: Fri, 22 Mar 2019 10:37:57 +0100
2e5ed6
Subject: [PATCH 4/4] library: make sure server side SPNs are preserved
2e5ed6
2e5ed6
adcli should not delete service principal names (SPNs) unexpectedly. If
2e5ed6
a SPN was added on the server while presetting a host or updating an
2e5ed6
existing entry and upcoming adcli join or update should preserver this
2e5ed6
change.
2e5ed6
2e5ed6
Related to https://bugzilla.redhat.com/show_bug.cgi?id=1630187
2e5ed6
---
2e5ed6
 library/adenroll.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
2e5ed6
 1 file changed, 46 insertions(+)
2e5ed6
2e5ed6
diff --git a/library/adenroll.c b/library/adenroll.c
2e5ed6
index 48cb4cf..1cce86a 100644
2e5ed6
--- a/library/adenroll.c
2e5ed6
+++ b/library/adenroll.c
2e5ed6
@@ -1961,6 +1961,47 @@ adcli_enroll_prepare (adcli_enroll *enroll,
2e5ed6
 	return res;
2e5ed6
 }
2e5ed6
 
2e5ed6
+static adcli_result
2e5ed6
+add_server_side_service_principals (adcli_enroll *enroll)
2e5ed6
+{
2e5ed6
+	char **spn_list;
2e5ed6
+	LDAP *ldap;
2e5ed6
+	size_t c;
2e5ed6
+	int length = 0;
2e5ed6
+	adcli_result res;
2e5ed6
+
2e5ed6
+	ldap = adcli_conn_get_ldap_connection (enroll->conn);
2e5ed6
+	assert (ldap != NULL);
2e5ed6
+
2e5ed6
+	spn_list = _adcli_ldap_parse_values (ldap, enroll->computer_attributes,
2e5ed6
+	                                     "servicePrincipalName");
2e5ed6
+	if (spn_list == NULL) {
2e5ed6
+		return ADCLI_SUCCESS;
2e5ed6
+	}
2e5ed6
+
2e5ed6
+	if (enroll->service_principals != NULL) {
2e5ed6
+		length = seq_count (enroll->service_principals);
2e5ed6
+	}
2e5ed6
+
2e5ed6
+	for (c = 0; spn_list[c] != NULL; c++) {
2e5ed6
+		_adcli_info ("Checking %s", spn_list[c]);
2e5ed6
+		if (!_adcli_strv_has_ex (enroll->service_principals_to_remove, spn_list[c], strcasecmp)) {
2e5ed6
+			enroll->service_principals = _adcli_strv_add_unique (enroll->service_principals,
2e5ed6
+		                                                             spn_list[c], &length, false);
2e5ed6
+			assert (enroll->service_principals != NULL);
2e5ed6
+			_adcli_info ("   Added %s", spn_list[c]);
2e5ed6
+		}
2e5ed6
+	}
2e5ed6
+	_adcli_strv_free (spn_list);
2e5ed6
+
2e5ed6
+	res = ensure_keytab_principals (ADCLI_SUCCESS, enroll);
2e5ed6
+	if (res != ADCLI_SUCCESS) {
2e5ed6
+		return res;
2e5ed6
+	}
2e5ed6
+
2e5ed6
+	return ADCLI_SUCCESS;
2e5ed6
+}
2e5ed6
+
2e5ed6
 static adcli_result
2e5ed6
 enroll_join_or_update_tasks (adcli_enroll *enroll,
2e5ed6
 		             adcli_enroll_flags flags)
2e5ed6
@@ -2019,6 +2060,11 @@ enroll_join_or_update_tasks (adcli_enroll *enroll,
2e5ed6
 	update_and_calculate_enctypes (enroll);
2e5ed6
 	update_computer_account (enroll);
2e5ed6
 
2e5ed6
+	res = add_server_side_service_principals (enroll);
2e5ed6
+	if (res != ADCLI_SUCCESS) {
2e5ed6
+		return res;
2e5ed6
+	}
2e5ed6
+
2e5ed6
 	/* service_names is only set from input on the command line, so no
2e5ed6
 	 * additional check for explicit is needed here */
2e5ed6
 	if (enroll->service_names != NULL) {
2e5ed6
-- 
2e5ed6
2.20.1
2e5ed6