Sumit Bose 461678
From f28edf4e887cf8616fa21dacc2b0f0d31f5f92fb Mon Sep 17 00:00:00 2001
Sumit Bose 461678
From: Sumit Bose <sbose@redhat.com>
Sumit Bose 461678
Date: Tue, 30 Jan 2018 14:37:05 +0100
Sumit Bose 461678
Subject: [PATCH 08/23] library: add _adcli_bin_sid_to_str()
Sumit Bose 461678
Sumit Bose 461678
Convert a binary SID to the string representation.
Sumit Bose 461678
Sumit Bose 461678
https://bugs.freedesktop.org/show_bug.cgi?id=100118
Sumit Bose 461678
Sumit Bose 461678
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Sumit Bose 461678
---
Sumit Bose 461678
 library/adprivate.h |   4 ++
Sumit Bose 461678
 library/adutil.c    | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++
Sumit Bose 461678
 2 files changed, 117 insertions(+)
Sumit Bose 461678
Sumit Bose 461678
diff --git a/library/adprivate.h b/library/adprivate.h
Sumit Bose 461678
index fc146af..e99f9fc 100644
Sumit Bose 461678
--- a/library/adprivate.h
Sumit Bose 461678
+++ b/library/adprivate.h
Sumit Bose 461678
@@ -31,6 +31,7 @@
Sumit Bose 461678
 #include <limits.h>
Sumit Bose 461678
 #include <stdlib.h>
Sumit Bose 461678
 #include <stdio.h>
Sumit Bose 461678
+#include <stdint.h>
Sumit Bose 461678
 
Sumit Bose 461678
 #include <ldap.h>
Sumit Bose 461678
 
Sumit Bose 461678
@@ -132,6 +133,9 @@ int            _adcli_str_has_prefix         (const char *str,
Sumit Bose 461678
 int            _adcli_str_has_suffix         (const char *str,
Sumit Bose 461678
 		                              const char *suffix);
Sumit Bose 461678
 
Sumit Bose 461678
+char *          _adcli_bin_sid_to_str        (const uint8_t *data,
Sumit Bose 461678
+                                              size_t len);
Sumit Bose 461678
+
Sumit Bose 461678
 char *         _adcli_str_dupn               (void *data,
Sumit Bose 461678
                                               size_t len);
Sumit Bose 461678
 
Sumit Bose 461678
diff --git a/library/adutil.c b/library/adutil.c
Sumit Bose 461678
index cd40f45..829cdd9 100644
Sumit Bose 461678
--- a/library/adutil.c
Sumit Bose 461678
+++ b/library/adutil.c
Sumit Bose 461678
@@ -293,6 +293,83 @@ _adcli_strv_set (char ***field,
Sumit Bose 461678
 	*field = newval;
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+char *
Sumit Bose 461678
+_adcli_bin_sid_to_str (const uint8_t *data,
Sumit Bose 461678
+                       size_t len)
Sumit Bose 461678
+{
Sumit Bose 461678
+	uint8_t sid_rev_num;
Sumit Bose 461678
+	int8_t num_auths;
Sumit Bose 461678
+	uint8_t id_auth[6];
Sumit Bose 461678
+	uint32_t id_auth_val;
Sumit Bose 461678
+	uint32_t sub_auths[15];
Sumit Bose 461678
+	uint32_t val;
Sumit Bose 461678
+	size_t p = 0;
Sumit Bose 461678
+	size_t c;
Sumit Bose 461678
+	int nc;
Sumit Bose 461678
+	char *sid_buf;
Sumit Bose 461678
+	size_t sid_buf_len;
Sumit Bose 461678
+
Sumit Bose 461678
+	if (data == NULL || len < 8) {
Sumit Bose 461678
+		return NULL;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	sid_rev_num = (uint8_t) data [p];
Sumit Bose 461678
+	p++;
Sumit Bose 461678
+
Sumit Bose 461678
+	num_auths = (int8_t) data[p];
Sumit Bose 461678
+	p++;
Sumit Bose 461678
+
Sumit Bose 461678
+	if (num_auths > 15 || len < 8 + (num_auths * sizeof (uint32_t))) {
Sumit Bose 461678
+		return NULL;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	for (c = 0; c < 6; c++) {
Sumit Bose 461678
+		id_auth[c] = (uint8_t) data[p];
Sumit Bose 461678
+		p++;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	/* Only 32bits are used for the string representation */
Sumit Bose 461678
+	id_auth_val = (id_auth[2] << 24) +
Sumit Bose 461678
+	              (id_auth[3] << 16) +
Sumit Bose 461678
+	              (id_auth[4] << 8) +
Sumit Bose 461678
+	              (id_auth[5]);
Sumit Bose 461678
+
Sumit Bose 461678
+	for (c = 0; c < num_auths; c++) {
Sumit Bose 461678
+		memcpy (&val, data + p, sizeof (uint32_t));
Sumit Bose 461678
+		sub_auths[c] = le32toh (val);
Sumit Bose 461678
+
Sumit Bose 461678
+		p += sizeof (uint32_t);
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	sid_buf_len = 17 + (num_auths * 11);
Sumit Bose 461678
+	sid_buf = calloc (1, sid_buf_len);
Sumit Bose 461678
+	if (sid_buf == NULL) {
Sumit Bose 461678
+		return NULL;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	nc = snprintf (sid_buf, sid_buf_len, "S-%u-%lu", sid_rev_num,
Sumit Bose 461678
+	              (unsigned long) id_auth_val);
Sumit Bose 461678
+	if (nc < 0 || nc >= sid_buf_len) {
Sumit Bose 461678
+		free (sid_buf);
Sumit Bose 461678
+		return NULL;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	p = 0;
Sumit Bose 461678
+	for (c = 0; c < num_auths; c++) {
Sumit Bose 461678
+		p += nc;
Sumit Bose 461678
+		sid_buf_len -= nc;
Sumit Bose 461678
+
Sumit Bose 461678
+		nc = snprintf (sid_buf + p, sid_buf_len, "-%lu",
Sumit Bose 461678
+		               (unsigned long) sub_auths[c]);
Sumit Bose 461678
+		if (nc < 0 || nc >= sid_buf_len) {
Sumit Bose 461678
+			free (sid_buf);
Sumit Bose 461678
+			return NULL;
Sumit Bose 461678
+		}
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	return sid_buf;
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
 char *
Sumit Bose 461678
 _adcli_str_dupn (void *data,
Sumit Bose 461678
                  size_t len)
Sumit Bose 461678
@@ -508,6 +585,41 @@ test_check_nt_time_string_lifetime (void)
Sumit Bose 461678
 	assert (_adcli_check_nt_time_string_lifetime ("130645404000000000", 100000));
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+static void
Sumit Bose 461678
+test_bin_sid_to_str (void)
Sumit Bose 461678
+{
Sumit Bose 461678
+	uint8_t sid1[] = { 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
Sumit Bose 461678
+	                   0x15, 0x00, 0x00, 0x00, 0xF8, 0x12, 0x13, 0xDC,
Sumit Bose 461678
+	                   0x47, 0xF3, 0x1C, 0x76, 0x47, 0x2F, 0x2E, 0xD7,
Sumit Bose 461678
+	                   0x51, 0x04, 0x00, 0x00 };
Sumit Bose 461678
+
Sumit Bose 461678
+	uint8_t sid2[] = { 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
Sumit Bose 461678
+	                   0x15, 0x00, 0x00, 0x00, 0xF8, 0x12, 0x13, 0xDC,
Sumit Bose 461678
+	                   0x47, 0xF3, 0x1C, 0x76, 0x47, 0x2F, 0x2E, 0xD7};
Sumit Bose 461678
+
Sumit Bose 461678
+	uint8_t sid3[] = { 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
Sumit Bose 461678
+	                   0x15, 0x00, 0x00, 0x00, 0x29, 0xC9, 0x4F, 0xD9,
Sumit Bose 461678
+	                   0xC2, 0x3C, 0xC3, 0x78, 0x36, 0x55, 0x87, 0xF8};
Sumit Bose 461678
+
Sumit Bose 461678
+
Sumit Bose 461678
+	char *str;
Sumit Bose 461678
+
Sumit Bose 461678
+	str = _adcli_bin_sid_to_str (sid1, sizeof (sid1));
Sumit Bose 461678
+	assert (str != NULL);
Sumit Bose 461678
+	assert (strcmp (str, "S-1-5-21-3692237560-1981608775-3610128199-1105") == 0);
Sumit Bose 461678
+	free (str);
Sumit Bose 461678
+
Sumit Bose 461678
+	str = _adcli_bin_sid_to_str (sid2, sizeof (sid2));
Sumit Bose 461678
+	assert (str != NULL);
Sumit Bose 461678
+	assert (strcmp (str, "S-1-5-21-3692237560-1981608775-3610128199") == 0);
Sumit Bose 461678
+	free (str);
Sumit Bose 461678
+
Sumit Bose 461678
+	str = _adcli_bin_sid_to_str (sid3, sizeof (sid2));
Sumit Bose 461678
+	assert (str != NULL);
Sumit Bose 461678
+	assert (strcmp (str, "S-1-5-21-3645884713-2026060994-4169618742") == 0);
Sumit Bose 461678
+	free (str);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
 int
Sumit Bose 461678
 main (int argc,
Sumit Bose 461678
       char *argv[])
Sumit Bose 461678
@@ -516,6 +628,7 @@ main (int argc,
Sumit Bose 461678
 	test_func (test_strv_dup, "/util/strv_dup");
Sumit Bose 461678
 	test_func (test_strv_count, "/util/strv_count");
Sumit Bose 461678
 	test_func (test_check_nt_time_string_lifetime, "/util/check_nt_time_string_lifetime");
Sumit Bose 461678
+	test_func (test_bin_sid_to_str, "/util/bin_sid_to_str");
Sumit Bose 461678
 	return test_run (argc, argv);
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
-- 
Sumit Bose 461678
2.14.4
Sumit Bose 461678