Skip to content

Commit 9f9b2da

Browse files
Add ReDoS protection for regex matching. (#4124)
Add some minor nit fixes.
1 parent 9975d06 commit 9f9b2da

File tree

13 files changed

+28
-59
lines changed

13 files changed

+28
-59
lines changed

examples/Demo/Shared/Microsoft.FluentUI.AspNetCore.Components.xml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5302,9 +5302,6 @@
53025302
<member name="P:Microsoft.FluentUI.AspNetCore.Components.FluentInputFile.Module">
53035303
<summary />
53045304
</member>
5305-
<member name="P:Microsoft.FluentUI.AspNetCore.Components.FluentInputFile.DropOver">
5306-
<summary />
5307-
</member>
53085305
<member name="P:Microsoft.FluentUI.AspNetCore.Components.FluentInputFile.ClassValue">
53095306
<summary />
53105307
</member>
@@ -10308,6 +10305,11 @@
1030810305
Gets the default tooltip options.
1030910306
</summary>
1031010307
</member>
10308+
<member name="P:Microsoft.FluentUI.AspNetCore.Components.FluentTooltip.AriaLabel">
10309+
<summary>
10310+
Gets or sets the text used on aria-label attribute.
10311+
</summary>
10312+
</member>
1031110313
<member name="P:Microsoft.FluentUI.AspNetCore.Components.FluentTooltip.HideTooltipOnCursorLeave">
1031210314
<summary>
1031310315
Gets or sets the value indicating whether the library should close the tooltip if the cursor leaves the anchor and the tooltip.
@@ -15901,12 +15903,6 @@
1590115903
<member name="T:System.Text.RegularExpressions.Generated.Utilities">
1590215904
<summary>Helper methods used by generated <see cref="T:System.Text.RegularExpressions.Regex"/>-derived implementations.</summary>
1590315905
</member>
15904-
<member name="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout">
15905-
<summary>Default timeout value set in <see cref="T:System.AppContext"/>, or <see cref="F:System.Text.RegularExpressions.Regex.InfiniteMatchTimeout"/> if none was set.</summary>
15906-
</member>
15907-
<member name="F:System.Text.RegularExpressions.Generated.Utilities.s_hasTimeout">
15908-
<summary>Whether <see cref="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout"/> is non-infinite.</summary>
15909-
</member>
1591015906
<member name="F:System.Text.RegularExpressions.Generated.Utilities.s_ascii_20FF03FEFFFF87FEFFFF07">
1591115907
<summary>Supports searching for characters in or not in "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".</summary>
1591215908
</member>

src/Core/Components/Accordion/FluentAccordion.razor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ private async Task HandleOnAccordionChangedAsync(AccordionChangeEventArgs args)
5353
{
5454
if (args is not null)
5555
{
56-
var Id = args.ActiveId;
57-
if (Id is not null && items.TryGetValue(Id!, out FluentAccordionItem? item))
56+
var id = args.ActiveId;
57+
if (id is not null && items.TryGetValue(id!, out FluentAccordionItem? item))
5858
{
5959
item.Expanded = args.Expanded;
6060
await OnAccordionItemChange.InvokeAsync(item);
61-
await ActiveIdChanged.InvokeAsync(Id);
61+
await ActiveIdChanged.InvokeAsync(id);
6262
}
6363
}
6464
}

src/Core/Components/DataGrid/Columns/ColumnBase.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ protected void HandleKeyDown(FluentKeyCodeEventArgs e)
269269
/// <summary>
270270
/// Constructs an instance of <see cref="ColumnBase{TGridItem}" />.
271271
/// </summary>
272-
public ColumnBase()
272+
protected ColumnBase()
273273
{
274274
HeaderContent = RenderDefaultHeaderContent;
275275
HeaderTitleContent = RenderDefaultHeaderTitle;

src/Core/Components/Emojis/Emoji.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class Emoji : EmojiInfo
1717
/// Please use the constructor including parameters.
1818
/// </summary>
1919
/// <exception cref="ArgumentNullException"></exception>
20-
public Emoji() : this(string.Empty, EmojiSize.Size16, EmojiGroup.Flags, EmojiSkintone.Default, EmojiStyle.Flat, new byte[] { })
20+
public Emoji() : this(string.Empty, EmojiSize.Size16, EmojiGroup.Flags, EmojiSkintone.Default, EmojiStyle.Flat, Array.Empty<byte>())
2121
{
2222
throw new ArgumentNullException("Please use the constructor including parameters.");
2323
}

src/Core/Components/InputFile/FluentInputFile.razor.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ public FluentInputFile()
4141
/// <summary />
4242
private IJSObjectReference? Module { get; set; }
4343

44-
/// <summary />
45-
private bool DropOver { get; set; } = false;
46-
4744
/// <summary />
4845
protected string? ClassValue => new CssBuilder(Class)
4946
.AddClass("fluent-inputfile-container")

src/Core/Components/List/ListComponentBase.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ protected string? InternalValue
206206
public Expression<Func<IEnumerable<TOption>>>? SelectedOptionsExpression { get; set; }
207207

208208
/// <summary />
209-
public ListComponentBase()
209+
protected ListComponentBase()
210210
{
211211
_internalListContext = new(this);
212212

src/Core/Components/Overlay/FluentOverlay.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,6 @@ private async Task InvokeOverlayDisposeAsync()
305305
}
306306
}
307307

308-
[GeneratedRegex("^(?:#(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))")]
308+
[GeneratedRegex("^(?:#(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))", RegexOptions.None, matchTimeoutMilliseconds: 1000)] //Add timeout to prevent ReDoS
309309
private static partial Regex CheckRGBString();
310310
}

src/Core/Components/Tooltip/FluentTooltip.razor.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public partial class FluentTooltip : FluentComponentBase, IDisposable
4343
/// </summary>
4444
protected virtual TooltipGlobalOptions? GlobalOptions => TooltipService?.GlobalOptions;
4545

46-
4746
/// <summary>
4847
/// Gets or sets the text used on aria-label attribute.
4948
/// </summary>

src/Core/Components/TreeView/FluentTreeItem.razor.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -210,21 +210,22 @@ internal static RenderFragment GetFluentTreeItem(FluentTreeView owner, ITreeView
210210
{
211211
RenderFragment fluentTreeItem = builder =>
212212
{
213-
int i = 0;
214-
builder.OpenComponent<FluentTreeItem>(i++);
215-
builder.AddAttribute(i++, "Id", item.Id);
216-
builder.AddAttribute(i++, "Items", item.Items);
217-
builder.AddAttribute(i++, "Text", item.Text);
218-
builder.AddAttribute(i++, "InitiallySelected", owner.SelectedItem == item);
219-
builder.AddAttribute(i++, "Expanded", item.Expanded);
220-
builder.AddAttribute(i++, "Disabled", item.Disabled);
221-
builder.AddAttribute(i++, "IconCollapsed", item.IconCollapsed);
222-
builder.AddAttribute(i++, "IconExpanded", item.IconExpanded);
213+
//Don't use calculation or counter for building sequence numbers
214+
//See: https://learn.microsoft.com/en-us/aspnet/core/blazor/advanced-scenarios?view=aspnetcore-9.0&utm_source=chatgpt.com#manually-build-a-render-tree-rendertreebuilder
215+
builder.OpenComponent<FluentTreeItem>(0);
216+
builder.AddAttribute(1, "Id", item.Id);
217+
builder.AddAttribute(2, "Items", item.Items);
218+
builder.AddAttribute(3, "Text", item.Text);
219+
builder.AddAttribute(4, "InitiallySelected", owner.SelectedItem == item);
220+
builder.AddAttribute(5, "Expanded", item.Expanded);
221+
builder.AddAttribute(6, "Disabled", item.Disabled);
222+
builder.AddAttribute(7, "IconCollapsed", item.IconCollapsed);
223+
builder.AddAttribute(8, "IconExpanded", item.IconExpanded);
223224
builder.SetKey(item.Id);
224225

225226
if (owner.ItemTemplate != null)
226227
{
227-
builder.AddAttribute(i++, "ChildContent", owner.ItemTemplate(item));
228+
builder.AddAttribute(9, "ChildContent", owner.ItemTemplate(item));
228229
}
229230

230231
builder.CloseComponent();

src/Core/Components/Wizard/FluentWizard.razor.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ protected virtual async Task<FluentWizardStepChangeEventArgs> OnStepChangeHandle
238238
/// <summary />
239239
protected virtual async Task OnFinishHandlerAsync(MouseEventArgs e)
240240
{
241-
await this.FinishAsync(true);
241+
await FinishAsync(true);
242242
}
243243

244244
/// <summary>
@@ -332,10 +332,6 @@ private void SetCurrentStatusToStep(int stepIndex)
332332
{
333333
_steps[i].Status = WizardStepStatus.Current;
334334
}
335-
else if (i > stepIndex)
336-
{
337-
_steps[i].Status = WizardStepStatus.Next;
338-
}
339335
else
340336
{
341337
_steps[i].Status = WizardStepStatus.Next;

0 commit comments

Comments
 (0)