Skip to content

Commit 02c6ed7

Browse files
authored
fix: Add validation format check for SDK key (#163)
1 parent c201487 commit 02c6ed7

File tree

2 files changed

+80
-11
lines changed

2 files changed

+80
-11
lines changed

pkgs/shared/common/src/Helpers/ValidationUtils.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,36 @@ namespace LaunchDarkly.Sdk.Helpers
99
public static class ValidationUtils
1010
{
1111
private static readonly Regex ValidCharsRegex = new Regex("^[-a-zA-Z0-9._]+\\z");
12+
private const int MaxSdkKeyLength = 8192;
1213

1314
/// <summary>
14-
/// Validates that a string is non-empty, not too longer for our systems, and only contains
15+
/// Validates that a string does not contain invalid characters and is not too long for our systems.
16+
/// </summary>
17+
/// <param name="sdkKey">the SDK key to validate.</param>
18+
/// <returns>True if the SDK key format is valid, otherwise false.</returns>
19+
public static bool IsValidSdkKeyFormat(string sdkKey)
20+
{
21+
// For offline mode, we allow a null or empty SDK key and it is not invalid.
22+
if (string.IsNullOrEmpty(sdkKey))
23+
{
24+
return true;
25+
}
26+
27+
if (sdkKey.Length > MaxSdkKeyLength)
28+
{
29+
return false;
30+
}
31+
32+
if (!ValidCharsRegex.IsMatch(sdkKey))
33+
{
34+
return false;
35+
}
36+
37+
return true;
38+
}
39+
40+
/// <summary>
41+
/// Validates that a string is non-empty, not too long for our systems, and only contains
1542
/// alphanumeric characters, hyphens, periods, and underscores.
1643
/// </summary>
1744
/// <param name="s">the string to validate.</param>

pkgs/shared/common/test/Helpers/ValidationUtilsTest.cs

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,60 @@ namespace LaunchDarkly.Sdk.Helpers
44
{
55
public class ValidationUtilsTest
66
{
7+
[Theory]
8+
[InlineData(null)]
9+
[InlineData("")]
10+
public void IsValidSdkKeyFormat_EmptyOrNullKey_ReturnsTrue(string key)
11+
{
12+
Assert.True(ValidationUtils.IsValidSdkKeyFormat(key));
13+
}
14+
15+
[Theory]
16+
[InlineData("sdk-key-123")]
17+
[InlineData("sdk.key.123")]
18+
[InlineData("sdk_key_123")]
19+
[InlineData("SDKKEY123")]
20+
public void IsValidSdkKeyFormat_ValidKey_ReturnsTrue(string key)
21+
{
22+
Assert.True(ValidationUtils.IsValidSdkKeyFormat(key));
23+
}
24+
725
[Fact]
8-
public void ValidateStringValue()
26+
public void IsValidSdkKeyFormat_TooLongKey_ReturnsFalseWithError()
27+
{
28+
var longKey = new string('a', 8193); // Creates a string longer than MaxSdkKeyLength (8192)
29+
Assert.False(ValidationUtils.IsValidSdkKeyFormat(longKey));
30+
}
31+
32+
[Theory]
33+
[InlineData("sdk key")] // Contains space
34+
[InlineData("sdk#key")] // Contains special character
35+
[InlineData("sdk/key")] // Contains slash
36+
[InlineData("sdk\nkey")] // Contains newline
37+
public void IsValidSdkKeyFormat_InvalidCharacters_ReturnsFalseWithError(string key)
38+
{
39+
Assert.False(ValidationUtils.IsValidSdkKeyFormat(key));
40+
}
41+
42+
[Theory]
43+
[InlineData("bad-\n")] // Contains newline
44+
[InlineData("bad-\t")] // Contains tab
45+
[InlineData("###invalid")] // Contains special characters
46+
[InlineData("")] // Empty string
47+
[InlineData("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFwhoops")] // Too long
48+
[InlineData("#@$%^&")] // Invalid characters
49+
public void ValidateStringValue_Invalid_ReturnsErrorMessage(string input)
50+
{
51+
Assert.NotNull(ValidationUtils.ValidateStringValue(input));
52+
}
53+
54+
[Theory]
55+
[InlineData("a-Az-Z0-9._-")]
56+
[InlineData("valid-string-123")]
57+
[InlineData("VALIDSTRING")]
58+
public void ValidateStringValue_Valid_ReturnsNull(string input)
959
{
10-
Assert.NotNull(ValidationUtils.ValidateStringValue("bad-\n"));
11-
Assert.NotNull(ValidationUtils.ValidateStringValue("bad-\t"));
12-
Assert.NotNull(ValidationUtils.ValidateStringValue("###invalid"));
13-
Assert.NotNull(ValidationUtils.ValidateStringValue(""));
14-
Assert.NotNull(
15-
ValidationUtils.ValidateStringValue(
16-
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFwhoops"));
17-
Assert.NotNull(ValidationUtils.ValidateStringValue("#@$%^&"));
18-
Assert.Null(ValidationUtils.ValidateStringValue("a-Az-Z0-9._-"));
60+
Assert.Null(ValidationUtils.ValidateStringValue(input));
1961
}
2062

2163
[Fact]

0 commit comments

Comments
 (0)