Skip to content

Commit f1e2a09

Browse files
committed
Fix external authentication setting field identifiers
1 parent b402d4d commit f1e2a09

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

src/modules/Elsa.ExternalAuthentication/Services/ExtensionDescriptorValidator.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace Elsa.ExternalAuthentication.Services;
1010
public sealed class ExtensionDescriptorValidator
1111
{
1212
private static readonly Regex IdentifierPattern = new("^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$", RegexOptions.CultureInvariant);
13+
private static readonly Regex SettingFieldNamePattern = new("^[a-z][A-Za-z0-9]*$", RegexOptions.CultureInvariant);
1314
private static readonly HashSet<string> SupportedValueTypes = new(StringComparer.Ordinal)
1415
{
1516
"string", "secret", "boolean", "integer", "number", "uri", "string-array", "json"
@@ -79,7 +80,7 @@ private static void ValidateFields(string extensionType, IReadOnlyCollection<Set
7980
var names = new HashSet<string>(StringComparer.Ordinal);
8081
foreach (var field in fields)
8182
{
82-
if (!IsIdentifier(field.Name))
83+
if (!IsSettingFieldName(field.Name))
8384
failures.Add($"Extension '{extensionType}' has invalid field name '{field.Name}'.");
8485
else if (!names.Add(field.Name))
8586
failures.Add($"Extension '{extensionType}' defines field '{field.Name}' more than once.");
@@ -123,4 +124,7 @@ field.Validation.MaximumLength is < 0 ||
123124

124125
private static bool IsIdentifier(string? value) =>
125126
!string.IsNullOrWhiteSpace(value) && IdentifierPattern.IsMatch(value);
127+
128+
private static bool IsSettingFieldName(string? value) =>
129+
!string.IsNullOrWhiteSpace(value) && SettingFieldNamePattern.IsMatch(value);
126130
}

test/unit/Elsa.ExternalAuthentication.UnitTests/Extensibility/ExtensionConformanceTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Elsa.ExternalAuthentication.Contracts;
33
using Elsa.ExternalAuthentication.Models;
44
using Elsa.ExternalAuthentication.Options;
5+
using Elsa.ExternalAuthentication.Policies;
56
using Elsa.ExternalAuthentication.Services;
67

78
namespace Elsa.ExternalAuthentication.UnitTests.Extensibility;
@@ -80,6 +81,23 @@ public void DescriptorValidatorRejectsMismatchedUnsafeAndIncompleteMetadata()
8081
Assert.Contains("custom-editor", exception.Message);
8182
}
8283

84+
[Fact]
85+
public void DescriptorValidatorAcceptsLowerCamelCaseSettingFieldNames()
86+
{
87+
var descriptor = new ExtensionDescriptorValidator().Validate(new CreateUserUnlinkedIdentityPolicy());
88+
89+
Assert.Contains(descriptor.Fields, field => field.Name == "defaultRoleIds");
90+
}
91+
92+
[Fact]
93+
public void DescriptorValidatorKeepsExtensionTypesLowercaseAndStable()
94+
{
95+
var exception = Assert.Throws<InvalidOperationException>(() =>
96+
new ExtensionDescriptorValidator().Validate(new ConformanceAdapter("InvalidType")));
97+
98+
Assert.Contains("stable identifier", exception.Message);
99+
}
100+
83101
[Fact]
84102
public async Task SettingsMigrationRunsAdapterOwnedForwardStepsAndRejectsUnsupportedVersions()
85103
{

0 commit comments

Comments
 (0)