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 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);
                }
            }
        }
Example #3
0
        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
                {
                    Key          = connectionString.Name,
                    Raw          = connectionString.ConnectionString,
                    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 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);
        }
Example #5
0
        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;
                }
            }
        }