Blame SOURCES/0014-MS-cert-template-add-D-Bus-property-and-storage.patch

1495bf
From afe1fc05a5da349c3e24e8c96b1e185e4da53613 Mon Sep 17 00:00:00 2001
1495bf
From: Fraser Tweedale <ftweedal@redhat.com>
1495bf
Date: Thu, 17 Aug 2017 11:38:43 +1000
1495bf
Subject: [PATCH] MS cert template: add D-Bus property and storage
1495bf
1495bf
Add a D-Bus property and storage for a new template attribute, which
1495bf
will hold data to be included in CSRs in the MS V2 certificate
1495bf
template extension.
1495bf
1495bf
The server does not validate the extension data (validation
1495bf
behaviour is implemented in a subsequent commit).
1495bf
1495bf
Part of: https://pagure.io/certmonger/issue/78
1495bf
---
1495bf
 doc/api.txt                 |  2 ++
1495bf
 src/store-files.c           | 10 ++++++++++
1495bf
 src/store-int.h             |  1 +
1495bf
 src/tdbus.h                 |  1 +
1495bf
 src/tdbush.c                | 29 ++++++++++++++++++++++++++++-
1495bf
 tests/028-dbus/expected.out |  1 +
1495bf
 6 files changed, 43 insertions(+), 1 deletion(-)
1495bf
1495bf
diff --git a/doc/api.txt b/doc/api.txt
1495bf
index 31016be..83cf375 100644
1495bf
--- a/doc/api.txt
1495bf
+++ b/doc/api.txt
1495bf
@@ -56,6 +56,7 @@ o object layout
1495bf
                {("template-crldp"),array-of-string (CRL distribution point URIs)}
1495bf
                {("template-ns-comment"),string (Netscape comment)}
1495bf
                {("template-profile"),string (certificate profile)}
1495bf
+               {("template-ms-certificate-template"),string (MS V2 template specifier; format: <oid>:<major-version>[:<minor-version>] )}
1495bf
                {("template-issuer"),string (requested issuer)}
1495bf
                {("template-challenge-password"),string (password to add to CSR)}
1495bf
                {("template-challenge-password-file"),string (password file)
1495bf
@@ -165,6 +166,7 @@ o object layout
1495bf
                {("template-crldp"),array-of-string (CRL distribution point URIs)}
1495bf
                {("template-ns-comment"),string (Netscape comment)}
1495bf
                {("template-profile"),string (certificate profile)}
1495bf
+               {("template-ms-certificate-template"),string (MS V2 template specifier; format: <oid>:<major-version>[:<minor-version>] )}
1495bf
                {("template-issuer"),string (requested issuer)}
1495bf
                {("template-challenge-password"),string (password to add to CSR)}
1495bf
                {("template-challenge-password-file"),string (password file)
1495bf
diff --git a/src/store-files.c b/src/store-files.c
1495bf
index 889829c..977e896 100644
1495bf
--- a/src/store-files.c
1495bf
+++ b/src/store-files.c
1495bf
@@ -130,6 +130,7 @@ enum cm_store_file_field {
1495bf
 	cm_store_entry_field_template_ns_comment,
1495bf
 	cm_store_entry_field_template_profile,
1495bf
 	cm_store_entry_field_template_issuer,
1495bf
+	cm_store_entry_field_template_certificate_template,
1495bf
 	cm_store_entry_field_template_no_ocsp_check,
1495bf
 	cm_store_entry_field_template_ns_certtype,
1495bf
 
1495bf
@@ -305,6 +306,7 @@ static struct cm_store_file_field_list {
1495bf
 	{cm_store_entry_field_template_profile, "template_profile"}, /* right */
1495bf
 	{cm_store_entry_field_template_profile, "ca_profile"}, /* wrong */
1495bf
 	{cm_store_entry_field_template_issuer, "template_issuer"},
1495bf
+	{cm_store_entry_field_template_certificate_template, "template_certificate_template"},
1495bf
 	{cm_store_entry_field_template_no_ocsp_check, "template_no_ocsp_check"},
1495bf
 	{cm_store_entry_field_template_ns_certtype, "template_ns_certtype"},
1495bf
 
1495bf
@@ -1129,6 +1131,9 @@ cm_store_entry_read(void *parent, const char *filename, FILE *fp)
1495bf
 			case cm_store_entry_field_template_profile:
1495bf
 				ret->cm_template_profile = free_if_empty(p);
1495bf
 				break;
1495bf
+			case cm_store_entry_field_template_certificate_template:
1495bf
+				ret->cm_template_certificate_template = free_if_empty(p);
1495bf
+				break;
1495bf
 			case cm_store_entry_field_template_issuer:
1495bf
 				ret->cm_template_issuer = free_if_empty(p);
1495bf
 				break;
1495bf
@@ -1375,6 +1380,7 @@ cm_store_ca_read(void *parent, const char *filename, FILE *fp)
1495bf
 			case cm_store_entry_field_template_ocsp_location:
1495bf
 			case cm_store_entry_field_template_ns_comment:
1495bf
 			case cm_store_entry_field_template_profile:
1495bf
+			case cm_store_entry_field_template_certificate_template:
1495bf
 			case cm_store_entry_field_template_issuer:
1495bf
 			case cm_store_entry_field_template_no_ocsp_check:
1495bf
 			case cm_store_entry_field_template_ns_certtype:
1495bf
@@ -1984,6 +1990,8 @@ cm_store_entry_write(FILE *fp, struct cm_store_entry *entry)
1495bf
 				entry->cm_template_no_ocsp_check ? 1 : 0);
1495bf
 	cm_store_file_write_str(fp, cm_store_entry_field_template_ns_certtype,
1495bf
 				entry->cm_template_ns_certtype);
1495bf
+	cm_store_file_write_str(fp, cm_store_entry_field_template_certificate_template,
1495bf
+				entry->cm_template_certificate_template);
1495bf
 
1495bf
 	cm_store_file_write_str(fp, cm_store_entry_field_challenge_password,
1495bf
 				entry->cm_template_challenge_password);
1495bf
@@ -2745,6 +2753,8 @@ cm_store_entry_dup(void *parent, struct cm_store_entry *entry)
1495bf
 	ret->cm_template_profile = cm_store_maybe_strdup(ret, entry->cm_template_profile);
1495bf
 	ret->cm_template_issuer = cm_store_maybe_strdup(ret, entry->cm_template_issuer);
1495bf
 	ret->cm_template_no_ocsp_check = entry->cm_template_no_ocsp_check;
1495bf
+	ret->cm_template_certificate_template =
1495bf
+		cm_store_maybe_strdup(ret, entry->cm_template_certificate_template);
1495bf
 	ret->cm_template_ns_certtype = cm_store_maybe_strdup(ret,
1495bf
 							     entry->cm_template_ns_certtype);
1495bf
 
1495bf
diff --git a/src/store-int.h b/src/store-int.h
1495bf
index 2d3a353..98b37e6 100644
1495bf
--- a/src/store-int.h
1495bf
+++ b/src/store-int.h
1495bf
@@ -144,6 +144,7 @@ struct cm_store_entry {
1495bf
 	char *cm_template_profile;
1495bf
 	char *cm_template_issuer;
1495bf
 	char *cm_template_ns_certtype;
1495bf
+	char *cm_template_certificate_template;
1495bf
 	unsigned int cm_template_no_ocsp_check: 1;
1495bf
 	/* A challenge password, which may be included (in cleartext form!) in
1495bf
 	 * a CSR. */
1495bf
diff --git a/src/tdbus.h b/src/tdbus.h
1495bf
index 496f2dd..7164f11 100644
1495bf
--- a/src/tdbus.h
1495bf
+++ b/src/tdbus.h
1495bf
@@ -110,6 +110,7 @@
1495bf
 #define CM_DBUS_PROP_TEMPLATE_PROFILE "template-profile"
1495bf
 #define CM_DBUS_PROP_TEMPLATE_ISSUER "template-issuer"
1495bf
 #define CM_DBUS_PROP_TEMPLATE_NS_CERTTYPE "template-ns-certtype"
1495bf
+#define CM_DBUS_PROP_TEMPLATE_MS_CERTIFICATE_TEMPLATE "template-ms-certificate-template"
1495bf
 #define CM_DBUS_SIGNAL_REQUEST_CERT_SAVED "SavedCertificate"
1495bf
 #define CM_DBUS_PROP_CA_PRESAVE_COMMAND "ca-presave-command"
1495bf
 #define CM_DBUS_PROP_CA_PRESAVE_UID "ca-presave-uid"
1495bf
diff --git a/src/tdbush.c b/src/tdbush.c
1495bf
index 631da3e..94bf793 100644
1495bf
--- a/src/tdbush.c
1495bf
+++ b/src/tdbush.c
1495bf
@@ -1568,6 +1568,14 @@ base_add_request(DBusConnection *conn, DBusMessage *msg,
1495bf
 		new_entry->cm_template_issuer = maybe_strdup(new_entry,
1495bf
 							     param->value.s);
1495bf
 	}
1495bf
+	param = cm_tdbusm_find_dict_entry(d,
1495bf
+					  CM_DBUS_PROP_TEMPLATE_MS_CERTIFICATE_TEMPLATE,
1495bf
+					  cm_tdbusm_dict_s);
1495bf
+	if (param != NULL) {
1495bf
+		// TODO check validity
1495bf
+		new_entry->cm_template_certificate_template = maybe_strdup(new_entry,
1495bf
+									   param->value.s);
1495bf
+	}
1495bf
 	param = cm_tdbusm_find_dict_entry(d,
1495bf
 					  CM_DBUS_PROP_TEMPLATE_CHALLENGE_PASSWORD,
1495bf
 					  cm_tdbusm_dict_s);
1495bf
@@ -3320,6 +3328,17 @@ request_modify(DBusConnection *conn, DBusMessage *msg,
1495bf
 					propname[n_propname++] = CM_DBUS_PROP_TEMPLATE_ISSUER;
1495bf
 				}
1495bf
 			} else
1495bf
+			if ((param->value_type == cm_tdbusm_dict_s) &&
1495bf
+			    (strcasecmp(param->key, CM_DBUS_PROP_TEMPLATE_MS_CERTIFICATE_TEMPLATE) == 0)) {
1495bf
+				talloc_free(entry->cm_template_certificate_template);
1495bf
+				// TODO check validity
1495bf
+				entry->cm_template_certificate_template =
1495bf
+					maybe_strdup(entry, param->value.s);
1495bf
+				if (n_propname + 2 < sizeof(propname) / sizeof(propname[0])) {
1495bf
+					propname[n_propname++] =
1495bf
+						CM_DBUS_PROP_TEMPLATE_MS_CERTIFICATE_TEMPLATE;
1495bf
+				}
1495bf
+			} else
1495bf
 			if ((param->value_type == cm_tdbusm_dict_s) &&
1495bf
 			    (strcasecmp(param->key, CM_DBUS_PROP_TEMPLATE_CHALLENGE_PASSWORD) == 0)) {
1495bf
 				talloc_free(entry->cm_template_challenge_password);
1495bf
@@ -6734,6 +6753,14 @@ cm_tdbush_iface_request(void)
1495bf
 								       offsetof(struct cm_store_entry, cm_template_issuer),
1495bf
 								       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1495bf
 								       NULL),
1495bf
+				     make_interface_item(cm_tdbush_interface_property,
1495bf
+							 make_property(CM_DBUS_PROP_TEMPLATE_MS_CERTIFICATE_TEMPLATE,
1495bf
+								       cm_tdbush_property_string,
1495bf
+								       cm_tdbush_property_readwrite,
1495bf
+								       cm_tdbush_property_char_p,
1495bf
+								       offsetof(struct cm_store_entry, cm_template_certificate_template),
1495bf
+								       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1495bf
+								       NULL),
1495bf
 				     make_interface_item(cm_tdbush_interface_property,
1495bf
 							 make_property(CM_DBUS_PROP_TEMPLATE_NS_CERTTYPE,
1495bf
 								       cm_tdbush_property_string,
1495bf
@@ -7179,7 +7206,7 @@ cm_tdbush_iface_request(void)
1495bf
 				     make_interface_item(cm_tdbush_interface_signal,
1495bf
 							 make_signal(CM_DBUS_SIGNAL_REQUEST_CERT_SAVED,
1495bf
 								     NULL),
1495bf
-							 NULL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));
1495bf
+							 NULL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));
1495bf
 	}
1495bf
 	return ret;
1495bf
 }
1495bf
diff --git a/tests/028-dbus/expected.out b/tests/028-dbus/expected.out
1495bf
index 93cc4d1..8a81a7f 100644
1495bf
--- a/tests/028-dbus/expected.out
1495bf
+++ b/tests/028-dbus/expected.out
1495bf
@@ -330,6 +330,7 @@ OK
1495bf
   <property name="template-ns-comment" type="s" access="readwrite"/>
1495bf
   <property name="template-profile" type="s" access="readwrite"/>
1495bf
   <property name="template-issuer" type="s" access="readwrite"/>
1495bf
+  <property name="template-ms-certificate-template" type="s" access="readwrite"/>
1495bf
   <property name="template-ns-certtype" type="s" access="readwrite"/>
1495bf
   <property name="template-challenge-password" type="s" access="readwrite"/>
1495bf
   <property name="template-challenge-password-file" type="s" access="readwrite"/>
1495bf
-- 
1495bf
2.14.4
1495bf