Compare commits

..

4 Commits

Author SHA1 Message Date
Matt Nadareski
f83dbee1b1 Fix version for getopts 2026-09-21 09:23:13 -04:00
Matt Nadareski
d44873b37b Enable versions in publish script 2026-09-21 09:21:54 -04:00
Matt Nadareski
bbe12c5358 Handle edge case of scanning temp directory (fixes #423) 2026-09-20 08:24:29 -04:00
Matt Nadareski
9f49f910ea Use correct README path for the future 2026-09-04 08:56:49 -04:00
4 changed files with 93 additions and 25 deletions

View File

@@ -46,7 +46,7 @@
</ItemGroup>
<ItemGroup>
<None Include="../README.md" Pack="true" PackagePath="" />
<None Include="README.md" Pack="true" PackagePath="" />
</ItemGroup>
<ItemGroup>

View File

@@ -46,6 +46,22 @@ namespace BinaryObjectScanner
#endregion
#region Static Variables
/// <summary>
/// Path to the temporary directory
/// </summary>
/// <remarks>Value has trailing directory separators trimmed</remarks>
private static readonly string TempFilePath = Path.GetTempPath().TrimEnd('\\', '/');
/// <summary>
/// Template for determining if a file is a temporary extracted path
/// </summary>
/// <remarks>Value has trailing directory separators trimmed and the GUID value itself does not matter</remarks>
private static readonly string TempFilePathWithGuid = Path.Combine(TempFilePath, Guid.NewGuid().ToString()).TrimEnd('\\', '/');
#endregion
/// <summary>
/// Constructor
/// </summary>
@@ -123,10 +139,6 @@ namespace BinaryObjectScanner
// Checkpoint
_fileProgress?.Report(new ProtectionProgress(null, depth, 0, null));
// Temp variables for reporting
string tempFilePath = Path.GetTempPath();
string tempFilePathWithGuid = Path.Combine(tempFilePath, Guid.NewGuid().ToString());
// Loop through each path and get the returned values
var protections = new ProtectionDictionary();
foreach (string path in paths)
@@ -152,13 +164,7 @@ namespace BinaryObjectScanner
string file = files[i];
// Get the reportable file name
string reportableFileName = file;
if (reportableFileName.StartsWith(tempFilePath))
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
reportableFileName = reportableFileName[tempFilePathWithGuid.Length..];
#else
reportableFileName = reportableFileName.Substring(tempFilePathWithGuid.Length);
#endif
string reportableFileName = GetReportableFileName(file);
// Checkpoint
_fileProgress?.Report(new ProtectionProgress(reportableFileName, depth, i / (float)files.Count, "Checking file" + (file != reportableFileName ? " from archive" : string.Empty)));
@@ -193,13 +199,7 @@ namespace BinaryObjectScanner
else if (File.Exists(path))
{
// Get the reportable file name
string reportableFileName = path;
if (reportableFileName.StartsWith(tempFilePath))
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
reportableFileName = reportableFileName[tempFilePathWithGuid.Length..];
#else
reportableFileName = reportableFileName.Substring(tempFilePathWithGuid.Length);
#endif
string reportableFileName = GetReportableFileName(path);
// Checkpoint
_fileProgress?.Report(new ProtectionProgress(reportableFileName, depth, 0, "Checking file" + (path != reportableFileName ? " from archive" : string.Empty)));
@@ -517,6 +517,44 @@ namespace BinaryObjectScanner
};
}
/// <summary>
/// Get the reportable file name by determining if the file was
/// likely extracted as a part of the scanning run.
/// </summary>
/// <param name="path">File path to check</param>
/// <returns>Trimmed file path if it should be an extracted file, the full path as passed in otherwise</returns>
/// <remarks>
/// This will be a false positive if intentionally scanning a path that
/// fits the pattern of '%TEMP%/{GUID}/{file}'.
private static string GetReportableFileName(string path)
{
// If the file is not in the temp directory
if (!path.StartsWith(TempFilePath))
return path;
// If the filename isn't longer than the template path
if (path.Length < TempFilePathWithGuid.Length)
return path;
// Check if we're in a GUID subdirectory
string possibleGuid = path.Substring(TempFilePath.Length + 1, 36);
#if NET20 || NET35
if (System.Text.RegularExpressions.Regex.IsMatch(possibleGuid, @"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"))
#else
if (Guid.TryParse(possibleGuid, out _))
#endif
{
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
return path[TempFilePathWithGuid.Length..];
#else
return path.Substring(TempFilePathWithGuid.Length);
#endif
}
// Otherwise, return the path as given
return path;
}
#endregion
}
}

View File

@@ -13,7 +13,9 @@ USE_ALL=false
INCLUDE_DEBUG=false
NO_BUILD=false
NO_ARCHIVE=false
while getopts "udba" OPTION; do
HAS_VERSION=false
VERSION="NONE"
while getopts "udbav:" OPTION; do
case $OPTION in
u)
USE_ALL=true
@@ -27,6 +29,10 @@ while getopts "udba" OPTION; do
a)
NO_ARCHIVE=true
;;
v)
HAS_VERSION=true
VERSION=${OPTARG}
;;
*)
echo "Invalid option provided"
exit 1
@@ -46,6 +52,7 @@ echo " Use all frameworks (-u) $USE_ALL"
echo " Include debug builds (-d) $INCLUDE_DEBUG"
echo " No build (-b) $NO_BUILD"
echo " No archive (-a) $NO_ARCHIVE"
echo " Version (-v) $HAS_VERSION ($VERSION)"
echo " "
# Create the build matrix arrays
@@ -139,10 +146,18 @@ if [ $NO_ARCHIVE = false ]; then
# Only include Debug if set
if [ $INCLUDE_DEBUG = true ]; then
cd $BUILD_FOLDER/ProtectionScan/bin/Debug/${FRAMEWORK}/${RUNTIME}/publish/
zip -r $BUILD_FOLDER/ProtectionScan_${FRAMEWORK}_${RUNTIME}_debug.zip .
if [ $HAS_VERSION = true ]; then
zip -r $BUILD_FOLDER/ProtectionScan_${VERSION}_${FRAMEWORK}_${RUNTIME}_debug.zip .
else
zip -r $BUILD_FOLDER/ProtectionScan_${FRAMEWORK}_${RUNTIME}_debug.zip .
fi
fi
cd $BUILD_FOLDER/ProtectionScan/bin/Release/${FRAMEWORK}/${RUNTIME}/publish/
zip -r $BUILD_FOLDER/ProtectionScan_${FRAMEWORK}_${RUNTIME}_release.zip .
if [ $HAS_VERSION = true ]; then
zip -r $BUILD_FOLDER/ProtectionScan_${VERSION}_${FRAMEWORK}_${RUNTIME}_release.zip .
else
zip -r $BUILD_FOLDER/ProtectionScan_${FRAMEWORK}_${RUNTIME}_release.zip .
fi
done
done

View File

@@ -22,7 +22,11 @@ param(
[Parameter(Mandatory = $false)]
[Alias("NoArchive")]
[switch]$NO_ARCHIVE
[switch]$NO_ARCHIVE,
[Parameter(Mandatory = $false, ValueFromPipeline = $true)]
[Alias("BuildVersion")]
[string]$BUILD_VERSION
)
# Set the current directory as a variable
@@ -37,6 +41,7 @@ Write-Host " Use all frameworks (-UseAll) $USE_ALL"
Write-Host " Include debug builds (-IncludeDebug) $INCLUDE_DEBUG"
Write-Host " No build (-NoBuild) $NO_BUILD"
Write-Host " No archive (-NoArchive) $NO_ARCHIVE"
Write-Host " Version (-BuildVersion) $BUILD_VERSION"
Write-Host " "
# Create the build matrix arrays
@@ -123,11 +128,21 @@ if (!$NO_ARCHIVE.IsPresent) {
# Only include Debug if set
if ($INCLUDE_DEBUG.IsPresent) {
Set-Location -Path $BUILD_FOLDER\ProtectionScan\bin\Debug\${FRAMEWORK}\${RUNTIME}\publish\
7z a -tzip $BUILD_FOLDER\ProtectionScan_${FRAMEWORK}_${RUNTIME}_debug.zip *
if ($BUILD_VERSION -ne $null) {
7z a -tzip $BUILD_FOLDER\ProtectionScan_${BUILD_VERSION}_${FRAMEWORK}_${RUNTIME}_debug.zip *
}
else {
7z a -tzip $BUILD_FOLDER\ProtectionScan_${FRAMEWORK}_${RUNTIME}_debug.zip *
}
}
Set-Location -Path $BUILD_FOLDER\ProtectionScan\bin\Release\${FRAMEWORK}\${RUNTIME}\publish\
7z a -tzip $BUILD_FOLDER\ProtectionScan_${FRAMEWORK}_${RUNTIME}_release.zip *
if ($BUILD_VERSION -ne $null) {
7z a -tzip $BUILD_FOLDER\ProtectionScan_${BUILD_VERSION}_${FRAMEWORK}_${RUNTIME}_release.zip *
}
else {
7z a -tzip $BUILD_FOLDER\ProtectionScan_${FRAMEWORK}_${RUNTIME}_release.zip *
}
}
}