diff --git a/CHANGELOG.md b/CHANGELOG.md index 8247963..87cd12a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +Version 2.0.2 +- Fixed issue with no input for either custom or manual fields leading to a crash. +- Fixed issue with data for imported DigiCert fields renamed with a replacement character not syncing back to DigiCert. +- Fixed possible crash caused by importing DigiCert custom fields with "Anything" data type. + Version 2.0 - Added ability to sync custom fields from Keyfactor to DigiCert. diff --git a/digicert-metadata-sync/AddFieldsToKeyfactor.cs b/digicert-metadata-sync/AddFieldsToKeyfactor.cs index 363da96..44af1b6 100644 --- a/digicert-metadata-sync/AddFieldsToKeyfactor.cs +++ b/digicert-metadata-sync/AddFieldsToKeyfactor.cs @@ -31,15 +31,49 @@ public static Tuple> AddFieldsToKeyfactor(List newfields = new List(); - foreach (var metadatainstance in inputlist) + if (inputlist.Count != 0) { - if (noexistingfields == false) + foreach (var metadatainstance in inputlist) { - var fieldquery = from existingmetadatainstance in existingmetadatalist - where existingmetadatainstance.Name == metadatainstance.Name - select existingmetadatainstance; - // If field does not exist in Keyfactor, add it. - if (!fieldquery.Any()) + if (noexistingfields == false) + { + var fieldquery = from existingmetadatainstance in existingmetadatalist + where existingmetadatainstance.Name == metadatainstance.Name + select existingmetadatainstance; + // If field does not exist in Keyfactor, add it. + if (!fieldquery.Any()) + { + var addfieldrequest = new RestRequest(addfieldstokeyfactorurl); + addfieldrequest.AddHeader("Content-Type", "application/json"); + addfieldrequest.AddHeader("Accept", "application/json"); + addfieldrequest.AddHeader("x-keyfactor-api-version", "1"); + addfieldrequest.AddHeader("x-keyfactor-requested-with", "APIClient"); + var serializedfield = JsonConvert.SerializeObject(metadatainstance); + addfieldrequest.AddParameter("application/json", serializedfield, ParameterType.RequestBody); + RestResponse metadataresponse = new RestResponse(); + try + { + metadataresponse = addfieldsclient.Post(addfieldrequest); + newfields.Add(metadatainstance.Name); + ++totalnumberadded; + } + catch (HttpRequestException e) + { + Console.WriteLine(metadataresponse.Content); + throw e; + } + } + else + { + if (fieldquery.FirstOrDefault().DataType != metadatainstance.DataType) + { + //Throw error if datatype included in keyfactor does not match the digicert one. + NotSupportedException mismatchedtypes = new NotSupportedException(); + throw mismatchedtypes; + } + } + } + else { var addfieldrequest = new RestRequest(addfieldstokeyfactorurl); addfieldrequest.AddHeader("Content-Type", "application/json"); @@ -52,7 +86,6 @@ public static Tuple> AddFieldsToKeyfactor(List> AddFieldsToKeyfactor(List> returnvals = new Tuple>(totalnumberadded, newfields); diff --git a/digicert-metadata-sync/Helpers.cs b/digicert-metadata-sync/Helpers.cs index b44c192..77f7ff0 100644 --- a/digicert-metadata-sync/Helpers.cs +++ b/digicert-metadata-sync/Helpers.cs @@ -82,25 +82,28 @@ private static List convertlisttokf(List formattedlist = new List(); - foreach (ReadInMetadataField input in inputlist) + if (inputlist.Count != 0) { - KeyfactorMetadataInstanceSendoff formatinstance = new KeyfactorMetadataInstanceSendoff(); - if (input.KeyfactorMetadataFieldName == null || input.KeyfactorMetadataFieldName == "") + foreach (ReadInMetadataField input in inputlist) { - //If name is emtpy, use autocomplete. - formatinstance.Name = ReplaceAllWhiteSpaces(input.DigicertFieldName, replacementcharacter); - } - else - { - //Use user input preferred name. - formatinstance.Name = input.KeyfactorMetadataFieldName; - } + KeyfactorMetadataInstanceSendoff formatinstance = new KeyfactorMetadataInstanceSendoff(); + if (input.KeyfactorMetadataFieldName == null || input.KeyfactorMetadataFieldName == "") + { + //If name is emtpy, use autocomplete. + formatinstance.Name = ReplaceAllWhiteSpaces(input.DigicertFieldName, replacementcharacter); + } + else + { + //Use user input preferred name. + formatinstance.Name = input.KeyfactorMetadataFieldName; + } - formatinstance.AllowAPI = Convert.ToBoolean(input.KeyfactorAllowAPI); - formatinstance.Hint = input.KeyfactorHint; - formatinstance.DataType = TypeMatcher(input.KeyfactorDataType); - formatinstance.Description = input.KeyfactorDescription; - formattedlist.Add(formatinstance); + formatinstance.AllowAPI = Convert.ToBoolean(input.KeyfactorAllowAPI); + formatinstance.Hint = input.KeyfactorHint; + formatinstance.DataType = TypeMatcher(input.KeyfactorDataType); + formatinstance.Description = input.KeyfactorDescription; + formattedlist.Add(formatinstance); + } } return formattedlist; diff --git a/digicert-metadata-sync/MetadataSync.cs b/digicert-metadata-sync/MetadataSync.cs index 1e36077..389426b 100644 --- a/digicert-metadata-sync/MetadataSync.cs +++ b/digicert-metadata-sync/MetadataSync.cs @@ -103,11 +103,11 @@ public static void Main(string[] args) var kfdatatype = "String"; if (customdigicertmetadatafieldlist[i].data_type != null) { - kfdatatype = customdigicertmetadatafieldlist[i].data_type; + localkffieldinstance.KeyfactorDataType = customdigicertmetadatafieldlist[i].data_type; } else { - kfdatatype = "String"; + localkffieldinstance.KeyfactorDataType = "String"; } if (customdigicertmetadatafieldlist[i].label != null) { @@ -119,10 +119,22 @@ CURRENTLY REPLACING WITH "_-_" AS STAND IN FOR SPACE CHARACTER. localkffieldinstance.DigicertFieldName = customdigicertmetadatafieldlist[i].label; localkffieldinstance.KeyfactorMetadataFieldName = ReplaceAllWhiteSpaces(customdigicertmetadatafieldlist[i].label, replacementcharacter); } + else + { + localkffieldinstance.DigicertFieldName = ""; + localkffieldinstance.KeyfactorMetadataFieldName = ""; + } if (customdigicertmetadatafieldlist[i].description != null) { localkffieldinstance.KeyfactorDescription = customdigicertmetadatafieldlist[i].description; } + else + { + localkffieldinstance.KeyfactorDescription = "None."; + } + + localkffieldinstance.KeyfactorAllowAPI = "True"; + localkffieldinstance.KeyfactorHint = ""; //Other parameters like enrollment can be set here too. kfcustomfields.Add(localkffieldinstance); @@ -134,12 +146,20 @@ CURRENTLY REPLACING WITH "_-_" AS STAND IN FOR SPACE CHARACTER. // Converts blank fields etc and preps the data. var customfieldslst = "CustomFields"; kfcustomfields = config.GetSection(customfieldslst).Get>(); + if (kfcustomfields == null) + { + kfcustomfields = new List(); + } } //Adding metadata fields for the ID and the email of the requester from DigiCert. List kfmanualfields = new List(); var manualfieldslist = "ManualFields"; kfmanualfields = config.GetSection(manualfieldslist).Get>(); + if (kfmanualfields == null) + { + kfmanualfields = new List(); + } logger.LogDebug("Performed field conversion."); //Pulling list of existing metadata fields from Keyfactor for later comparison. @@ -323,12 +343,15 @@ CURRENTLY REPLACING WITH "_-_" AS STAND IN FOR SPACE CHARACTER. { Dictionary metadatapayload = new Dictionary(); metadatapayload["metadata_id"] = newfield.id.ToString(); - //Update payload with data - metadatapayload["value"] = kfstoredmetadata[sublookup.DigicertFieldName]; - var newserializedsyncfield = JsonConvert.SerializeObject(metadatapayload); - digicertnewfieldsrequest.AddParameter("application/json", newserializedsyncfield, ParameterType.RequestBody); - var digicertresponsenewfields = digicertnewfieldsclient.Post(digicertnewfieldsrequest); - datauploaded = true; + if (kfstoredmetadata.ContainsKey(sublookup.KeyfactorMetadataFieldName)) + { + metadatapayload["value"] = kfstoredmetadata[sublookup.KeyfactorMetadataFieldName]; + var newserializedsyncfield = JsonConvert.SerializeObject(metadatapayload); + digicertnewfieldsrequest.AddParameter("application/json", newserializedsyncfield, ParameterType.RequestBody); + var digicertresponsenewfields = digicertnewfieldsclient.Post(digicertnewfieldsrequest); + datauploaded = true; + } + } } } diff --git a/digicert-metadata-sync/Models/InternalClasses.cs b/digicert-metadata-sync/Models/InternalClasses.cs index c378a2e..0bdd25a 100644 --- a/digicert-metadata-sync/Models/InternalClasses.cs +++ b/digicert-metadata-sync/Models/InternalClasses.cs @@ -28,12 +28,12 @@ public class CustomDigicertMetadataInstance public class ReadInMetadataField { - public string DigicertFieldName { get; set; } - public string KeyfactorMetadataFieldName { get; set; } - public string KeyfactorDescription { get; set; } - public string KeyfactorDataType { get; set; } - public string KeyfactorHint { get; set; } - public string KeyfactorAllowAPI { get; set; } + public string DigicertFieldName { get; set; } = "local_test_nullx0"; + public string KeyfactorMetadataFieldName { get; set; } = "test_name_nullx0"; + public string KeyfactorDescription { get; set; } = "None."; + public string KeyfactorDataType { get; set; } = "string"; + public string KeyfactorHint { get; set; } = "None."; + public string KeyfactorAllowAPI { get; set; } = "True"; } public class KeyfactorMetadataInstanceSendoff