Skip to content

Commit

Permalink
Merge pull request #969 from NuGet/master
Browse files Browse the repository at this point in the history
[ReleasePrep][2020.03.09] FI of master into dev
  • Loading branch information
loic-sharma committed Mar 16, 2021
2 parents ceedab1 + 376ac06 commit c2678b3
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,8 @@ private void CleanDownloadData(DownloadData data)

foreach (var id in data.Keys.ToList())
{
var isValidId = id.Length <= PackageIdValidator.MaxPackageIdLength && PackageIdValidator.IsValidPackageId(id);
var isValidId = id.Length <= PackageIdValidator.MaxPackageIdLength
&& PackageIdValidator.IsValidPackageIdWithTimeout(id);
if (!isValidId)
{
invalidIdCount++;
Expand Down
29 changes: 29 additions & 0 deletions src/NuGet.Services.AzureSearch/PackageIdValidator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace NuGet.Services.AzureSearch
{
// TODO: Delete this copy of the PackageIdValidator.
// Tracked by: https://github.com/NuGet/Engineering/issues/3669
// Forked from: https://github.com/NuGet/NuGet.Client/blob/18863da5be3dc8c7315f4416df1bc9ef96cb7446/src/NuGet.Core/NuGet.Packaging/PackageCreation/Utility/PackageIdValidator.cs
public static class PackageIdValidator
{
public const int MaxPackageIdLength = 100;
private static readonly Regex IdRegex = new Regex(pattern: @"^\w+([.-]\w+)*$",
options: RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant,
matchTimeout: TimeSpan.FromSeconds(15));

public static bool IsValidPackageIdWithTimeout(string packageId)
{
if (packageId == null)
{
throw new ArgumentNullException(nameof(packageId));
}
return IdRegex.IsMatch(packageId);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ public IndexOperation Autocomplete(AutocompleteRequest request)
{
packageId = terms.First();
if (packageId.Length <= PackageIdValidator.MaxPackageIdLength
&& PackageIdValidator.IsValidPackageId(packageId))
&& PackageIdValidator.IsValidPackageIdWithTimeout(packageId))
{
return true;
}
Expand Down Expand Up @@ -183,7 +183,7 @@ private static bool HasInvalidParameters(SearchRequest request, string packageTy
// Requests with bad parameters yield no results. For the package type case, by specification a package type
// valid characters are the same as a package ID.
return request.Skip > MaximumSkip
|| (packageType != null && !PackageIdValidator.IsValidPackageId(packageType));
|| (packageType != null && !PackageIdValidator.IsValidPackageIdWithTimeout(packageType));
}

private static bool PagedToFirstItem(SearchRequest request)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ private static void ApplyPaging(SearchParameters searchParameters, SearchRequest

// Verify that the package type only has valid package ID characters so we don't need to worry about
// escaping quotes and such.
if (packageType != null && PackageIdValidator.IsValidPackageId(packageType))
if (packageType != null && PackageIdValidator.IsValidPackageIdWithTimeout(packageType))
{
filterString += $" and {IndexFields.Search.FilterablePackageTypes}/any(p: p eq '{packageType.ToLowerInvariant()}')";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ private static IEnumerable<string> ProcessFieldValues(QueryField field, IEnumera
private static bool IsId(string query)
{
return query.Length <= PackageIdValidator.MaxPackageIdLength
&& PackageIdValidator.IsValidPackageId(query);
&& PackageIdValidator.IsValidPackageIdWithTimeout(query);
}

private static bool IsIdWithSeparator(string query)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<Compile Include="Models\CommittedDocumentFacts.cs" />
<Compile Include="AuxiliaryFiles\OwnerDataClientFacts.cs" />
<Compile Include="DependencyInjectionExtensionsFacts.cs" />
<Compile Include="PackageIdValidatorFacts.cs" />
<Compile Include="SearchIndexActionBuilderFacts.cs" />
<Compile Include="Auxiliary2AzureSearch\UpdateOwnersCommandFacts.cs" />
<Compile Include="Auxiliary2AzureSearch\DataSetComparerFacts.cs" />
Expand Down
168 changes: 168 additions & 0 deletions tests/NuGet.Services.AzureSearch.Tests/PackageIdValidatorFacts.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using Xunit;

namespace NuGet.Services.AzureSearch
{
// TODO: Delete this copy of the PackageIdValidator.
// Tracked by: https://github.com/NuGet/Engineering/issues/3669
// Forked from: https://github.com/NuGet/NuGet.Client/blob/18863da5be3dc8c7315f4416df1bc9ef96cb7446/test/NuGet.Core.Tests/NuGet.Packaging.Test/PackageIdValidatorTest.cs#L8
public class PackageIdValidatorTest
{
[Fact]
public void EmptyIsNotValid()
{
// Arrange
string packageId = "";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void NullThrowsException()
{
// Arrange
string packageId = null;

// Act & Assert
Assert.Throws<ArgumentNullException>(paramName: "packageId",
testCode: () => PackageIdValidator.IsValidPackageIdWithTimeout(packageId));
}

[Fact]
public void AlphaNumericIsValid()
{
// Arrange
string packageId = "42This1Is4You";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.True(isValid);
}

[Fact]
public void MultipleDotSeparatorsAllowed()
{
// Arrange
string packageId = "I.Like.Writing.Unit.Tests";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.True(isValid);
}

[Fact]
public void NumbersAndWordsDotSeparatedAllowd()
{
// Arrange
string packageId = "1.2.3.4.Uno.Dos.Tres.Cuatro";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.True(isValid);
}

[Fact]
public void UnderscoreDotAndDashSeparatorsAreValid()
{
// Arrange
string packageId = "Nu_Get.Core-IsCool";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.True(isValid);
}

[Fact]
public void NonAlphaNumericUnderscoreDotDashIsInvalid()
{
// Arrange
string packageId = "ILike*Asterisks";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void ConsecutiveSeparatorsNotAllowed()
{
// Arrange
string packageId = "I_.Like.-Separators";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void StartingWithSeparatorsNotAllowed()
{
// Arrange
string packageId = "-StartWithSeparator";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void EndingWithSeparatorsNotAllowed()
{
// Arrange
string packageId = "StartWithSeparator.";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void DotToolsIsNotAllowed()
{
// Arrange
string packageId = ".tools";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.False(isValid);
}

[Fact]
public void IsValidPackageId_PackageIdWithTwoUnderscores_Success()
{
// Arrange
string packageId = "Hello__World";

// Act
bool isValid = PackageIdValidator.IsValidPackageIdWithTimeout(packageId);

// Assert
Assert.True(isValid);
}
}
}

0 comments on commit c2678b3

Please sign in to comment.