public static ConfigurationConnectionStringModel Create(ConnectionStringSettings connectionString) { if (connectionString == null) { throw new ArgumentNullException("connectionString"); } var resultItem = new ConfigurationConnectionStringModel { Key = connectionString.Name, Raw = connectionString.ConnectionString, ProviderName = connectionString.ProviderName }; if (!string.IsNullOrEmpty(connectionString.ConnectionString)) { resultItem.Details = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase); try { IDictionary<string, object> connectionStringKeyValuePairs = DetermineConnectionStringKeyValuePairs(connectionString, resultItem.ProviderName, resultItem) ?? DetermineConnectionStringKeyValuePairs(connectionString); AddConnectionStringDetailsToResult(connectionStringKeyValuePairs, resultItem); } catch (Exception e) { resultItem.Details.Add("GENERAL FAILURE", e.Message); } } return resultItem; }
private static IDictionary<string, object> DetermineConnectionStringKeyValuePairs( ConnectionStringSettings connectionString, string providerName, ConfigurationConnectionStringModel resultItem) { IDictionary<string, object> connectionStringKeyValuePairs = null; try { if (string.IsNullOrEmpty(providerName)) { resultItem.Details.Add("WARNING", "ProviderName is empty, therefore assuming ProviderName=System.Data.SqlClient"); providerName = "System.Data.SqlClient"; } var connectionFactory = DbProviderFactories.GetFactory(providerName); var connectionStringBuilder = connectionFactory.CreateConnectionStringBuilder(); if (connectionStringBuilder != null) { try { connectionStringBuilder.ConnectionString = connectionString.ConnectionString; var keys = connectionStringBuilder.Keys; if (keys != null) { connectionStringKeyValuePairs = new Dictionary<string, object>(); foreach (string key in keys) { connectionStringKeyValuePairs.Add(key, connectionStringBuilder[key]); } } } catch (ArgumentException argumentException) { resultItem.Details.Add("ERROR", "Connection string is invalid for ProviderName=" + providerName + " : " + argumentException.Message); } } else { resultItem.Details.Add("ERROR", "Connection string builder could not be created"); } } catch (Exception exception) { resultItem.Details.Add("FATAL", exception.Message); } return connectionStringKeyValuePairs; }
private void AnnomalizeConnectionStringPassword(IDictionary<string, object> connectionDetails, ConfigurationConnectionStringModel model) { foreach (var key in keysToAnnomalizePassword) { if (connectionDetails.ContainsKey(key)) { var password = connectionDetails[key].ToString(); if (!string.IsNullOrEmpty(password)) { connectionDetails[key] = PasswordHash; model.Raw = model.Raw.Replace(password, PasswordHash); } return; } } }
private IEnumerable<ConfigurationConnectionStringModel> ProcessConnectionString(ConnectionStringSettingsCollection connectionStrings) { if (connectionStrings == null) { return null; } var result = new List<ConfigurationConnectionStringModel>(); foreach (ConnectionStringSettings connectionString in connectionStrings) { var resultItem = new ConfigurationConnectionStringModel(); resultItem.Key = connectionString.Name; resultItem.Raw = connectionString.ConnectionString; resultItem.ProviderName = connectionString.ProviderName; try { var providerName = string.IsNullOrEmpty(connectionString.ProviderName) ? "System.Data.SqlClient" : connectionString.ProviderName; var connectionFactory = DbProviderFactories.GetFactory(providerName); var connectionStringBuilder = connectionFactory.CreateConnectionStringBuilder(); if (connectionStringBuilder != null) { connectionStringBuilder.ConnectionString = connectionString.ConnectionString; var connectionDetails = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase); var keys = connectionStringBuilder.Keys; if (keys != null) { foreach (string key in keys) { connectionDetails.Add(key, connectionStringBuilder[key]); } resultItem.Details = connectionDetails; AnnomalizeConnectionStringPassword(connectionDetails, resultItem); } } } catch (Exception e) { resultItem.Details = new Dictionary<string, object> { { "Error", e.Message } }; } result.Add(resultItem); } return result.Count > 0 ? result : null; }
private static void AddConnectionStringDetailsToResult( IEnumerable<KeyValuePair<string, object>> connectionStringKeyValuePairs, ConfigurationConnectionStringModel resultItem) { foreach (var connectionStringKeyValue in connectionStringKeyValuePairs) { resultItem.Details.Add(connectionStringKeyValue.Key, connectionStringKeyValue.Value); if (connectionStringKeyValue.Value == null) { continue; } var currentValue = connectionStringKeyValue.Value.ToString(); if (string.IsNullOrEmpty(currentValue)) { // no need to replace an empty value continue; } string obfuscatedValue; if (ObfuscatedConnectionStringValues.TryGetValue(connectionStringKeyValue.Key, out obfuscatedValue)) { // this key must be obfuscated resultItem.Details[connectionStringKeyValue.Key] = obfuscatedValue; resultItem.Raw = resultItem.Raw.Replace(currentValue, obfuscatedValue); } } }