From 2ca5ce2bd34c58fcd1c39a2fb6eab8aa6ec581d3 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Thu, 13 May 2021 21:17:54 +0300 Subject: [PATCH] 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(); + } + } +}