Blame SOURCES/0003-adenroll-add-adcli_enroll_get_permitted_keytab_encty.patch

539d92
From 0c09070e8beec734e3f0c70e14b0a04788077b73 Mon Sep 17 00:00:00 2001
539d92
From: Sumit Bose <sbose@redhat.com>
539d92
Date: Thu, 13 Jun 2019 17:25:52 +0200
539d92
Subject: [PATCH 3/4] adenroll: add adcli_enroll_get_permitted_keytab_enctypes
539d92
 with tests
539d92
539d92
The new call does not only return the current encryption types set in AD
539d92
or a default list but filters them with the list of permitted encryption
539d92
types on the client. This makes sure the client can create and use the
539d92
keys.
539d92
539d92
Related to https://gitlab.freedesktop.org/realmd/adcli/issues/3
539d92
---
539d92
 library/Makefile.am |   5 ++
539d92
 library/adenroll.c  | 124 ++++++++++++++++++++++++++++++++++++++++++++
539d92
 library/adenroll.h  |   2 +
539d92
 3 files changed, 131 insertions(+)
539d92
539d92
diff --git a/library/Makefile.am b/library/Makefile.am
539d92
index 39e8fd1..4829555 100644
539d92
--- a/library/Makefile.am
539d92
+++ b/library/Makefile.am
539d92
@@ -40,6 +40,7 @@ check_PROGRAMS = \
539d92
 	test-util \
539d92
 	test-ldap \
539d92
 	test-attrs \
539d92
+	test-adenroll \
539d92
 	$(NULL)
539d92
 
539d92
 test_seq_SOURCES = seq.c test.c test.h
539d92
@@ -56,6 +57,10 @@ test_attrs_SOURCES = adattrs.c $(test_ldap_SOURCES)
539d92
 test_attrs_CFLAGS = -DATTRS_TESTS
539d92
 test_attrs_LDADD = $(test_ldap_LDADD)
539d92
 
539d92
+test_adenroll_SOURCES = adenroll.c $(test_ldap_SOURCES)
539d92
+test_adenroll_CFLAGS = -DADENROLL_TESTS
539d92
+test_adenroll_LDADD = $(KRB5_LIBS)
539d92
+
539d92
 TESTS = $(check_PROGRAMS)
539d92
 
539d92
 MEMCHECK_ENV = $(TEST_RUNNER) valgrind --error-exitcode=80 --quiet --trace-children=yes
539d92
diff --git a/library/adenroll.c b/library/adenroll.c
539d92
index f617f28..95c07cd 100644
539d92
--- a/library/adenroll.c
539d92
+++ b/library/adenroll.c
539d92
@@ -2641,6 +2641,50 @@ adcli_enroll_get_keytab_enctypes (adcli_enroll *enroll)
539d92
 		return v51_earlier_enctypes;
539d92
 }
539d92
 
539d92
+krb5_enctype *
539d92
+adcli_enroll_get_permitted_keytab_enctypes (adcli_enroll *enroll)
539d92
+{
539d92
+	krb5_enctype *cur_enctypes;
539d92
+	krb5_enctype *permitted_enctypes;
539d92
+	krb5_enctype *new_enctypes;
539d92
+	krb5_error_code code;
539d92
+	krb5_context k5;
539d92
+	size_t c;
539d92
+	size_t p;
539d92
+	size_t n;
539d92
+
539d92
+	return_val_if_fail (enroll != NULL, NULL);
539d92
+	cur_enctypes = adcli_enroll_get_keytab_enctypes (enroll);
539d92
+
539d92
+	k5 = adcli_conn_get_krb5_context (enroll->conn);
539d92
+	return_val_if_fail (k5 != NULL, NULL);
539d92
+
539d92
+	code = krb5_get_permitted_enctypes (k5, &permitted_enctypes);
539d92
+	return_val_if_fail (code == 0, NULL);
539d92
+
539d92
+	for (c = 0; cur_enctypes[c] != 0; c++);
539d92
+
539d92
+	new_enctypes = calloc (c + 1, sizeof (krb5_enctype));
539d92
+	return_val_if_fail (new_enctypes != NULL, NULL);
539d92
+
539d92
+	n = 0;
539d92
+	for (c = 0; cur_enctypes[c] != 0; c++) {
539d92
+		for (p = 0; permitted_enctypes[p] != 0; p++) {
539d92
+			if (cur_enctypes[c] == permitted_enctypes[p]) {
539d92
+				new_enctypes[n++] = cur_enctypes[c];
539d92
+				break;
539d92
+			}
539d92
+		}
539d92
+		if (permitted_enctypes[p] == 0) {
539d92
+			_adcli_info ("Encryption type [%d] not permitted.", cur_enctypes[c]);
539d92
+		}
539d92
+	}
539d92
+
539d92
+	krb5_free_enctypes (k5, permitted_enctypes);
539d92
+
539d92
+	return new_enctypes;
539d92
+}
539d92
+
539d92
 void
539d92
 adcli_enroll_set_keytab_enctypes (adcli_enroll *enroll,
539d92
                                   krb5_enctype *value)
539d92
@@ -2833,3 +2877,83 @@ adcli_enroll_add_service_principal_to_remove (adcli_enroll *enroll,
539d92
 							    strdup (value), NULL);
539d92
 	return_if_fail (enroll->service_principals_to_remove != NULL);
539d92
 }
539d92
+
539d92
+#ifdef ADENROLL_TESTS
539d92
+
539d92
+#include "test.h"
539d92
+
539d92
+static void
539d92
+test_adcli_enroll_get_permitted_keytab_enctypes (void)
539d92
+{
539d92
+	krb5_enctype *enctypes;
539d92
+	krb5_error_code code;
539d92
+	krb5_enctype *permitted_enctypes;
539d92
+	krb5_enctype check_enctypes[3] = { 0 };
539d92
+	adcli_conn *conn;
539d92
+	adcli_enroll *enroll;
539d92
+	adcli_result res;
539d92
+	krb5_context k5;
539d92
+	size_t c;
539d92
+
539d92
+	conn = adcli_conn_new ("test.dom");
539d92
+	assert_ptr_not_null (conn);
539d92
+
539d92
+	enroll = adcli_enroll_new (conn);
539d92
+	assert_ptr_not_null (enroll);
539d92
+
539d92
+	enctypes = adcli_enroll_get_permitted_keytab_enctypes (NULL);
539d92
+	assert_ptr_eq (enctypes, NULL);
539d92
+
539d92
+	/* krb5 context missing */
539d92
+	enctypes = adcli_enroll_get_permitted_keytab_enctypes (enroll);
539d92
+	assert_ptr_eq (enctypes, NULL);
539d92
+
539d92
+	/* check that all permitted enctypes can pass */
539d92
+	res = _adcli_krb5_init_context (&k5;;
539d92
+	assert_num_eq (res, ADCLI_SUCCESS);
539d92
+
539d92
+	adcli_conn_set_krb5_context (conn, k5);
539d92
+
539d92
+	code = krb5_get_permitted_enctypes (k5, &permitted_enctypes);
539d92
+	assert_num_eq (code, 0);
539d92
+	assert_ptr_not_null (permitted_enctypes);
539d92
+	assert_num_cmp (permitted_enctypes[0], !=, 0);
539d92
+
539d92
+	adcli_enroll_set_keytab_enctypes (enroll, permitted_enctypes);
539d92
+
539d92
+	enctypes = adcli_enroll_get_permitted_keytab_enctypes (enroll);
539d92
+	assert_ptr_not_null (enctypes);
539d92
+	for (c = 0; permitted_enctypes[c] != 0; c++) {
539d92
+		assert_num_eq (enctypes[c], permitted_enctypes[c]);
539d92
+	}
539d92
+	assert_num_eq (enctypes[c], 0);
539d92
+	krb5_free_enctypes (k5, enctypes);
539d92
+
539d92
+	/* check that ENCTYPE_UNKNOWN is filtered out */
539d92
+	check_enctypes[0] = permitted_enctypes[0];
539d92
+	check_enctypes[1] = ENCTYPE_UNKNOWN;
539d92
+	check_enctypes[2] = 0;
539d92
+	adcli_enroll_set_keytab_enctypes (enroll, check_enctypes);
539d92
+
539d92
+	enctypes = adcli_enroll_get_permitted_keytab_enctypes (enroll);
539d92
+	assert_ptr_not_null (enctypes);
539d92
+	assert_num_eq (enctypes[0], permitted_enctypes[0]);
539d92
+	assert_num_eq (enctypes[1], 0);
539d92
+	krb5_free_enctypes (k5, enctypes);
539d92
+
539d92
+	krb5_free_enctypes (k5, permitted_enctypes);
539d92
+
539d92
+	adcli_enroll_unref (enroll);
539d92
+	adcli_conn_unref (conn);
539d92
+}
539d92
+
539d92
+int
539d92
+main (int argc,
539d92
+      char *argv[])
539d92
+{
539d92
+	test_func (test_adcli_enroll_get_permitted_keytab_enctypes,
539d92
+	           "/attrs/adcli_enroll_get_permitted_keytab_enctypes");
539d92
+	return test_run (argc, argv);
539d92
+}
539d92
+
539d92
+#endif /* ADENROLL_TESTS */
539d92
diff --git a/library/adenroll.h b/library/adenroll.h
539d92
index abbbfd4..1d5d00d 100644
539d92
--- a/library/adenroll.h
539d92
+++ b/library/adenroll.h
539d92
@@ -138,6 +138,8 @@ krb5_enctype *     adcli_enroll_get_keytab_enctypes     (adcli_enroll *enroll);
539d92
 void               adcli_enroll_set_keytab_enctypes     (adcli_enroll *enroll,
539d92
                                                          krb5_enctype *enctypes);
539d92
 
539d92
+krb5_enctype *     adcli_enroll_get_permitted_keytab_enctypes (adcli_enroll *enroll);
539d92
+
539d92
 const char *       adcli_enroll_get_os_name             (adcli_enroll *enroll);
539d92
 
539d92
 void               adcli_enroll_set_os_name             (adcli_enroll *enroll,
539d92
-- 
539d92
2.21.0
539d92