Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Improve case-sensitive handling #550

Merged
merged 2 commits into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Microsoft.Sbom.Api/Workflows/Helpers/FilesValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,17 @@ public FilesValidator(
continue;
}

if (file.Value == null)
{
// This generally means that we have case variations in the file names.
failures.Add(file.Key, new FileValidationResult
{
ErrorType = ErrorType.AdditionalFile,
Path = file.Key,
});
continue;
}

switch (file.Value.FileLocation)
{
case FileLocation.OnDisk:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ public class SbomParserBasedValidationWorkflow : IWorkflow<SbomParserBasedValida
private readonly ValidationResultGenerator validationResultGenerator;
private readonly IOutputWriter outputWriter;
private readonly IFileSystemUtils fileSystemUtils;
private readonly IOSUtils osUtils;

public SbomParserBasedValidationWorkflow(IRecorder recorder, ISignValidationProvider signValidationProvider, ILogger log, IManifestParserProvider manifestParserProvider, IConfiguration configuration, ISbomConfigProvider sbomConfigs, FilesValidator filesValidator, ValidationResultGenerator validationResultGenerator, IOutputWriter outputWriter, IFileSystemUtils fileSystemUtils)
public SbomParserBasedValidationWorkflow(IRecorder recorder, ISignValidationProvider signValidationProvider, ILogger log, IManifestParserProvider manifestParserProvider, IConfiguration configuration, ISbomConfigProvider sbomConfigs, FilesValidator filesValidator, ValidationResultGenerator validationResultGenerator, IOutputWriter outputWriter, IFileSystemUtils fileSystemUtils, IOSUtils osUtils)
{
this.recorder = recorder ?? throw new ArgumentNullException(nameof(recorder));
this.signValidationProvider = signValidationProvider ?? throw new ArgumentNullException(nameof(signValidationProvider));
Expand All @@ -56,6 +57,7 @@ public SbomParserBasedValidationWorkflow(IRecorder recorder, ISignValidationProv
this.validationResultGenerator = validationResultGenerator ?? throw new ArgumentNullException(nameof(validationResultGenerator));
this.outputWriter = outputWriter ?? throw new ArgumentNullException(nameof(outputWriter));
this.fileSystemUtils = fileSystemUtils ?? throw new ArgumentNullException(nameof(fileSystemUtils));
this.osUtils = osUtils ?? throw new ArgumentNullException(nameof(osUtils));
}

public async Task<bool> RunAsync()
Expand Down Expand Up @@ -197,9 +199,15 @@ private void LogIndividualFileResults(IEnumerable<FileValidationResult> validFai
return;
}

var caseSensitiveComment = validFailures.Any() && this.osUtils.IsCaseSensitiveOS() ?
string.Empty :
"\r\n Note: If the manifest file was originally created using a" +
"\r\n case-sensitive OS, you may also need to validate it" +
"\r\n using a case-sensitive OS.";

Console.WriteLine(string.Empty);
Console.WriteLine("------------------------------------------------------------");
Console.WriteLine("Individual file validation results");
Console.WriteLine($"Individual file validation results{caseSensitiveComment}");
Console.WriteLine("------------------------------------------------------------");
Console.WriteLine(string.Empty);

Expand Down
2 changes: 2 additions & 0 deletions src/Microsoft.Sbom.Common/IOSUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ public interface IOSUtils
StringComparer GetFileSystemStringComparer();

StringComparison GetFileSystemStringComparisonType();

bool IsCaseSensitiveOS();
}
4 changes: 2 additions & 2 deletions src/Microsoft.Sbom.Common/OSUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class OSUtils : IOSUtils

private readonly IEnvironmentWrapper environment;

private Dictionary<string, string> environmentVariables;
private readonly Dictionary<string, string> environmentVariables;

public OSUtils(ILogger logger, IEnvironmentWrapper environment)
{
Expand Down Expand Up @@ -77,7 +77,7 @@ public StringComparison GetFileSystemStringComparisonType()
return IsCaseSensitiveOS() ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase;
}

private bool IsCaseSensitiveOS()
public bool IsCaseSensitiveOS()
{
var currentOS = GetCurrentOSPlatform();
var isCaseSensitiveOS = currentOS == OSPlatform.Linux || currentOS == OSPlatform.OSX;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
var rootFileFilterMock = new DownloadedRootPathFilter(configurationMock.Object, fileSystemMock.Object, mockLogger.Object);
rootFileFilterMock.Init();

var osUtilsMock = new Mock<IOSUtils>(MockBehavior.Strict);

var hashValidator = new ConcurrentSha256HashValidator(FileHashesDictionarySingleton.Instance);
var enumeratorChannel = new EnumeratorChannel(mockLogger.Object);
var fileConverter = new SbomFileToFileInfoConverter(new FileTypeUtils());
Expand Down Expand Up @@ -178,7 +180,8 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
filesValidator,
validationResultGenerator,
outputWriterMock.Object,
fileSystemMock.Object);
fileSystemMock.Object,
osUtilsMock.Object);

var result = await validator.RunAsync();
Assert.IsTrue(result);
Expand All @@ -200,6 +203,7 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
configurationMock.VerifyAll();
signValidatorMock.VerifyAll();
fileSystemMock.VerifyAll();
osUtilsMock.VerifyAll();
}

[TestMethod]
Expand Down Expand Up @@ -291,6 +295,9 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
var rootFileFilterMock = new DownloadedRootPathFilter(configurationMock.Object, fileSystemMock.Object, mockLogger.Object);
rootFileFilterMock.Init();

var osUtilsMock = new Mock<IOSUtils>(MockBehavior.Strict);
osUtilsMock.Setup(x => x.IsCaseSensitiveOS()).Returns(false);

var hashValidator = new ConcurrentSha256HashValidator(FileHashesDictionarySingleton.Instance);
var enumeratorChannel = new EnumeratorChannel(mockLogger.Object);
var fileConverter = new SbomFileToFileInfoConverter(new FileTypeUtils());
Expand Down Expand Up @@ -318,7 +325,8 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
filesValidator,
validationResultGenerator,
outputWriterMock.Object,
fileSystemMock.Object);
fileSystemMock.Object,
osUtilsMock.Object);

var result = await validator.RunAsync();
Assert.IsFalse(result);
Expand All @@ -343,5 +351,6 @@ public async Task SbomParserBasedValidationWorkflowTests_ReturnsSuccessAndValida
configurationMock.VerifyAll();
signValidatorMock.VerifyAll();
fileSystemMock.VerifyAll();
osUtilsMock.VerifyAll();
}
}