Better validation of C# class names in RazorCompiler

This commit is contained in:
Steve Sanderson 2018-01-30 15:31:23 +00:00
parent f88dd6c822
commit cc053ddbbf
2 changed files with 7 additions and 5 deletions

View File

@ -9,7 +9,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.CodeDom.Compiler;
namespace Microsoft.AspNetCore.Blazor.Build.Core.RazorCompilation namespace Microsoft.AspNetCore.Blazor.Build.Core.RazorCompilation
{ {
@ -18,9 +18,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Core.RazorCompilation
/// </summary> /// </summary>
public class RazorCompiler public class RazorCompiler
{ {
// TODO: Relax this to allow for whatever C# allows private static CodeDomProvider _csharpCodeDomProvider = CodeDomProvider.CreateProvider("c#");
private static Regex ClassNameRegex
= new Regex("^[a-z][a-z0-9_]*$", RegexOptions.IgnoreCase);
/// <summary> /// <summary>
/// Writes C# source code representing Blazor components defined by Razor files. /// Writes C# source code representing Blazor components defined by Razor files.
@ -150,12 +148,15 @@ namespace Microsoft.AspNetCore.Blazor.Build.Core.RazorCompilation
// Use the filename as class name // Use the filename as class name
var inputBasename = Path.GetFileNameWithoutExtension(inputFilePathRelative); var inputBasename = Path.GetFileNameWithoutExtension(inputFilePathRelative);
if (!ClassNameRegex.IsMatch(inputBasename)) if (!IsValidClassName(inputBasename))
{ {
throw new RazorCompilerException($"Invalid name '{inputBasename}'. The name must be valid for a C# class name."); throw new RazorCompilerException($"Invalid name '{inputBasename}'. The name must be valid for a C# class name.");
} }
return (resultNamespace, inputBasename); return (resultNamespace, inputBasename);
} }
private static bool IsValidClassName(string name)
=> _csharpCodeDomProvider.IsValidIdentifier(name);
} }
} }

View File

@ -29,6 +29,7 @@
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" />
<PackageReference Include="Mono.Cecil" Version="0.10.0-beta7" /> <PackageReference Include="Mono.Cecil" Version="0.10.0-beta7" />
<PackageReference Include="System.CodeDom" Version="4.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>