|
|
@@ -55,9 +55,8 @@ namespace System.Security.AccessControl
|
|
|
InheritanceFlags inheritanceFlags,
|
|
|
PropagationFlags propagationFlags)
|
|
|
{
|
|
|
- QualifiedAce ace = AddAccessGetQualifiedAce (accessType, sid, accessMask,
|
|
|
- inheritanceFlags, propagationFlags);
|
|
|
- AddAccess (ace);
|
|
|
+ AddAce (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None);
|
|
|
}
|
|
|
|
|
|
public void AddAccess (AccessControlType accessType,
|
|
|
@@ -68,54 +67,9 @@ namespace System.Security.AccessControl
|
|
|
Guid objectType,
|
|
|
Guid inheritedObjectType)
|
|
|
{
|
|
|
- QualifiedAce ace = AddAccessGetQualifiedAce (accessType, sid, accessMask,
|
|
|
- inheritanceFlags, propagationFlags,
|
|
|
- objectFlags, objectType, inheritedObjectType);
|
|
|
- AddAccess (ace);
|
|
|
- }
|
|
|
-
|
|
|
- QualifiedAce AddAccessGetQualifiedAce (AccessControlType accessType,
|
|
|
- SecurityIdentifier sid, int accessMask,
|
|
|
- InheritanceFlags inheritanceFlags,
|
|
|
- PropagationFlags propagationFlags,
|
|
|
- ObjectAceFlags objectFlags,
|
|
|
- Guid objectType,
|
|
|
- Guid inheritedObjectType)
|
|
|
- {
|
|
|
- if (!IsDS)
|
|
|
- throw new InvalidOperationException ("For this overload, IsDS must be true.");
|
|
|
-
|
|
|
- if (ObjectAceFlags.None == objectFlags)
|
|
|
- return AddAccessGetQualifiedAce (accessType, sid, accessMask, inheritanceFlags, propagationFlags);
|
|
|
-
|
|
|
- AceQualifier qualifier = GetAceQualifier (accessType);
|
|
|
- AceFlags flags = GetAceFlags (inheritanceFlags, propagationFlags);
|
|
|
- return new ObjectAce (flags, qualifier, accessMask, sid,
|
|
|
- objectFlags, objectType, inheritedObjectType, false, null);
|
|
|
- }
|
|
|
-
|
|
|
- QualifiedAce AddAccessGetQualifiedAce (AccessControlType accessType,
|
|
|
- SecurityIdentifier sid, int accessMask,
|
|
|
- InheritanceFlags inheritanceFlags,
|
|
|
- PropagationFlags propagationFlags)
|
|
|
- {
|
|
|
- AceQualifier qualifier = GetAceQualifier (accessType);
|
|
|
- AceFlags flags = GetAceFlags (inheritanceFlags, propagationFlags);
|
|
|
- return new CommonAce (flags, qualifier, accessMask, sid, false, null);
|
|
|
- }
|
|
|
-
|
|
|
- void AddAccess (QualifiedAce newAce)
|
|
|
- {
|
|
|
- RequireCanonicity ();
|
|
|
-
|
|
|
- int pos; // Canonical order is explicit deny, explicit allow, inherited.
|
|
|
- if (AceQualifier.AccessAllowed == newAce.AceQualifier)
|
|
|
- pos = GetCanonicalExplicitDenyAceCount ();
|
|
|
- else
|
|
|
- pos = 0;
|
|
|
-
|
|
|
- raw_acl.InsertAce (pos, newAce);
|
|
|
- CleanAndRetestCanonicity ();
|
|
|
+ AddAce (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None,
|
|
|
+ objectFlags, objectType, inheritedObjectType);
|
|
|
}
|
|
|
|
|
|
public bool RemoveAccess (AccessControlType accessType,
|
|
|
@@ -145,19 +99,8 @@ namespace System.Security.AccessControl
|
|
|
InheritanceFlags inheritanceFlags,
|
|
|
PropagationFlags propagationFlags)
|
|
|
{
|
|
|
- RequireCanonicity ();
|
|
|
- AceQualifier qualifier = GetAceQualifier (accessType);
|
|
|
- RemoveAces<CommonAce> (ace =>
|
|
|
- {
|
|
|
- if (ace.AccessMask != accessMask) return false;
|
|
|
- if (ace.AceQualifier != qualifier) return false;
|
|
|
- if (ace.SecurityIdentifier != sid) return false;
|
|
|
- if (ace.InheritanceFlags != inheritanceFlags) return false;
|
|
|
- if (InheritanceFlags.None != inheritanceFlags)
|
|
|
- if (ace.PropagationFlags != propagationFlags) return false;
|
|
|
- return true;
|
|
|
- });
|
|
|
- CleanAndRetestCanonicity ();
|
|
|
+ RemoveAceSpecific (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None);
|
|
|
}
|
|
|
|
|
|
public void RemoveAccessSpecific (AccessControlType accessType,
|
|
|
@@ -169,32 +112,9 @@ namespace System.Security.AccessControl
|
|
|
Guid objectType,
|
|
|
Guid inheritedObjectType)
|
|
|
{
|
|
|
- if (!IsDS)
|
|
|
- throw new InvalidOperationException ("For this overload, IsDS must be true.");
|
|
|
-
|
|
|
- if (ObjectAceFlags.None == objectFlags) {
|
|
|
- RemoveAccessSpecific (accessType, sid, accessMask, inheritanceFlags, propagationFlags);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- RequireCanonicity ();
|
|
|
- AceQualifier qualifier = GetAceQualifier (accessType);
|
|
|
- RemoveAces<ObjectAce> (ace =>
|
|
|
- {
|
|
|
- if (ace.AccessMask != accessMask) return false;
|
|
|
- if (ace.AceQualifier != qualifier) return false;
|
|
|
- if (ace.SecurityIdentifier != sid) return false;
|
|
|
- if (ace.InheritanceFlags != inheritanceFlags) return false;
|
|
|
- if (InheritanceFlags.None != inheritanceFlags)
|
|
|
- if (ace.PropagationFlags != propagationFlags) return false;
|
|
|
- if (ace.ObjectAceFlags != objectFlags) return false;
|
|
|
- if (0 != (objectFlags & ObjectAceFlags.ObjectAceTypePresent))
|
|
|
- if (ace.ObjectAceType != objectType) return false;
|
|
|
- if (0 != (objectFlags & ObjectAceFlags.InheritedObjectAceTypePresent))
|
|
|
- if (ace.InheritedObjectAceType != objectType) return false;
|
|
|
- return true;
|
|
|
- });
|
|
|
- CleanAndRetestCanonicity ();
|
|
|
+ RemoveAceSpecific (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None,
|
|
|
+ objectFlags, objectType, inheritedObjectType);
|
|
|
}
|
|
|
|
|
|
public void SetAccess (AccessControlType accessType,
|
|
|
@@ -203,9 +123,8 @@ namespace System.Security.AccessControl
|
|
|
InheritanceFlags inheritanceFlags,
|
|
|
PropagationFlags propagationFlags)
|
|
|
{
|
|
|
- QualifiedAce ace = AddAccessGetQualifiedAce (accessType, sid, accessMask,
|
|
|
- inheritanceFlags, propagationFlags);
|
|
|
- SetAccess (ace);
|
|
|
+ SetAce (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None);
|
|
|
}
|
|
|
|
|
|
public void SetAccess (AccessControlType accessType,
|
|
|
@@ -217,26 +136,11 @@ namespace System.Security.AccessControl
|
|
|
Guid objectType,
|
|
|
Guid inheritedObjectType)
|
|
|
{
|
|
|
- QualifiedAce ace = AddAccessGetQualifiedAce (accessType, sid, accessMask,
|
|
|
- inheritanceFlags, propagationFlags,
|
|
|
- objectFlags, objectType, inheritedObjectType);
|
|
|
- SetAccess (ace);
|
|
|
- }
|
|
|
-
|
|
|
- void SetAccess (QualifiedAce newAce)
|
|
|
- {
|
|
|
- RequireCanonicity ();
|
|
|
-
|
|
|
- RemoveAces<QualifiedAce> (oldAce =>
|
|
|
- {
|
|
|
- return oldAce.AceQualifier == newAce.AceQualifier &&
|
|
|
- oldAce.SecurityIdentifier == newAce.SecurityIdentifier;
|
|
|
- });
|
|
|
- CleanAndRetestCanonicity ();
|
|
|
-
|
|
|
- AddAccess (newAce);
|
|
|
+ SetAce (GetAceQualifier (accessType), sid, accessMask,
|
|
|
+ inheritanceFlags, propagationFlags, AuditFlags.None,
|
|
|
+ objectFlags, objectType, inheritedObjectType);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
internal override void ApplyCanonicalSortToExplicitAces ()
|
|
|
{
|
|
|
int explicitCount = GetCanonicalExplicitAceCount ();
|
|
|
@@ -246,37 +150,13 @@ namespace System.Security.AccessControl
|
|
|
ApplyCanonicalSortToExplicitAces (explicitDenys, explicitCount - explicitDenys);
|
|
|
}
|
|
|
|
|
|
- internal override bool IsAceMeaningless (GenericAce ace)
|
|
|
+ internal override int GetAceInsertPosition (AceQualifier aceQualifier)
|
|
|
{
|
|
|
- if (base.IsAceMeaningless (ace)) return true;
|
|
|
-
|
|
|
- QualifiedAce qace = ace as QualifiedAce;
|
|
|
- if (null != qace) {
|
|
|
- return !(AceQualifier.AccessAllowed == qace.AceQualifier ||
|
|
|
- AceQualifier.AccessDenied == qace.AceQualifier);
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- AceFlags GetAceFlags (InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
|
|
|
- {
|
|
|
- if (InheritanceFlags.None != inheritanceFlags && !IsContainer)
|
|
|
- throw new ArgumentException ("Flags only work with containers.", "inheritanceFlags");
|
|
|
-
|
|
|
- if (InheritanceFlags.None == inheritanceFlags && PropagationFlags.None != propagationFlags)
|
|
|
- throw new ArgumentException ("Propagation flags need inheritance flags.", "propagationFlags");
|
|
|
-
|
|
|
- AceFlags flags = AceFlags.None;
|
|
|
- if (0 != ((InheritanceFlags.ContainerInherit) & inheritanceFlags))
|
|
|
- flags |= AceFlags.ContainerInherit;
|
|
|
- if (0 != ((InheritanceFlags.ObjectInherit) & inheritanceFlags))
|
|
|
- flags |= AceFlags.ObjectInherit;
|
|
|
- if (0 != ((PropagationFlags.InheritOnly) & propagationFlags))
|
|
|
- flags |= AceFlags.InheritOnly;
|
|
|
- if (0 != ((PropagationFlags.NoPropagateInherit) & propagationFlags))
|
|
|
- flags |= AceFlags.NoPropagateInherit;
|
|
|
- return flags;
|
|
|
+ // Canonical order for DACLs is explicit deny, explicit allow, inherited.
|
|
|
+ if (AceQualifier.AccessAllowed == aceQualifier)
|
|
|
+ return GetCanonicalExplicitDenyAceCount ();
|
|
|
+ else
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static AceQualifier GetAceQualifier (AccessControlType accessType)
|
|
|
@@ -288,6 +168,20 @@ namespace System.Security.AccessControl
|
|
|
else
|
|
|
throw new ArgumentOutOfRangeException ("accessType");
|
|
|
}
|
|
|
+
|
|
|
+ internal override bool IsAceMeaningless (GenericAce ace)
|
|
|
+ {
|
|
|
+ if (base.IsAceMeaningless (ace)) return true;
|
|
|
+ if (AuditFlags.None != ace.AuditFlags) return true;
|
|
|
+
|
|
|
+ QualifiedAce qace = ace as QualifiedAce;
|
|
|
+ if (null != qace) {
|
|
|
+ if (!(AceQualifier.AccessAllowed == qace.AceQualifier ||
|
|
|
+ AceQualifier.AccessDenied == qace.AceQualifier)) return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|