From 4ab01ee707da60d04451e780001c806cbf3e19ae Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 11 May 2021 14:33:16 +0300 Subject: [PATCH 1/3] CLI: Validate project name for template creation --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 7 +++++- .../Abp/Cli/Utils/ProjectNameValidator.cs | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 83cce36fce..d34420d50c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -61,6 +61,11 @@ namespace Volo.Abp.Cli.Commands ); } + if (ProjectNameValidator.IsContainsBannedProjectName(projectName) || ProjectNameValidator.IsContainsControlOrSurrogateCharacter(projectName)) + { + throw new CliUsageException("The project name is not valid! Please specify a different name."); + } + Logger.LogInformation("Creating your project..."); Logger.LogInformation("Project name: " + projectName); @@ -554,4 +559,4 @@ namespace Volo.Abp.Cli.Commands } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs new file mode 100644 index 0000000000..99b3dca4a2 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Volo.Abp.Cli.Utils +{ + public static class ProjectNameValidator + { + private static readonly List BannedProjectNames = new() + { + "MyCompanyName.MyProjectName", "MyProjectName", + "/", "?", ":", "&", "\\", "*", "\"", "<", ">", "|", "#", "%", + "CON", "AUX", "PRN", "COM1", "LPT2", ".." + }; + + public static bool IsContainsBannedProjectName(string projectName) + { + return BannedProjectNames.Contains(projectName); + } + + public static bool IsContainsControlOrSurrogateCharacter(string projectName) + { + return projectName.Any(chr => char.IsControl(chr) || char.IsSurrogate(chr)); + } + } +} \ No newline at end of file From 8b9c65ec9992063851713604ca4f84d6d4f567e4 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 11 May 2021 18:16:22 +0300 Subject: [PATCH 2/3] CLI: Rename IsContainsBannedProjectName to IsContainsBannedWord --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs | 2 +- .../Volo/Abp/Cli/Utils/ProjectNameValidator.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index d34420d50c..2bd1e12b4d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -61,7 +61,7 @@ namespace Volo.Abp.Cli.Commands ); } - if (ProjectNameValidator.IsContainsBannedProjectName(projectName) || ProjectNameValidator.IsContainsControlOrSurrogateCharacter(projectName)) + if (ProjectNameValidator.IsContainsBannedWord(projectName) || ProjectNameValidator.IsContainsControlOrSurrogateCharacter(projectName)) { throw new CliUsageException("The project name is not valid! Please specify a different name."); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs index 99b3dca4a2..57ee28a0cb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.Cli.Utils "CON", "AUX", "PRN", "COM1", "LPT2", ".." }; - public static bool IsContainsBannedProjectName(string projectName) + public static bool IsContainsBannedWord(string projectName) { return BannedProjectNames.Contains(projectName); } From 2ca5ce2bd34c58fcd1c39a2fb6eab8aa6ec581d3 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Thu, 13 May 2021 21:17:54 +0300 Subject: [PATCH 3/3] project name validation (refactor) #8959 --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 4 +- .../Abp/Cli/Utils/ProjectNameValidator.cs | 97 +++++++++++++++++-- .../Abp/Cli/ProjectNameValidation_Tests.cs | 75 ++++++++++++++ 3 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectNameValidation_Tests.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 2bd1e12b4d..c8757e1252 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -61,9 +61,9 @@ namespace Volo.Abp.Cli.Commands ); } - if (ProjectNameValidator.IsContainsBannedWord(projectName) || ProjectNameValidator.IsContainsControlOrSurrogateCharacter(projectName)) + if (!ProjectNameValidator.IsValid(projectName)) { - throw new CliUsageException("The project name is not valid! Please specify a different name."); + throw new CliUsageException("The project name is invalid! Please specify a different name."); } Logger.LogInformation("Creating your project..."); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs index 57ee28a0cb..daf13da410 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs @@ -1,25 +1,102 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Volo.Abp.Cli.Utils { public static class ProjectNameValidator { - private static readonly List BannedProjectNames = new() + private static readonly string[] IllegalProjectNames = new[] { - "MyCompanyName.MyProjectName", "MyProjectName", - "/", "?", ":", "&", "\\", "*", "\"", "<", ">", "|", "#", "%", - "CON", "AUX", "PRN", "COM1", "LPT2", ".." + "MyCompanyName.MyProjectName", + "MyProjectName", + "CON", //Windows doesn't accept these names as file name + "AUX", + "PRN", + "COM1", + "LPT2" }; - - public static bool IsContainsBannedWord(string projectName) + + private static readonly char[] IllegalChars = new[] + { + '/', + '?', + ':', + '&', + '\\', + '*', + '\'', + '<', + '>', + '|', + '#', + '%', + }; + + private static bool HasParentDirectoryString(string projectName) { - return BannedProjectNames.Contains(projectName); + return projectName.Contains(".."); } - - public static bool IsContainsControlOrSurrogateCharacter(string projectName) + + private static bool HasIllegalChar(string projectName) + { + foreach (var illegalWord in IllegalChars) + { + if (projectName.Contains(illegalWord)) + { + return false; + } + } + + return true; + } + + private static bool HasSurrogateOrControlChar(string projectName) { return projectName.Any(chr => char.IsControl(chr) || char.IsSurrogate(chr)); } + + private static bool IsIllegalProjectName(string projectName) + { + foreach (var illegalProjectName in IllegalProjectNames) + { + if (projectName.Equals(illegalProjectName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return true; + } + + public static bool IsValid(string projectName) + { + if (projectName == null) + { + throw new CliUsageException("Project name cannot be empty!"); + } + + if (HasIllegalChar(projectName)) + { + return false; + } + + if (HasSurrogateOrControlChar(projectName)) + { + return false; + } + + if (HasParentDirectoryString(projectName)) + { + return false; + } + + if (IsIllegalProjectName(projectName)) + { + return false; + } + + return true; + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectNameValidation_Tests.cs b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectNameValidation_Tests.cs new file mode 100644 index 0000000000..2e6d0074bd --- /dev/null +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectNameValidation_Tests.cs @@ -0,0 +1,75 @@ +using System.IO; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands; +using Volo.Abp.Cli.ProjectModification; +using Xunit; + +namespace Volo.Abp.Cli +{ + public class ProjectNameValidation_Tests : AbpCliTestBase + { + private readonly NewCommand _newCommand; + + public ProjectNameValidation_Tests() + { + _newCommand = GetRequiredService(); + } + + [Fact] + public async Task IllegalProjectName_Test() + { + var illegalProjectNames = new[] + { + "MyCompanyName.MyProjectName", + "MyProjectName", + "CON", //Windows doesn't accept these names as file name + "AUX", + "PRN", + "COM1", + "LPT2" + }; + + foreach (var illegalProjectName in illegalProjectNames) + { + var args = new CommandLineArgs("new", illegalProjectName); + await _newCommand.ExecuteAsync(args).ShouldThrowAsync(); + } + } + + [Fact] + public async Task ContainsIllegalChar_Test() + { + var illegalChars = new[] + { + '/', + '?', + ':', + '&', + '\\', + '*', + '\'', + '<', + '>', + '|', + '#', + '%', + }; + + foreach (var illegalChar in illegalChars) + { + var args = new CommandLineArgs("new", "Test" + illegalChar); + await _newCommand.ExecuteAsync(args).ShouldThrowAsync(); + } + } + + [Fact] + public async Task ParentDirectoryContain_Test() + { + + var args = new CommandLineArgs("new", "Test..Test"); + await _newCommand.ExecuteAsync(args).ShouldThrowAsync(); + } + } +}