Skip to content

Commit bca5bc7

Browse files
authored
Valid HTML Input name in FormInputElementPart (#17567)
1 parent dbc9048 commit bca5bc7

File tree

4 files changed

+48
-8
lines changed

4 files changed

+48
-8
lines changed

src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormInputElementPartDisplayDriver.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.Localization;
22
using OrchardCore.ContentManagement.Display.ContentDisplay;
33
using OrchardCore.ContentManagement.Display.Models;
4+
using OrchardCore.ContentManagement.Utilities;
45
using OrchardCore.DisplayManagement.Views;
56
using OrchardCore.Forms.Models;
67
using OrchardCore.Forms.ViewModels;
@@ -35,8 +36,17 @@ public override async Task<IDisplayResult> UpdateAsync(FormInputElementPart part
3536
{
3637
context.Updater.ModelState.AddModelError(Prefix, nameof(viewModel.Name), S["A value is required for Name."]);
3738
}
39+
else
40+
{
41+
var safeName = viewModel.Name.GetSafeHTMLInputName();
42+
43+
if (viewModel.Name != safeName)
44+
{
45+
context.Updater.ModelState.AddModelError(Prefix, nameof(viewModel.Name), S["A Name contains invalid characters."]);
46+
}
47+
}
3848

39-
part.Name = viewModel.Name?.Trim();
49+
part.Name = viewModel.Name;
4050
part.ContentItem.DisplayText = part.Name;
4151

4252
return Edit(part, context);

src/OrchardCore.Modules/OrchardCore.Forms/Migrations.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,21 @@ await _contentDefinitionManager.AlterPartDefinitionAsync("FormPart", part => par
2323

2424
await _contentDefinitionManager.AlterTypeDefinitionAsync("Form", type => type
2525
.WithPart("TitlePart", part => part
26-
.WithSettings(new TitlePartSettings { RenderTitle = false })
26+
.WithSettings(new TitlePartSettings
27+
{
28+
RenderTitle = false,
29+
})
2730
.WithPosition("0")
2831
)
29-
.WithPart("FormElementPart", part =>
30-
part.WithPosition("1")
32+
.WithPart("FormElementPart", part => part
33+
.WithPosition("1")
34+
)
35+
.WithPart("FormPart", part => part
36+
.WithPosition("2")
37+
)
38+
.WithPart("FlowPart", part => part
39+
.WithPosition("3")
3140
)
32-
.WithPart("FormPart")
33-
.WithPart("FlowPart")
3441
.Stereotype("Widget"));
3542

3643
// FormElement

src/OrchardCore.Modules/OrchardCore.Forms/Views/Items/FormInputElementPart.Fields.Edit.cshtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
@model FormInputElementPartEditViewModel
44

55
<div class="@Orchard.GetWrapperClasses()">
6-
<label asp-for="Name" class="@Orchard.GetLabelClasses()">@T["Name"]</label>
6+
<label asp-for="Name" class="@Orchard.GetLabelClasses()">@T["HTML Name"]</label>
77
<div class="@Orchard.GetEndClasses()">
88
<input asp-for="Name" type="text" class="form-control content-preview-text content-caption-text" />
9-
<span class="hint">@T["The name to render on this form element."]</span>
9+
<span class="hint">@T["The valid characters for the HTML input name attribute are letters (a-z, A-Z), digits (0-9), hyphen (-), underscore (_), period (.), and square brackets ([ ])."]</span>
1010
</div>
1111
</div>

src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Utilities/StringExtensions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,27 @@ public static string ReplaceLastOccurrence(this string source, string searchedVa
385385

386386
return source.Remove(lastIndex, searchedValue.Length).Insert(lastIndex, replacedValue);
387387
}
388+
389+
private const string _validHtmlInputNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.[]";
390+
391+
public static string GetSafeHTMLInputName(this string input)
392+
{
393+
ArgumentException.ThrowIfNullOrEmpty(input);
394+
395+
var inputSpan = input.AsSpan();
396+
397+
var sanitizedName = new StringBuilder(inputSpan.Length);
398+
399+
foreach (var c in inputSpan)
400+
{
401+
if (!_validHtmlInputNameCharacters.Contains(c))
402+
{
403+
continue;
404+
}
405+
406+
sanitizedName.Append(c);
407+
}
408+
409+
return sanitizedName.ToString();
410+
}
388411
}

0 commit comments

Comments
 (0)