mirror of https://github.com/abpframework/abp.git
3 changed files with 164 additions and 12 deletions
@ -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<string> 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; |
|||
} |
|||
} |
|||
} |
|||
@ -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<NewCommand>(); |
|||
} |
|||
|
|||
[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<CliUsageException>(); |
|||
} |
|||
} |
|||
|
|||
[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<CliUsageException>(); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task ParentDirectoryContain_Test() |
|||
{ |
|||
|
|||
var args = new CommandLineArgs("new", "Test..Test"); |
|||
await _newCommand.ExecuteAsync(args).ShouldThrowAsync<CliUsageException>(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue