Blob Blame History Raw
Backported from master.

From de03df73802956143fd1fa743706b803938a610f Mon Sep 17 00:00:00 2001
From: Jan Cholasta <jcholast@redhat.com>
Date: Tue, 18 Nov 2014 13:25:08 +0000
Subject: [PATCH] Allow overriding parameter values in Dogtag request approval

---
 src/certmonger-dogtag-ipa-renew-agent-submit.8.in |  8 +++
 src/dogtag.c                                      | 61 ++++++++++++++++++++++-
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/src/certmonger-dogtag-ipa-renew-agent-submit.8.in b/src/certmonger-dogtag-ipa-renew-agent-submit.8.in
index 45129d4818aad0d91960a1bfe35a79e4e2406f02..d6d0c4c122014ac77e04ab8c3fc4a2742dfb8bdb 100644
--- a/src/certmonger-dogtag-ipa-renew-agent-submit.8.in
+++ b/src/certmonger-dogtag-ipa-renew-agent-submit.8.in
@@ -17,6 +17,7 @@ dogtag-ipa-renew-agent-submit -E EE-URL -A AGENT-URL
 [-D serial (decimal)]
 [-S state]
 [-T profile]
+[-O param=value]
 [-v]
 [csrfile]
 
@@ -125,6 +126,13 @@ The name of the type of certificate which the client should request from the CA
 if it is not renewing a certificate (per the \fB-s\fR option above).  The
 default value is \fBcaServerCert\fP.
 .TP
+\fB-O\fR param=value
+An additional parameter to pass to the server when approving the signing
+request using the agent's credentials.  By default, any server-supplied default
+settings are applied.  This option can be used either to override a
+server-supplied default setting, or to supply one which would otherwise have
+not been used.
+.TP
 \fB-v\fR
 Increases the logging level.  Use twice for more logging.  This option is mainly
 useful for troubleshooting.
diff --git a/src/dogtag.c b/src/dogtag.c
index 700fe7f516a54f0581d94068e9066de9e4621f5d..6bd284327ffc1ab29d32deb8529fc5ef69314295 100644
--- a/src/dogtag.c
+++ b/src/dogtag.c
@@ -76,6 +76,7 @@ help(const char *cmd)
 		"\t[-D serial (decimal)]\n"
 		"\t[-S state]\n"
 		"\t[-T profile]\n"
+		"\t[-O param=value]\n"
 		"\t[-v]\n"
 		"\t[-N]\n"
 		"\t[-V dogtag_version]\n"
@@ -140,6 +141,11 @@ main(int argc, char **argv)
 	const char *sslcert = NULL, *sslkey = NULL;
 	const char *sslpin = NULL, *sslpinfile = NULL;
 	const char *host = NULL, *csr = NULL, *serial = NULL, *template = NULL;
+	struct {
+		char *name;
+		char *value;
+	} *options = NULL;
+	size_t num_options = 0, j;
 	const char *dogtag_version = NULL;
 	char *ipaconfig = NULL, *savedstate = NULL;
 	char *p, *q, *params = NULL, *params2 = NULL;
@@ -178,7 +184,7 @@ main(int argc, char **argv)
 
 	savedstate = getenv(CM_SUBMIT_COOKIE_ENV);
 
-	while ((c = getopt(argc, argv, "E:A:d:n:i:C:c:k:p:P:s:D:S:T:vV:NR")) != -1) {
+	while ((c = getopt(argc, argv, "E:A:d:n:i:C:c:k:p:P:s:D:S:T:O:vV:NR")) != -1) {
 		switch (c) {
 		case 'E':
 			eeurl = optarg;
@@ -220,6 +226,26 @@ main(int argc, char **argv)
 		case 'T':
 			template = optarg;
 			break;
+		case 'O':
+			if (strchr(optarg, '=') == NULL) {
+				printf(_("Profile params (-O) must be in the form of param=value.\n"));
+				help(argv[0]);
+				return CM_SUBMIT_STATUS_UNCONFIGURED;
+			}
+			options = realloc(options,
+					  ++num_options * sizeof(*options));
+			if (options == NULL) {
+				printf(_("Out of memory.\n"));
+				return CM_SUBMIT_STATUS_UNCONFIGURED;
+			}
+			options[num_options - 1].name = strdup(optarg);
+			if (options[num_options - 1].name == NULL) {
+				printf(_("Out of memory.\n"));
+				return CM_SUBMIT_STATUS_UNCONFIGURED;
+			}
+			*strchr(options[num_options - 1].name, '=') = '\0';
+			options[num_options - 1].value = strchr(optarg, '=') + 1;
+			break;
 		case 'v':
 			verbose++;
 			break;
@@ -374,6 +400,18 @@ main(int argc, char **argv)
 		printf(_("No profile/template (-T) given, and no default known.\n"));
 		missing_args = TRUE;
 	}
+	if (options != NULL) {
+		if (agenturl == NULL) {
+			printf(_("No agent URL (-A) given, and no default "
+				 "known.\n"));
+			missing_args = TRUE;
+		}
+		if (!can_agent) {
+			printf(_("No agent credentials specified, and no "
+				 "default known.\n"));
+			missing_args = TRUE;
+		}
+	}
 	if (missing_args) {
 		help(argv[0]);
 		return CM_SUBMIT_STATUS_UNCONFIGURED;
@@ -544,12 +582,33 @@ main(int argc, char **argv)
 			for (i = 0;
 			     (defaults != NULL) && (defaults[i] != NULL);
 			     i++) {
+				/* Check if this default is one of the
+				 * paramters we've been explicitly provided. */
+				for (j = 0; j < num_options; j++) {
+					if (strcmp(defaults[i]->name,
+						   options[j].name) == 0) {
+						break;
+					}
+				}
+				/* If we have a non-default value for it, skip
+				 * this default. */
+				if (j < num_options) {
+					continue;
+				}
 				p = cm_submit_u_url_encode(defaults[i]->name);
 				q = cm_submit_u_url_encode(defaults[i]->value);
 				params2 = talloc_asprintf(ctx,
 							  "%s&%s=%s",
 							  params2, p, q);
 			};
+			/* Add parameters specified on command line */
+			for (j = 0; j < num_options; j++) {
+				p = cm_submit_u_url_encode(options[j].name);
+				q = cm_submit_u_url_encode(options[j].value);
+				params2 = talloc_asprintf(ctx,
+							  "%s&%s=%s",
+							  params2, p, q);
+			}
 			break;
 		case op_none:
 		case op_submit:
-- 
2.1.0