Skip to content

Commit

Permalink
Strips invalid file attributes, leaving only those valid for the curr…
Browse files Browse the repository at this point in the history
…ent operating system before calling File.SetAttributes
  • Loading branch information
René Mihula committed Nov 22, 2024
1 parent 439dc46 commit dd726f2
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
57 changes: 57 additions & 0 deletions src/Zip/FileAttributeHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System.IO;
using Interop = System.Runtime.InteropServices;

namespace Ionic.Zip
{
/// <summary>
/// Helper class for file attribute operations.
/// </summary>
/// <example>
/// FileAttributes attributesToCheck = (FileAttributes)0x27; // Example attributes
/// FileAttributes validAttributes = FileAttributeHelper.StripInvalidAttributes(attributesToCheck);
/// <para/>
/// Console.WriteLine($"Original Attributes: {attributesToCheck}");
/// Console.WriteLine($"Valid Attributes: {validAttributes}");
/// </example>
public static class FileAttributeHelper
{
// Define a mask of valid attributes for Windows and non-Windows systems
private static readonly FileAttributes ValidAttributesWindows =
FileAttributes.ReadOnly |
FileAttributes.Hidden |
FileAttributes.System |
FileAttributes.Directory |
FileAttributes.Archive |
FileAttributes.Device |
FileAttributes.Normal |
FileAttributes.Temporary |
FileAttributes.SparseFile |
FileAttributes.ReparsePoint |
FileAttributes.Compressed |
FileAttributes.Offline |
FileAttributes.NotContentIndexed |
FileAttributes.Encrypted |
FileAttributes.IntegrityStream |
FileAttributes.NoScrubData;

private static readonly FileAttributes ValidAttributesNonWindows =
FileAttributes.ReadOnly |
FileAttributes.Hidden |
FileAttributes.System |
FileAttributes.Directory |
FileAttributes.Archive |
FileAttributes.Normal |
FileAttributes.Temporary;

/// <summary>
/// Strips invalid file attributes, leaving only those valid for the current operating system.
/// </summary>
/// <param name="attributes">The file attributes to be validated.</param>
/// <returns>A set of valid file attributes.</returns>
public static FileAttributes StripInvalidAttributes(FileAttributes attributes)
{
var validAttributes = Interop.RuntimeInformation.IsOSPlatform(Interop.OSPlatform.Windows) ? ValidAttributesWindows : ValidAttributesNonWindows;
return attributes & validAttributes;
}
}
}
5 changes: 4 additions & 1 deletion src/Zip/ZipEntry.Extract.cs
Original file line number Diff line number Diff line change
Expand Up @@ -900,7 +900,10 @@ void MoveFileInPlace(
// workitem 7926 - version made by OS can be zero (FAT) or 10
// (NTFS)
if ((_VersionMadeBy & 0xFF00) == 0x0a00 || (_VersionMadeBy & 0xFF00) == 0x0000)
File.SetAttributes(targetFileName, (FileAttributes) _ExternalFileAttrs);
{
var validAttrs = FileAttributeHelper.StripInvalidAttributes((FileAttributes)_ExternalFileAttrs);
File.SetAttributes(targetFileName, validAttrs);
}
}

void EnsurePassword(string password)
Expand Down

0 comments on commit dd726f2

Please sign in to comment.