/// <summary> /// Provides templating variable replacement for Config values /// </summary> /// <param name="template"></param> /// <param name="config"></param> /// <param name="forSuccess"></param> /// <returns></returns> private static string ParseValues(string template, CertRequestConfig config, bool forSuccess, bool url_encode) { // add all config properties to template vars var vars = new Dictionary <string, string>(); foreach (var prop in config.GetType().GetProperties()) { string value = prop.GetValue(config)?.ToString() ?? ""; if (url_encode) { value = WebUtility.UrlEncode(value); } else { value = value.Replace(@"\", @"\\"); } vars[prop.Name.ToLower()] = value; } // add special processing for these values vars["success"] = forSuccess ? "true" : "false"; vars["subjectalternativenames"] = string.Join(",", config.SubjectAlternativeNames ?? new string[] { config.PrimaryDomain }); // process the template and replace values return(Regex.Replace(template, @"\$(\w+)(?=[\W$])", m => { // replace var if it can be found, otherwise don't string key = m.Groups[1].Value.ToLower(); return vars.ContainsKey(key) ? vars[key] : "$" + key; }, RegexOptions.IgnoreCase)); }
/// <summary> /// Provides templating variable replacement for Config values /// </summary> /// <param name="template"></param> /// <param name="config"></param> /// <param name="forSuccess"></param> /// <returns></returns> private static string ParseValues(string template, CertRequestConfig config, bool forSuccess, bool url_encode) { // add all config properties to template vars var vars = new Dictionary <string, string>(); foreach (var prop in config.GetType().GetProperties()) { var objValue = prop.GetValue(config); var value = ""; if (objValue != null && objValue is Array) { foreach (var i in ((Array)objValue)) { value += i.ToString() + " "; } } else { value = objValue?.ToString() ?? ""; } if (url_encode) { value = WebUtility.UrlEncode(value); } else { value = value.Replace(@"\", @"\\"); } vars[prop.Name.ToLower()] = value; } // ChallengeType can be multiple values, use the first one present vars["challengetype"] = config.Challenges.FirstOrDefault()?.ChallengeType ?? vars["challengetype"]; // add special processing for these values vars["success"] = forSuccess ? "true" : "false"; vars["subjectalternativenames"] = string.Join(",", config.SubjectAlternativeNames ?? new string[] { config.PrimaryDomain }); // process the template and replace values return(Regex.Replace(template, @"\$(\w+)(?=[\W$])", m => { // replace var if it can be found, otherwise don't var key = m.Groups[1].Value.ToLower(); return vars.ContainsKey(key) ? vars[key] : "$" + key; }, RegexOptions.IgnoreCase)); }