diff --git a/src/NuGet.Core/NuGet.Protocol/Plugins/PluginDiscoverer.cs b/src/NuGet.Core/NuGet.Protocol/Plugins/PluginDiscoverer.cs index cc7ce269a60..9f45ce792a4 100644 --- a/src/NuGet.Core/NuGet.Protocol/Plugins/PluginDiscoverer.cs +++ b/src/NuGet.Core/NuGet.Protocol/Plugins/PluginDiscoverer.cs @@ -192,14 +192,11 @@ internal List GetPluginsInNuGetPluginPaths() if (File.Exists(path)) { FileInfo fileInfo = new FileInfo(path); - if (fileInfo.Name.StartsWith("nuget-plugin-", StringComparison.CurrentCultureIgnoreCase)) + if (IsValidPluginFile(fileInfo)) { // A DotNet tool plugin - if (IsValidPluginFile(fileInfo)) - { - PluginFile pluginFile = new PluginFile(fileInfo.FullName, new Lazy(() => PluginFileState.Valid), requiresDotnetHost: false); - pluginFiles.Add(pluginFile); - } + PluginFile pluginFile = new PluginFile(fileInfo.FullName, new Lazy(() => PluginFileState.Valid), requiresDotnetHost: false); + pluginFiles.Add(pluginFile); } else { @@ -274,6 +271,11 @@ private static List GetNetToolsPluginsInDirectory(string directoryPa /// internal static bool IsValidPluginFile(FileInfo fileInfo) { + if (!fileInfo.Name.StartsWith("nuget-plugin-", StringComparison.Ordinal)) + { + return false; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { return fileInfo.Extension.Equals(".exe", StringComparison.OrdinalIgnoreCase) || diff --git a/test/NuGet.Core.Tests/NuGet.Protocol.Tests/Plugins/PluginDiscovererTests.cs b/test/NuGet.Core.Tests/NuGet.Protocol.Tests/Plugins/PluginDiscovererTests.cs index c2e792f67d9..bbcd4b3a76f 100644 --- a/test/NuGet.Core.Tests/NuGet.Protocol.Tests/Plugins/PluginDiscovererTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Protocol.Tests/Plugins/PluginDiscovererTests.cs @@ -519,13 +519,34 @@ public void GetPluginsInNuGetPluginPaths_NoEnvironmentVariables_ReturnsNoPlugins Assert.Empty(plugins); } + [PlatformTheory(Platform.Windows)] + [InlineData("nuget-plugin-auth.exe", true)] + [InlineData("nuget-plugin-AUTH.bat", true)] + [InlineData("nuGet-plugin-auth.exe", false)] + [InlineData("NUGet-PLUGIN-auth.bat", false)] + public void IsValidPlugin_IsCaseSensitive(string file, bool isValid) + { + // Arrange + using TestDirectory testDirectory = TestDirectory.Create(); + var workingPath = testDirectory.Path; + var pluginFilePath = Path.Combine(workingPath, file); + File.Create(pluginFilePath); + var fileInfo = new FileInfo(pluginFilePath); + + // Act + bool result = PluginDiscoverer.IsValidPluginFile(fileInfo); + + // Assert + Assert.Equal(isValid, result); + } + [PlatformFact(Platform.Windows)] public void IsValidPluginFile_ExeFile_ReturnsTrue() { // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var pluginFilePath = Path.Combine(workingPath, "plugin.exe"); + var pluginFilePath = Path.Combine(workingPath, "nuget-plugin-.exe"); File.Create(pluginFilePath); var fileInfo = new FileInfo(pluginFilePath); @@ -542,7 +563,7 @@ public void IsValidPluginFile_Windows_NonExecutableFile_ReturnsFalse() // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var nonPluginFilePath = Path.Combine(workingPath, "plugin.txt"); + var nonPluginFilePath = Path.Combine(workingPath, "nuget-plugin-.txt"); File.Create(nonPluginFilePath); var fileInfo = new FileInfo(nonPluginFilePath); @@ -559,7 +580,7 @@ public void IsValidPluginFile_Unix_ExecutableFile_ReturnsTrue() // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var pluginFilePath = Path.Combine(workingPath, "plugin"); + var pluginFilePath = Path.Combine(workingPath, "nuget-plugin-"); File.Create(pluginFilePath).Dispose(); #if NET8_0_OR_GREATER @@ -585,7 +606,7 @@ public void IsExecutable_FileIsExecutable_ReturnsTrue() // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var pluginFilePath = Path.Combine(workingPath, "plugin"); + var pluginFilePath = Path.Combine(workingPath, "nuget-plugin-"); File.Create(pluginFilePath); // Set execute permissions @@ -606,7 +627,7 @@ public void IsExecutable_FileIsNotExecutable_ReturnsFalse() // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var pluginFilePath = Path.Combine(workingPath, "plugin"); + var pluginFilePath = Path.Combine(workingPath, "nuget-plugin-"); File.Create(pluginFilePath); // Remove execute permissions @@ -627,7 +648,7 @@ public void IsExecutable_FileWithSpace_ReturnsTrue() // Arrange using TestDirectory testDirectory = TestDirectory.Create(); var workingPath = testDirectory.Path; - var pluginFilePath = Path.Combine(workingPath, "plugin with space"); + var pluginFilePath = Path.Combine(workingPath, "nuget-plugin- with space"); File.Create(pluginFilePath).Dispose(); // Set execute permissions