Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ RemoveQualifiedAces()

bool System.Security.AccessControl.CommonAcl.RemoveQualifiedAces ( SecurityIdentifier sid,
AceQualifier qualifier,
int accessMask,
AceFlags flags,
bool saclSemantics,
ObjectAceFlags objectFlags,
Guid objectType,
Guid inheritedObjectType )
inlinepackageinherited

Definition at line 894 of file CommonAcl.cs.

895 {
896 if (accessMask == 0)
897 {
898 throw new ArgumentException(System.SR.Argument_ArgumentZero, "accessMask");
899 }
900 if (qualifier == AceQualifier.SystemAudit && (flags & AceFlags.AuditFlags) == 0)
901 {
903 }
904 if (sid == null)
905 {
906 throw new ArgumentNullException("sid");
907 }
909 bool flag = true;
910 bool flag2 = true;
911 int num = accessMask;
912 AceFlags aceFlags = flags;
913 byte[] binaryForm = new byte[BinaryLength];
914 GetBinaryForm(binaryForm, 0);
915 while (true)
916 {
917 try
918 {
919 for (int i = 0; i < Count; i++)
920 {
921 QualifiedAce qualifiedAce = _acl[i] as QualifiedAce;
922 if (qualifiedAce == null || (qualifiedAce.AceFlags & AceFlags.Inherited) != 0 || qualifiedAce.AceQualifier != qualifier || qualifiedAce.SecurityIdentifier != sid)
923 {
924 continue;
925 }
926 if (IsDS)
927 {
928 accessMask = num;
929 bool flag3 = !GetAccessMaskForRemoval(qualifiedAce, objectFlags, objectType, ref accessMask);
930 if ((qualifiedAce.AccessMask & accessMask) == 0)
931 {
932 continue;
933 }
934 flags = aceFlags;
935 bool flag4 = !GetInheritanceFlagsForRemoval(qualifiedAce, objectFlags, inheritedObjectType, ref flags);
936 if (((qualifiedAce.AceFlags & AceFlags.ContainerInherit) == 0 && (flags & AceFlags.ContainerInherit) != 0 && (flags & AceFlags.InheritOnly) != 0) || ((flags & AceFlags.ContainerInherit) == 0 && (qualifiedAce.AceFlags & AceFlags.ContainerInherit) != 0 && (qualifiedAce.AceFlags & AceFlags.InheritOnly) != 0) || ((aceFlags & AceFlags.ContainerInherit) != 0 && (aceFlags & AceFlags.InheritOnly) != 0 && (flags & AceFlags.ContainerInherit) == 0))
937 {
938 continue;
939 }
940 if (flag3 || flag4)
941 {
942 flag2 = false;
943 break;
944 }
945 }
946 else if ((qualifiedAce.AccessMask & accessMask) == 0)
947 {
948 continue;
949 }
950 if (saclSemantics && (qualifiedAce.AceFlags & flags & AceFlags.AuditFlags) == 0)
951 {
952 continue;
953 }
954 AceFlags aceFlags2 = AceFlags.None;
955 int num2 = 0;
956 ObjectAceFlags objectFlags2 = ObjectAceFlags.None;
957 Guid objectType2 = Guid.Empty;
958 Guid inheritedObjectType2 = Guid.Empty;
959 AceFlags aceFlags3 = AceFlags.None;
960 int accessMask2 = 0;
961 ObjectAceFlags objectFlags3 = ObjectAceFlags.None;
962 Guid objectType3 = Guid.Empty;
963 Guid inheritedObjectType3 = Guid.Empty;
964 AceFlags aceFlags4 = AceFlags.None;
965 int num3 = 0;
966 ObjectAceFlags objectFlags4 = ObjectAceFlags.None;
967 Guid objectType4 = Guid.Empty;
968 Guid inheritedObjectType4 = Guid.Empty;
969 AceFlags result = AceFlags.None;
970 bool total = false;
971 aceFlags2 = qualifiedAce.AceFlags;
972 num2 = qualifiedAce.AccessMask & ~accessMask;
973 if (qualifiedAce is ObjectAce originalAce)
974 {
975 GetObjectTypesForSplit(originalAce, num2, aceFlags2, out objectFlags2, out objectType2, out inheritedObjectType2);
976 }
977 if (saclSemantics)
978 {
979 aceFlags3 = qualifiedAce.AceFlags & (AceFlags)(~(uint)(flags & AceFlags.AuditFlags));
980 accessMask2 = qualifiedAce.AccessMask & accessMask;
981 if (qualifiedAce is ObjectAce originalAce2)
982 {
983 GetObjectTypesForSplit(originalAce2, accessMask2, aceFlags3, out objectFlags3, out objectType3, out inheritedObjectType3);
984 }
985 }
986 aceFlags4 = (qualifiedAce.AceFlags & AceFlags.InheritanceFlags) | (flags & qualifiedAce.AceFlags & AceFlags.AuditFlags);
987 num3 = qualifiedAce.AccessMask & accessMask;
988 if (!saclSemantics || (aceFlags4 & AceFlags.AuditFlags) != 0)
989 {
990 if (!RemoveInheritanceBits(aceFlags4, flags, IsDS, out result, out total))
991 {
992 flag2 = false;
993 break;
994 }
995 if (!total)
996 {
997 result |= aceFlags4 & AceFlags.AuditFlags;
998 if (qualifiedAce is ObjectAce originalAce3)
999 {
1000 GetObjectTypesForSplit(originalAce3, num3, result, out objectFlags4, out objectType4, out inheritedObjectType4);
1001 }
1002 }
1003 }
1004 if (flag)
1005 {
1006 continue;
1007 }
1008 if (num2 != 0)
1009 {
1010 if (qualifiedAce is ObjectAce && (((ObjectAce)qualifiedAce).ObjectAceFlags & ObjectAceFlags.ObjectAceTypePresent) != 0 && (objectFlags2 & ObjectAceFlags.ObjectAceTypePresent) == 0)
1011 {
1012 _acl.RemoveAce(i);
1013 ObjectAce ace = new ObjectAce(aceFlags2, qualifier, num2, qualifiedAce.SecurityIdentifier, objectFlags2, objectType2, inheritedObjectType2, isCallback: false, null);
1014 _acl.InsertAce(i, ace);
1015 }
1016 else
1017 {
1018 qualifiedAce.AceFlags = aceFlags2;
1019 qualifiedAce.AccessMask = num2;
1020 if (qualifiedAce is ObjectAce objectAce)
1021 {
1022 objectAce.ObjectAceFlags = objectFlags2;
1023 objectAce.ObjectAceType = objectType2;
1024 objectAce.InheritedObjectAceType = inheritedObjectType2;
1025 }
1026 }
1027 }
1028 else
1029 {
1030 _acl.RemoveAce(i);
1031 i--;
1032 }
1033 if (saclSemantics && (aceFlags3 & AceFlags.AuditFlags) != 0)
1034 {
1035 QualifiedAce ace2 = ((!(qualifiedAce is CommonAce)) ? ((QualifiedAce)new ObjectAce(aceFlags3, qualifier, accessMask2, qualifiedAce.SecurityIdentifier, objectFlags3, objectType3, inheritedObjectType3, isCallback: false, null)) : ((QualifiedAce)new CommonAce(aceFlags3, qualifier, accessMask2, qualifiedAce.SecurityIdentifier, isCallback: false, null)));
1036 i++;
1037 _acl.InsertAce(i, ace2);
1038 }
1039 if (!total)
1040 {
1041 QualifiedAce ace2 = ((!(qualifiedAce is CommonAce)) ? ((QualifiedAce)new ObjectAce(result, qualifier, num3, qualifiedAce.SecurityIdentifier, objectFlags4, objectType4, inheritedObjectType4, isCallback: false, null)) : ((QualifiedAce)new CommonAce(result, qualifier, num3, qualifiedAce.SecurityIdentifier, isCallback: false, null)));
1042 i++;
1043 _acl.InsertAce(i, ace2);
1044 }
1045 }
1046 }
1047 catch (OverflowException)
1048 {
1049 _acl.SetBinaryForm(binaryForm, 0);
1050 return false;
1051 }
1052 if (!(flag && flag2))
1053 {
1054 break;
1055 }
1056 flag = false;
1057 }
1059 return flag2;
1060 }
static string Arg_EnumAtLeastOneFlag
Definition SR.cs:44
static string Argument_ArgumentZero
Definition SR.cs:52
Definition SR.cs:7
static bool RemoveInheritanceBits(AceFlags existing, AceFlags remove, bool isDS, out AceFlags result, out bool total)
Definition CommonAcl.cs:201
bool GetInheritanceFlagsForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid inheritedObjectType, ref AceFlags aceFlags)
Definition CommonAcl.cs:531
bool GetAccessMaskForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid objectType, ref int accessMask)
Definition CommonAcl.cs:507
override void GetBinaryForm(byte[] binaryForm, int offset)
void GetObjectTypesForSplit(ObjectAce originalAce, int accessMask, AceFlags aceFlags, out ObjectAceFlags objectFlags, out Guid objectType, out Guid inheritedObjectType)
Definition CommonAcl.cs:448
void InsertAce(int index, GenericAce ace)
Definition RawAcl.cs:172
void SetBinaryForm(byte[] binaryForm, int offset)
Definition RawAcl.cs:107

References System.Security.AccessControl.CommonAcl._acl, System.Security.AccessControl.KnownAce.AccessMask, System.Security.AccessControl.GenericAce.AceFlags, System.Security.AccessControl.QualifiedAce.AceQualifier, System.SR.Arg_EnumAtLeastOneFlag, System.SR.Argument_ArgumentZero, System.Security.AccessControl.CommonAcl.BinaryLength, System.Security.AccessControl.CommonAcl.Count, System.Guid.Empty, System.Security.AccessControl.CommonAcl.GetAccessMaskForRemoval(), System.Security.AccessControl.CommonAcl.GetBinaryForm(), System.Security.AccessControl.CommonAcl.GetInheritanceFlagsForRemoval(), System.Security.AccessControl.CommonAcl.GetObjectTypesForSplit(), System.Security.AccessControl.RawAcl.InsertAce(), System.Security.AccessControl.CommonAcl.IsDS, System.Security.AccessControl.CommonAcl.OnAclModificationTried(), System.Security.AccessControl.RawAcl.RemoveAce(), System.Security.AccessControl.CommonAcl.RemoveInheritanceBits(), System.Security.AccessControl.KnownAce.SecurityIdentifier, System.Security.AccessControl.RawAcl.SetBinaryForm(), and System.Security.AccessControl.CommonAcl.ThrowIfNotCanonical().

Referenced by System.Security.AccessControl.DiscretionaryAcl.RemoveAccess(), System.Security.AccessControl.DiscretionaryAcl.RemoveAccess(), System.Security.AccessControl.SystemAcl.RemoveAudit(), and System.Security.AccessControl.SystemAcl.RemoveAudit().