Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CommonAcl.cs
Go to the documentation of this file.
2
4
5public abstract class CommonAcl : GenericAcl
6{
7 [Flags]
8 private enum AF
9 {
10 CI = 8,
11 OI = 4,
12 IO = 2,
13 NP = 1,
14 Invalid = 1
15 }
16
17 [Flags]
18 private enum PM
19 {
20 F = 0x10,
21 CF = 8,
22 CO = 4,
23 GF = 2,
24 GO = 1,
25 Invalid = 1
26 }
27
28 private enum ComparisonResult
29 {
31 EqualTo,
33 }
34
35 private static readonly PM[] s_AFtoPM = CreateAFtoPMConversionMatrix();
36
37 private static readonly AF[] s_PMtoAF = CreatePMtoAFConversionMatrix();
38
39 private readonly RawAcl _acl;
40
41 private bool _isDirty;
42
43 private readonly bool _isCanonical;
44
45 private readonly bool _isContainer;
46
47 private readonly bool _isDS;
48
49 internal RawAcl RawAcl => _acl;
50
51 public sealed override byte Revision => _acl.Revision;
52
53 public sealed override int Count
54 {
55 get
56 {
58 return _acl.Count;
59 }
60 }
61
62 public sealed override int BinaryLength
63 {
64 get
65 {
67 return _acl.BinaryLength;
68 }
69 }
70
71 public bool IsCanonical => _isCanonical;
72
73 public bool IsContainer => _isContainer;
74
75 public bool IsDS => _isDS;
76
77 public sealed override GenericAce this[int index]
78 {
79 get
80 {
82 return _acl[index].Copy();
83 }
84 set
85 {
87 }
88 }
89
91 {
92 PM[] array = new PM[16];
93 for (int i = 0; i < array.Length; i++)
94 {
95 array[i] = PM.GO;
96 }
97 array[0] = PM.F;
98 array[4] = PM.F | PM.CO | PM.GO;
99 array[5] = PM.F | PM.CO;
100 array[6] = PM.CO | PM.GO;
101 array[7] = PM.CO;
102 array[8] = PM.F | PM.CF | PM.GF;
103 array[9] = PM.F | PM.CF;
104 array[10] = PM.CF | PM.GF;
105 array[11] = PM.CF;
106 array[12] = PM.F | PM.CF | PM.CO | PM.GF | PM.GO;
107 array[13] = PM.F | PM.CF | PM.CO;
108 array[14] = PM.CF | PM.CO | PM.GF | PM.GO;
109 array[15] = PM.CF | PM.CO;
110 return array;
111 }
112
114 {
115 AF[] array = new AF[32];
116 for (int i = 0; i < array.Length; i++)
117 {
118 array[i] = AF.NP;
119 }
120 array[16] = (AF)0;
121 array[21] = AF.OI;
122 array[20] = AF.OI | AF.NP;
123 array[5] = AF.OI | AF.IO;
124 array[4] = AF.OI | AF.IO | AF.NP;
125 array[26] = AF.CI;
126 array[24] = AF.CI | AF.NP;
127 array[10] = AF.CI | AF.IO;
128 array[8] = AF.CI | AF.IO | AF.NP;
129 array[31] = AF.CI | AF.OI;
130 array[28] = AF.CI | AF.OI | AF.NP;
131 array[15] = AF.CI | AF.OI | AF.IO;
132 array[12] = AF.CI | AF.OI | AF.IO | AF.NP;
133 return array;
134 }
135
136 private static AF AFFromAceFlags(AceFlags aceFlags, bool isDS)
137 {
138 AF aF = (AF)0;
139 if ((aceFlags & AceFlags.ContainerInherit) != 0)
140 {
141 aF |= AF.CI;
142 }
143 if (!isDS && (aceFlags & AceFlags.ObjectInherit) != 0)
144 {
145 aF |= AF.OI;
146 }
147 if ((aceFlags & AceFlags.InheritOnly) != 0)
148 {
149 aF |= AF.IO;
150 }
151 if ((aceFlags & AceFlags.NoPropagateInherit) != 0)
152 {
153 aF |= AF.NP;
154 }
155 return aF;
156 }
157
158 private static AceFlags AceFlagsFromAF(AF af, bool isDS)
159 {
160 AceFlags aceFlags = AceFlags.None;
161 if ((af & AF.CI) != 0)
162 {
163 aceFlags |= AceFlags.ContainerInherit;
164 }
165 if (!isDS && (af & AF.OI) != 0)
166 {
167 aceFlags |= AceFlags.ObjectInherit;
168 }
169 if ((af & AF.IO) != 0)
170 {
171 aceFlags |= AceFlags.InheritOnly;
172 }
173 if ((af & AF.NP) != 0)
174 {
175 aceFlags |= AceFlags.NoPropagateInherit;
176 }
177 return aceFlags;
178 }
179
180 private static bool MergeInheritanceBits(AceFlags left, AceFlags right, bool isDS, out AceFlags result)
181 {
182 result = AceFlags.None;
183 AF aF = AFFromAceFlags(left, isDS);
184 AF aF2 = AFFromAceFlags(right, isDS);
185 PM pM = s_AFtoPM[(int)aF];
186 PM pM2 = s_AFtoPM[(int)aF2];
187 if (pM == PM.GO || pM2 == PM.GO)
188 {
189 return false;
190 }
191 PM pM3 = pM | pM2;
192 AF aF3 = s_PMtoAF[(int)pM3];
193 if (aF3 == AF.NP)
194 {
195 return false;
196 }
197 result = AceFlagsFromAF(aF3, isDS);
198 return true;
199 }
200
201 private static bool RemoveInheritanceBits(AceFlags existing, AceFlags remove, bool isDS, out AceFlags result, out bool total)
202 {
203 result = AceFlags.None;
204 total = false;
205 AF aF = AFFromAceFlags(existing, isDS);
206 AF aF2 = AFFromAceFlags(remove, isDS);
207 PM pM = s_AFtoPM[(int)aF];
208 PM pM2 = s_AFtoPM[(int)aF2];
209 if (pM == PM.GO || pM2 == PM.GO)
210 {
211 return false;
212 }
213 PM pM3 = pM & ~pM2;
214 if (pM3 == (PM)0)
215 {
216 total = true;
217 return true;
218 }
219 AF aF3 = s_PMtoAF[(int)pM3];
220 if (aF3 == AF.NP)
221 {
222 return false;
223 }
224 result = AceFlagsFromAF(aF3, isDS);
225 return true;
226 }
227
229 {
230 if (_isDirty)
231 {
232 Canonicalize(compact: false, this is DiscretionaryAcl);
233 _isDirty = false;
234 }
235 }
236
237 private static int DaclAcePriority(GenericAce ace)
238 {
239 AceType aceType = ace.AceType;
240 if ((ace.AceFlags & AceFlags.Inherited) != 0)
241 {
242 return 131070 + ace._indexInAcl;
243 }
244 switch (aceType)
245 {
246 case AceType.AccessDenied:
247 case AceType.AccessDeniedCallback:
248 return 0;
249 case AceType.AccessDeniedObject:
250 case AceType.AccessDeniedCallbackObject:
251 return 1;
252 case AceType.AccessAllowed:
253 case AceType.AccessAllowedCallback:
254 return 2;
255 case AceType.AccessAllowedObject:
256 case AceType.AccessAllowedCallbackObject:
257 return 3;
258 default:
259 return 65535 + ace._indexInAcl;
260 }
261 }
262
263 private static int SaclAcePriority(GenericAce ace)
264 {
265 AceType aceType = ace.AceType;
266 if ((ace.AceFlags & AceFlags.Inherited) != 0)
267 {
268 return 131070 + ace._indexInAcl;
269 }
270 switch (aceType)
271 {
272 case AceType.SystemAudit:
273 case AceType.SystemAlarm:
274 case AceType.SystemAuditCallback:
275 case AceType.SystemAlarmCallback:
276 return 0;
277 case AceType.SystemAuditObject:
278 case AceType.SystemAlarmObject:
279 case AceType.SystemAuditCallbackObject:
280 case AceType.SystemAlarmCallbackObject:
281 return 1;
282 default:
283 return 65535 + ace._indexInAcl;
284 }
285 }
286
287 private static ComparisonResult CompareAces(GenericAce ace1, GenericAce ace2, bool isDacl)
288 {
289 int num = (isDacl ? DaclAcePriority(ace1) : SaclAcePriority(ace1));
290 int num2 = (isDacl ? DaclAcePriority(ace2) : SaclAcePriority(ace2));
291 if (num < num2)
292 {
293 return ComparisonResult.LessThan;
294 }
295 if (num > num2)
296 {
297 return ComparisonResult.GreaterThan;
298 }
299 if (ace1 is KnownAce knownAce && ace2 is KnownAce knownAce2)
300 {
301 int num3 = knownAce.SecurityIdentifier.CompareTo(knownAce2.SecurityIdentifier);
302 if (num3 < 0)
303 {
304 return ComparisonResult.LessThan;
305 }
306 if (num3 > 0)
307 {
308 return ComparisonResult.GreaterThan;
309 }
310 }
311 return ComparisonResult.EqualTo;
312 }
313
314 private void QuickSort(int left, int right, bool isDacl)
315 {
316 if (left >= right)
317 {
318 return;
319 }
320 int num = left;
321 int num2 = right;
322 GenericAce genericAce = _acl[left];
323 int num3 = left;
324 while (left < right)
325 {
326 while (CompareAces(_acl[right], genericAce, isDacl) != 0 && left < right)
327 {
328 right--;
329 }
330 if (left != right)
331 {
332 _acl[left] = _acl[right];
333 left++;
334 }
335 while (ComparisonResult.GreaterThan != CompareAces(_acl[left], genericAce, isDacl) && left < right)
336 {
337 left++;
338 }
339 if (left != right)
340 {
341 _acl[right] = _acl[left];
342 right--;
343 }
344 }
345 _acl[left] = genericAce;
346 num3 = left;
347 left = num;
348 right = num2;
349 if (left < num3)
350 {
351 QuickSort(left, num3 - 1, isDacl);
352 }
353 if (right > num3)
354 {
355 QuickSort(num3 + 1, right, isDacl);
356 }
357 }
358
359 private bool InspectAce(ref GenericAce ace, bool isDacl)
360 {
361 KnownAce knownAce = ace as KnownAce;
362 if (knownAce != null && knownAce.AccessMask == 0)
363 {
364 return false;
365 }
366 if (!IsContainer)
367 {
368 if ((ace.AceFlags & AceFlags.InheritOnly) != 0)
369 {
370 return false;
371 }
372 if ((ace.AceFlags & AceFlags.InheritanceFlags) != 0)
373 {
374 ace.AceFlags &= ~AceFlags.InheritanceFlags;
375 }
376 }
377 else
378 {
379 if ((ace.AceFlags & AceFlags.InheritOnly) != 0 && (ace.AceFlags & AceFlags.ContainerInherit) == 0 && (ace.AceFlags & AceFlags.ObjectInherit) == 0)
380 {
381 return false;
382 }
383 if ((ace.AceFlags & AceFlags.NoPropagateInherit) != 0 && (ace.AceFlags & AceFlags.ContainerInherit) == 0 && (ace.AceFlags & AceFlags.ObjectInherit) == 0)
384 {
385 ace.AceFlags &= ~AceFlags.NoPropagateInherit;
386 }
387 }
388 QualifiedAce qualifiedAce = knownAce as QualifiedAce;
389 if (isDacl)
390 {
391 ace.AceFlags &= ~AceFlags.AuditFlags;
392 if (qualifiedAce != null && qualifiedAce.AceQualifier != 0 && qualifiedAce.AceQualifier != AceQualifier.AccessDenied)
393 {
394 return false;
395 }
396 }
397 else
398 {
399 if ((ace.AceFlags & AceFlags.AuditFlags) == 0)
400 {
401 return false;
402 }
403 if (qualifiedAce != null && qualifiedAce.AceQualifier != AceQualifier.SystemAudit)
404 {
405 return false;
406 }
407 }
408 return true;
409 }
410
411 private void RemoveMeaninglessAcesAndFlags(bool isDacl)
412 {
413 for (int num = _acl.Count - 1; num >= 0; num--)
414 {
415 GenericAce ace = _acl[num];
416 if (!InspectAce(ref ace, isDacl))
417 {
418 _acl.RemoveAce(num);
419 }
420 }
421 }
422
423 private void Canonicalize(bool compact, bool isDacl)
424 {
425 for (ushort num = 0; num < _acl.Count; num++)
426 {
427 _acl[num]._indexInAcl = num;
428 }
429 QuickSort(0, _acl.Count - 1, isDacl);
430 if (!compact)
431 {
432 return;
433 }
434 for (int i = 0; i < Count - 1; i++)
435 {
436 QualifiedAce ace = _acl[i] as QualifiedAce;
437 if (!(ace == null))
438 {
439 QualifiedAce qualifiedAce = _acl[i + 1] as QualifiedAce;
440 if (!(qualifiedAce == null) && MergeAces(ref ace, qualifiedAce))
441 {
442 _acl.RemoveAce(i + 1);
443 }
444 }
445 }
446 }
447
448 private void GetObjectTypesForSplit(ObjectAce originalAce, int accessMask, AceFlags aceFlags, out ObjectAceFlags objectFlags, out Guid objectType, out Guid inheritedObjectType)
449 {
450 objectFlags = ObjectAceFlags.None;
451 objectType = Guid.Empty;
452 inheritedObjectType = Guid.Empty;
453 if (((uint)accessMask & 0x13Bu) != 0)
454 {
455 objectType = originalAce.ObjectAceType;
456 objectFlags |= originalAce.ObjectAceFlags & ObjectAceFlags.ObjectAceTypePresent;
457 }
458 if ((aceFlags & AceFlags.ContainerInherit) != 0)
459 {
460 inheritedObjectType = originalAce.InheritedObjectAceType;
461 objectFlags |= originalAce.ObjectAceFlags & ObjectAceFlags.InheritedObjectAceTypePresent;
462 }
463 }
464
466 {
467 Guid guid = ((ace is ObjectAce) ? ((ObjectAce)ace).ObjectAceType : Guid.Empty);
468 Guid g = ((newAce is ObjectAce) ? ((ObjectAce)newAce).ObjectAceType : Guid.Empty);
469 return guid.Equals(g);
470 }
471
473 {
474 Guid guid = ((ace is ObjectAce) ? ((ObjectAce)ace).InheritedObjectAceType : Guid.Empty);
475 Guid g = ((newAce is ObjectAce) ? ((ObjectAce)newAce).InheritedObjectAceType : Guid.Empty);
476 return guid.Equals(g);
477 }
478
480 {
481 if (ObjectTypesMatch(ace, newAce))
482 {
483 return true;
484 }
485 ObjectAceFlags objectAceFlags = ((ace is ObjectAce) ? ((ObjectAce)ace).ObjectAceFlags : ObjectAceFlags.None);
486 if ((ace.AccessMask & newAce.AccessMask & 0x13B) == (newAce.AccessMask & 0x13B) && (objectAceFlags & ObjectAceFlags.ObjectAceTypePresent) == 0)
487 {
488 return true;
489 }
490 return false;
491 }
492
494 {
495 if (InheritedObjectTypesMatch(ace, newAce))
496 {
497 return true;
498 }
499 ObjectAceFlags objectAceFlags = ((ace is ObjectAce) ? ((ObjectAce)ace).ObjectAceFlags : ObjectAceFlags.None);
500 if ((objectAceFlags & ObjectAceFlags.InheritedObjectAceTypePresent) == 0)
501 {
502 return true;
503 }
504 return false;
505 }
506
507 private bool GetAccessMaskForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid objectType, ref int accessMask)
508 {
509 if (((uint)(ace.AccessMask & accessMask) & 0x13Bu) != 0)
510 {
511 if (ace is ObjectAce objectAce)
512 {
513 bool flag = true;
514 if ((objectFlags & ObjectAceFlags.ObjectAceTypePresent) != 0 && (objectAce.ObjectAceFlags & ObjectAceFlags.ObjectAceTypePresent) == 0)
515 {
516 return false;
517 }
518 if ((objectFlags & ObjectAceFlags.ObjectAceTypePresent) != 0 && !objectAce.ObjectTypesMatch(objectFlags, objectType))
519 {
520 accessMask &= -316;
521 }
522 }
523 else if ((objectFlags & ObjectAceFlags.ObjectAceTypePresent) != 0)
524 {
525 return false;
526 }
527 }
528 return true;
529 }
530
531 private bool GetInheritanceFlagsForRemoval(QualifiedAce ace, ObjectAceFlags objectFlags, Guid inheritedObjectType, ref AceFlags aceFlags)
532 {
533 if ((ace.AceFlags & AceFlags.ContainerInherit) != 0 && (aceFlags & AceFlags.ContainerInherit) != 0)
534 {
535 if (ace is ObjectAce objectAce)
536 {
537 bool flag = true;
538 if ((objectFlags & ObjectAceFlags.InheritedObjectAceTypePresent) != 0 && (objectAce.ObjectAceFlags & ObjectAceFlags.InheritedObjectAceTypePresent) == 0)
539 {
540 return false;
541 }
542 if ((objectFlags & ObjectAceFlags.InheritedObjectAceTypePresent) != 0 && !objectAce.InheritedObjectTypesMatch(objectFlags, inheritedObjectType))
543 {
544 aceFlags &= ~AceFlags.InheritanceFlags;
545 }
546 }
547 else if ((objectFlags & ObjectAceFlags.InheritedObjectAceTypePresent) != 0)
548 {
549 return false;
550 }
551 }
552 return true;
553 }
554
555 private static bool AceOpaquesMatch(QualifiedAce ace, QualifiedAce newAce)
556 {
557 byte[] opaque = ace.GetOpaque();
558 byte[] opaque2 = newAce.GetOpaque();
559 if (opaque == null || opaque2 == null)
560 {
561 return opaque == opaque2;
562 }
563 if (opaque.Length != opaque2.Length)
564 {
565 return false;
566 }
567 for (int i = 0; i < opaque.Length; i++)
568 {
569 if (opaque[i] != opaque2[i])
570 {
571 return false;
572 }
573 }
574 return true;
575 }
576
577 private static bool AcesAreMergeable(QualifiedAce ace, QualifiedAce newAce)
578 {
579 if (ace.AceType != newAce.AceType)
580 {
581 return false;
582 }
583 if ((ace.AceFlags & AceFlags.Inherited) != 0)
584 {
585 return false;
586 }
587 if ((newAce.AceFlags & AceFlags.Inherited) != 0)
588 {
589 return false;
590 }
591 if (ace.AceQualifier != newAce.AceQualifier)
592 {
593 return false;
594 }
595 if (ace.SecurityIdentifier != newAce.SecurityIdentifier)
596 {
597 return false;
598 }
599 if (!AceOpaquesMatch(ace, newAce))
600 {
601 return false;
602 }
603 return true;
604 }
605
606 private bool MergeAces(ref QualifiedAce ace, QualifiedAce newAce)
607 {
608 if (!AcesAreMergeable(ace, newAce))
609 {
610 return false;
611 }
612 if (ace.AceFlags == newAce.AceFlags)
613 {
614 if (!(ace is ObjectAce) && !(newAce is ObjectAce))
615 {
616 ace.AccessMask |= newAce.AccessMask;
617 return true;
618 }
619 if (InheritedObjectTypesMatch(ace, newAce) && AccessMasksAreMergeable(ace, newAce))
620 {
621 ace.AccessMask |= newAce.AccessMask;
622 return true;
623 }
624 }
625 if ((ace.AceFlags & AceFlags.InheritanceFlags) == (newAce.AceFlags & AceFlags.InheritanceFlags) && ace.AccessMask == newAce.AccessMask)
626 {
627 if (!(ace is ObjectAce) && !(newAce is ObjectAce))
628 {
629 ace.AceFlags |= newAce.AceFlags & AceFlags.AuditFlags;
630 return true;
631 }
632 if (InheritedObjectTypesMatch(ace, newAce) && ObjectTypesMatch(ace, newAce))
633 {
634 ace.AceFlags |= newAce.AceFlags & AceFlags.AuditFlags;
635 return true;
636 }
637 }
638 if ((ace.AceFlags & AceFlags.AuditFlags) == (newAce.AceFlags & AceFlags.AuditFlags) && ace.AccessMask == newAce.AccessMask)
639 {
640 AceFlags result;
641 if (ace is ObjectAce || newAce is ObjectAce)
642 {
643 if (ObjectTypesMatch(ace, newAce) && AceFlagsAreMergeable(ace, newAce) && MergeInheritanceBits(ace.AceFlags, newAce.AceFlags, IsDS, out result))
644 {
645 ace.AceFlags = result | (ace.AceFlags & AceFlags.AuditFlags);
646 return true;
647 }
648 }
649 else if (MergeInheritanceBits(ace.AceFlags, newAce.AceFlags, IsDS, out result))
650 {
651 ace.AceFlags = result | (ace.AceFlags & AceFlags.AuditFlags);
652 return true;
653 }
654 }
655 return false;
656 }
657
658 private bool CanonicalCheck(bool isDacl)
659 {
660 if (isDacl)
661 {
662 int num = 0;
663 for (int i = 0; i < _acl.Count; i++)
664 {
665 GenericAce genericAce = _acl[i];
666 int num2;
667 if ((genericAce.AceFlags & AceFlags.Inherited) != 0)
668 {
669 num2 = 2;
670 }
671 else
672 {
673 QualifiedAce qualifiedAce = genericAce as QualifiedAce;
674 if (qualifiedAce == null)
675 {
676 return false;
677 }
678 if (qualifiedAce.AceQualifier == AceQualifier.AccessAllowed)
679 {
680 num2 = 1;
681 }
682 else
683 {
684 if (qualifiedAce.AceQualifier != AceQualifier.AccessDenied)
685 {
686 return false;
687 }
688 num2 = 0;
689 }
690 }
691 if (num2 > num)
692 {
693 num = num2;
694 }
695 else if (num2 < num)
696 {
697 return false;
698 }
699 }
700 }
701 else
702 {
703 int num3 = 0;
704 for (int j = 0; j < _acl.Count; j++)
705 {
706 GenericAce genericAce2 = _acl[j];
707 if (genericAce2 == null)
708 {
709 continue;
710 }
711 int num4;
712 if ((genericAce2.AceFlags & AceFlags.Inherited) != 0)
713 {
714 num4 = 1;
715 }
716 else
717 {
718 QualifiedAce qualifiedAce2 = genericAce2 as QualifiedAce;
719 if (qualifiedAce2 == null)
720 {
721 return false;
722 }
723 if (qualifiedAce2.AceQualifier != AceQualifier.SystemAudit && qualifiedAce2.AceQualifier != AceQualifier.SystemAlarm)
724 {
725 return false;
726 }
727 num4 = 0;
728 }
729 if (num4 > num3)
730 {
731 num3 = num4;
732 }
733 else if (num4 < num3)
734 {
735 return false;
736 }
737 }
738 }
739 return true;
740 }
741
749
750 internal CommonAcl(bool isContainer, bool isDS, byte revision, int capacity)
751 {
752 _isContainer = isContainer;
753 _isDS = isDS;
754 _acl = new RawAcl(revision, capacity);
755 _isCanonical = true;
756 }
757
758 internal CommonAcl(bool isContainer, bool isDS, RawAcl rawAcl, bool trusted, bool isDacl)
759 {
760 if (rawAcl == null)
761 {
762 throw new ArgumentNullException("rawAcl");
763 }
764 _isContainer = isContainer;
765 _isDS = isDS;
766 if (trusted)
767 {
768 _acl = rawAcl;
770 }
771 else
772 {
773 _acl = new RawAcl(rawAcl.Revision, rawAcl.Count);
774 for (int i = 0; i < rawAcl.Count; i++)
775 {
776 GenericAce ace = rawAcl[i].Copy();
777 if (InspectAce(ref ace, isDacl))
778 {
779 _acl.InsertAce(_acl.Count, ace);
780 }
781 }
782 }
783 if (CanonicalCheck(isDacl))
784 {
785 Canonicalize(compact: true, isDacl);
786 _isCanonical = true;
787 }
788 else
789 {
790 _isCanonical = false;
791 }
792 }
793
794 internal void CheckAccessType(AccessControlType accessType)
795 {
796 if (accessType != 0 && accessType != AccessControlType.Deny)
797 {
799 }
800 }
801
802 internal void CheckFlags(InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
803 {
804 if (IsContainer)
805 {
806 if (inheritanceFlags == InheritanceFlags.None && propagationFlags != 0)
807 {
808 throw new ArgumentException(System.SR.Argument_InvalidAnyFlag, "propagationFlags");
809 }
810 return;
811 }
812 if (inheritanceFlags != 0)
813 {
814 throw new ArgumentException(System.SR.Argument_InvalidAnyFlag, "inheritanceFlags");
815 }
816 if (propagationFlags != 0)
817 {
818 throw new ArgumentException(System.SR.Argument_InvalidAnyFlag, "propagationFlags");
819 }
820 }
821
822 internal void AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
823 {
824 if (sid == null)
825 {
826 throw new ArgumentNullException("sid");
827 }
829 bool flag = false;
830 if (qualifier == AceQualifier.SystemAudit && (flags & AceFlags.AuditFlags) == 0)
831 {
833 }
834 if (accessMask == 0)
835 {
836 throw new ArgumentException(System.SR.Argument_ArgumentZero, "accessMask");
837 }
838 GenericAce ace = ((IsDS && objectFlags != 0) ? ((QualifiedAce)new ObjectAce(flags, qualifier, accessMask, sid, objectFlags, objectType, inheritedObjectType, isCallback: false, null)) : ((QualifiedAce)new CommonAce(flags, qualifier, accessMask, sid, isCallback: false, null)));
839 if (!InspectAce(ref ace, this is DiscretionaryAcl))
840 {
841 return;
842 }
843 for (int i = 0; i < Count; i++)
844 {
845 QualifiedAce ace2 = _acl[i] as QualifiedAce;
846 if (!(ace2 == null) && MergeAces(ref ace2, (QualifiedAce)ace))
847 {
848 flag = true;
849 break;
850 }
851 }
852 if (!flag)
853 {
854 _acl.InsertAce(_acl.Count, ace);
855 _isDirty = true;
856 }
858 }
859
860 internal void SetQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
861 {
862 if (sid == null)
863 {
864 throw new ArgumentNullException("sid");
865 }
866 if (qualifier == AceQualifier.SystemAudit && (flags & AceFlags.AuditFlags) == 0)
867 {
869 }
870 if (accessMask == 0)
871 {
872 throw new ArgumentException(System.SR.Argument_ArgumentZero, "accessMask");
873 }
875 GenericAce ace = ((IsDS && objectFlags != 0) ? ((QualifiedAce)new ObjectAce(flags, qualifier, accessMask, sid, objectFlags, objectType, inheritedObjectType, isCallback: false, null)) : ((QualifiedAce)new CommonAce(flags, qualifier, accessMask, sid, isCallback: false, null)));
876 if (!InspectAce(ref ace, this is DiscretionaryAcl))
877 {
878 return;
879 }
880 for (int i = 0; i < Count; i++)
881 {
882 QualifiedAce qualifiedAce = _acl[i] as QualifiedAce;
883 if (!(qualifiedAce == null) && (qualifiedAce.AceFlags & AceFlags.Inherited) == 0 && qualifiedAce.AceQualifier == qualifier && !(qualifiedAce.SecurityIdentifier != sid))
884 {
885 _acl.RemoveAce(i);
886 i--;
887 }
888 }
889 _acl.InsertAce(_acl.Count, ace);
890 _isDirty = true;
892 }
893
894 internal bool RemoveQualifiedAces(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, bool saclSemantics, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
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 }
1061
1062 internal void RemoveQualifiedAcesSpecific(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
1063 {
1064 if (accessMask == 0)
1065 {
1066 throw new ArgumentException(System.SR.Argument_ArgumentZero, "accessMask");
1067 }
1068 if (qualifier == AceQualifier.SystemAudit && (flags & AceFlags.AuditFlags) == 0)
1069 {
1071 }
1072 if (sid == null)
1073 {
1074 throw new ArgumentNullException("sid");
1075 }
1077 for (int i = 0; i < Count; i++)
1078 {
1079 QualifiedAce qualifiedAce = _acl[i] as QualifiedAce;
1080 if (qualifiedAce == null || (qualifiedAce.AceFlags & AceFlags.Inherited) != 0 || qualifiedAce.AceQualifier != qualifier || qualifiedAce.SecurityIdentifier != sid || qualifiedAce.AceFlags != flags || qualifiedAce.AccessMask != accessMask)
1081 {
1082 continue;
1083 }
1084 if (IsDS)
1085 {
1086 if (qualifiedAce is ObjectAce objectAce && objectFlags != 0)
1087 {
1088 if (!objectAce.ObjectTypesMatch(objectFlags, objectType) || !objectAce.InheritedObjectTypesMatch(objectFlags, inheritedObjectType))
1089 {
1090 continue;
1091 }
1092 }
1093 else if (qualifiedAce is ObjectAce || objectFlags != 0)
1094 {
1095 continue;
1096 }
1097 }
1098 _acl.RemoveAce(i);
1099 i--;
1100 }
1102 }
1103
1104 internal virtual void OnAclModificationTried()
1105 {
1106 }
1107
1108 public sealed override void GetBinaryForm(byte[] binaryForm, int offset)
1109 {
1111 _acl.GetBinaryForm(binaryForm, offset);
1112 }
1113
1115 {
1117 for (int num = _acl.Count - 1; num >= 0; num--)
1118 {
1119 GenericAce genericAce = _acl[num];
1120 if ((genericAce.AceFlags & AceFlags.Inherited) != 0)
1121 {
1122 _acl.RemoveAce(num);
1123 }
1124 }
1126 }
1127
1128 public void Purge(SecurityIdentifier sid)
1129 {
1130 if (sid == null)
1131 {
1132 throw new ArgumentNullException("sid");
1133 }
1135 for (int num = Count - 1; num >= 0; num--)
1136 {
1137 KnownAce knownAce = _acl[num] as KnownAce;
1138 if (!(knownAce == null) && (knownAce.AceFlags & AceFlags.Inherited) == 0 && knownAce.SecurityIdentifier == sid)
1139 {
1140 _acl.RemoveAce(num);
1141 }
1142 }
1144 }
1145}
static string InvalidOperation_ModificationOfNonCanonicalAcl
Definition SR.cs:82
static string ArgumentOutOfRange_Enum
Definition SR.cs:18
static string Argument_InvalidAnyFlag
Definition SR.cs:54
static string Arg_EnumAtLeastOneFlag
Definition SR.cs:44
static string Argument_ArgumentZero
Definition SR.cs:52
static string NotSupported_SetMethod
Definition SR.cs:98
Definition SR.cs:7
bool AceFlagsAreMergeable(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:493
bool InheritedObjectTypesMatch(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:472
CommonAcl(bool isContainer, bool isDS, byte revision, int capacity)
Definition CommonAcl.cs:750
CommonAcl(bool isContainer, bool isDS, RawAcl rawAcl, bool trusted, bool isDacl)
Definition CommonAcl.cs:758
bool RemoveQualifiedAces(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, bool saclSemantics, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
Definition CommonAcl.cs:894
static AceFlags AceFlagsFromAF(AF af, bool isDS)
Definition CommonAcl.cs:158
void RemoveQualifiedAcesSpecific(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
bool AccessMasksAreMergeable(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:479
static AF AFFromAceFlags(AceFlags aceFlags, bool isDS)
Definition CommonAcl.cs:136
static bool AceOpaquesMatch(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:555
bool ObjectTypesMatch(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:465
void RemoveMeaninglessAcesAndFlags(bool isDacl)
Definition CommonAcl.cs:411
static bool RemoveInheritanceBits(AceFlags existing, AceFlags remove, bool isDS, out AceFlags result, out bool total)
Definition CommonAcl.cs:201
void CheckFlags(InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
Definition CommonAcl.cs:802
void AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
Definition CommonAcl.cs:822
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
bool MergeAces(ref QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:606
static int SaclAcePriority(GenericAce ace)
Definition CommonAcl.cs:263
static ComparisonResult CompareAces(GenericAce ace1, GenericAce ace2, bool isDacl)
Definition CommonAcl.cs:287
bool InspectAce(ref GenericAce ace, bool isDacl)
Definition CommonAcl.cs:359
static int DaclAcePriority(GenericAce ace)
Definition CommonAcl.cs:237
void Canonicalize(bool compact, bool isDacl)
Definition CommonAcl.cs:423
override void GetBinaryForm(byte[] binaryForm, int offset)
void Purge(SecurityIdentifier sid)
void CheckAccessType(AccessControlType accessType)
Definition CommonAcl.cs:794
static bool AcesAreMergeable(QualifiedAce ace, QualifiedAce newAce)
Definition CommonAcl.cs:577
void SetQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, int accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
Definition CommonAcl.cs:860
void QuickSort(int left, int right, bool isDacl)
Definition CommonAcl.cs:314
static bool MergeInheritanceBits(AceFlags left, AceFlags right, bool isDS, out AceFlags result)
Definition CommonAcl.cs:180
void GetObjectTypesForSplit(ObjectAce originalAce, int accessMask, AceFlags aceFlags, out ObjectAceFlags objectFlags, out Guid objectType, out Guid inheritedObjectType)
Definition CommonAcl.cs:448
SecurityIdentifier SecurityIdentifier
Definition KnownAce.cs:25
override void GetBinaryForm(byte[] binaryForm, int offset)
Definition RawAcl.cs:155
void InsertAce(int index, GenericAce ace)
Definition RawAcl.cs:172
void SetBinaryForm(byte[] binaryForm, int offset)
Definition RawAcl.cs:107
override bool Equals([NotNullWhen(true)] object? o)
Definition Guid.cs:706
static readonly Guid Empty
Definition Guid.cs:86