internal static SFSessionProperties parseConnectionString(String connectionString, SecureString password) { logger.Info("Start parsing connection string."); SFSessionProperties properties = new SFSessionProperties(); string[] propertyEntry = connectionString.Split(';'); foreach (string keyVal in propertyEntry) { if (keyVal.Length > 0) { string[] token = keyVal.Split(new string[] { "=" }, StringSplitOptions.None); if (token.Length == 2) { try { SFSessionProperty p = (SFSessionProperty)Enum.Parse( typeof(SFSessionProperty), token[0].ToUpper()); properties.Add(p, token[1]); logger.Info($"Connection property: {p}, value: {(p == SFSessionProperty.PASSWORD ? "XXXXXXXX" : token[1])}"); } catch (ArgumentException e) { logger.Warn($"Property {token[0]} not found ignored."); } } else { string invalidStringDetail = String.Format("Invalid kay value pair {0}", keyVal); SnowflakeDbException e = new SnowflakeDbException(SFError.INVALID_CONNECTION_STRING, new object[] { invalidStringDetail }); logger.Error("Invalid string.", e); throw e; } } } if (password != null) { properties[SFSessionProperty.PASSWORD] = new NetworkCredential(string.Empty, password).Password; } checkSessionProperties(properties); // compose host value if not specified if (!properties.ContainsKey(SFSessionProperty.HOST)) { string hostName = String.Format("%s.snowflakecomputing.com", properties[SFSessionProperty.ACCOUNT]); properties.Add(SFSessionProperty.HOST, hostName); logger.Info($"Compose host name: {hostName}"); } return(properties); }
private static void checkSessionProperties(SFSessionProperties properties) { foreach (SFSessionProperty sessionProperty in Enum.GetValues(typeof(SFSessionProperty))) { // if required property, check if exists in the dictionary if (IsRequired(sessionProperty, properties) && !properties.ContainsKey(sessionProperty)) { SnowflakeDbException e = new SnowflakeDbException(SFError.MISSING_CONNECTION_PROPERTY, sessionProperty); logger.Error("Missing connetion property", e); throw e; } // add default value to the map string defaultVal = sessionProperty.GetAttribute <SFSessionPropertyAttr>().defaultValue; if (defaultVal != null && !properties.ContainsKey(sessionProperty)) { logger.Debug($"Sesssion property {sessionProperty} set to default value: {defaultVal}"); properties.Add(sessionProperty, defaultVal); } } }
internal static SFSessionProperties parseConnectionString(String connectionString, SecureString password) { logger.Info("Start parsing connection string."); SFSessionProperties properties = new SFSessionProperties(); string[] propertyEntry = connectionString.Split(';'); foreach (string keyVal in propertyEntry) { if (keyVal.Length > 0) { string[] tokens = keyVal.Split(new string[] { "=" }, StringSplitOptions.None); if (tokens.Length != 2) { // https://docs.microsoft.com/en-us/dotnet/api/system.data.oledb.oledbconnection.connectionstring // To include an equal sign (=) in a keyword or value, it must be preceded // by another equal sign. For example, in the hypothetical connection // string "key==word=value" : // the keyword is "key=word" and the value is "value". int currentIndex = 0; int singleEqualIndex = -1; while (currentIndex <= keyVal.Length) { currentIndex = keyVal.IndexOf("=", currentIndex); if (-1 == currentIndex) { // No '=' found break; } if ((currentIndex < (keyVal.Length - 1)) && ('=' != keyVal[currentIndex + 1])) { if (0 > singleEqualIndex) { // First single '=' encountered singleEqualIndex = currentIndex; currentIndex++; } else { // Found another single '=' which is not allowed singleEqualIndex = -1; break; } } else { // skip the doubled one currentIndex += 2; } } if ((singleEqualIndex > 0) && (singleEqualIndex < keyVal.Length - 1)) { // Split the key/value at the right index and deduplicate '==' tokens = new string[2]; tokens[0] = keyVal.Substring(0, singleEqualIndex).Replace("==", "="); tokens[1] = keyVal.Substring( singleEqualIndex + 1, keyVal.Length - (singleEqualIndex + 1)).Replace("==", "=");; } else { // An equal sign was not doubled or something else happened // making the connection invalid string invalidStringDetail = String.Format("Invalid key value pair {0}", keyVal); SnowflakeDbException e = new SnowflakeDbException(SFError.INVALID_CONNECTION_STRING, new object[] { invalidStringDetail }); logger.Error("Invalid string.", e); throw e; } } try { SFSessionProperty p = (SFSessionProperty)Enum.Parse( typeof(SFSessionProperty), tokens[0].ToUpper()); properties.Add(p, tokens[1]); logger.Info($"Connection property: {p}, value: {(secretProps.Contains(p) ? "XXXXXXXX" : tokens[1])}"); } catch (ArgumentException e) { logger.Warn($"Property {tokens[0]} not found ignored.", e); } } } if (password != null) { properties[SFSessionProperty.PASSWORD] = new NetworkCredential(string.Empty, password).Password; } checkSessionProperties(properties); // compose host value if not specified if (!properties.ContainsKey(SFSessionProperty.HOST) || (0 == properties[SFSessionProperty.HOST].Length)) { string hostName = String.Format("{0}.snowflakecomputing.com", properties[SFSessionProperty.ACCOUNT]); // Remove in case it's here but empty properties.Remove(SFSessionProperty.HOST); properties.Add(SFSessionProperty.HOST, hostName); logger.Info($"Compose host name: {hostName}"); } return(properties); }