You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
3.5 KiB

10 years ago
using Alphaleonis.Win32.Filesystem;
using System.Security.AccessControl;
namespace Security2
{
public partial class FileSystemAccessRule2
{
#region Properties
private FileSystemAccessRule fileSystemAccessRule;
private string fullName;
private bool inheritanceEnabled;
private string inheritedFrom;
public string Name { get { return System.IO.Path.GetFileName(fullName); } }
public string FullName { get { return fullName; } set { fullName = value; } }
public bool InheritanceEnabled { get { return inheritanceEnabled; } set { inheritanceEnabled = value; } }
public string InheritedFrom { get { return inheritedFrom; } set { inheritedFrom = value; } }
public AccessControlType AccessControlType { get { return fileSystemAccessRule.AccessControlType; } }
public FileSystemRights2 AccessRights { get { return (FileSystemRights2)fileSystemAccessRule.FileSystemRights; } }
public IdentityReference2 Account { get { return fileSystemAccessRule.IdentityReference; } }
public InheritanceFlags InheritanceFlags { get { return fileSystemAccessRule.InheritanceFlags; } }
public bool IsInherited { get { return fileSystemAccessRule.IsInherited; } }
public PropagationFlags PropagationFlags { get { return fileSystemAccessRule.PropagationFlags; } }
#endregion
public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule)
{
this.fileSystemAccessRule = fileSystemAccessRule;
}
public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule, FileSystemInfo item)
{
this.fileSystemAccessRule = fileSystemAccessRule;
fix(security2): let the readers handle a descriptor that has no item 3.1 made a FileSystemSecurity2 without an item reachable from a .NET caller (the conversions from FileSecurity and DirectorySecurity), but six sibling call sites still dereferenced the item without checking it first, so a caller who converted a FileSecurity or DirectorySecurity and then read its entries, owner, inheritance, or effective access met a NullReferenceException instead of a usable result. GetFileSystemAccessRules and GetFileSystemAuditRules (the FileSystemSecurity2 overload) now give each returned entry the same null FullName that the descriptor itself reports; asking for the source of an inherited entry (getInheritedFrom) needs the path of the item, so it now throws one clear InvalidOperationException instead, naming the reason, when the descriptor has none. FileSystemOwner and FileSystemInheritanceInfo give a null FullName (and Name) the same way; FileSystemOwner.ToString, which must never return null, gives an empty string instead, since there is no other representation to fall back to. The FileSystemAccessRule2(rule, item) constructor, which EffectiveAccess.GetEffectiveAccess uses to build its result, now accepts a null item the same way, so effective access can be calculated for such a descriptor and the result names no path. Every existing behavior for an item that is not null is unchanged; only a .NET caller that reads such a descriptor can notice the difference, and only for the better: a usable result or a clear error instead of an unrelated NullReferenceException. Public signatures are unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: AI Assistant <ai@example.com>
1 week ago
// Null without an item, such as when EffectiveAccess.GetEffectiveAccess builds this from a
// FileSystemSecurity2 that has none, instead of a NullReferenceException.
this.fullName = item != null ? item.FullName : null;
10 years ago
}
public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule, string path)
{
this.fileSystemAccessRule = fileSystemAccessRule;
this.fullName = path;
10 years ago
}
public static implicit operator FileSystemAccessRule(FileSystemAccessRule2 ace2)
{
return ace2.fileSystemAccessRule;
}
public static implicit operator FileSystemAccessRule2(FileSystemAccessRule ace)
{
return new FileSystemAccessRule2(ace);
}
// Like the entries of .NET, two objects are equal when they wrap the same entry; an entry of .NET is never equal,
// so that equality is the same in both directions. A cast instead of "as" threw an InvalidCastException.
10 years ago
public override bool Equals(object obj)
{
var other = obj as FileSystemAccessRule2;
return other != null && ReferenceEquals(fileSystemAccessRule, other.fileSystemAccessRule);
10 years ago
}
public override int GetHashCode()
{
return fileSystemAccessRule.GetHashCode();
}
public override string ToString()
{
return string.Format("{0} '{1}' ({2})",
AccessControlType.ToString()[0],
Account.AccountName,
AccessRights.ToString()
);
}
public SimpleFileSystemAccessRule ToSimpleFileSystemAccessRule2()
{
7 years ago
return new SimpleFileSystemAccessRule(fullName, Account, AccessRights, AccessControlType);
10 years ago
}
}
}