Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CommonObjectSecurity.cs
Go to the documentation of this file.
3
5
6public abstract class CommonObjectSecurity : ObjectSecurity
7{
8 protected CommonObjectSecurity(bool isContainer)
9 : base(isContainer, isDS: false)
10 {
11 }
12
14 : base(securityDescriptor)
15 {
16 }
17
18 private static bool IsValidTargetTypeStatic(Type targetType)
19 {
20 if (targetType == typeof(NTAccount))
21 {
22 return true;
23 }
24 if (targetType == typeof(SecurityIdentifier))
25 {
26 return true;
27 }
28 return false;
29 }
30
31 private AuthorizationRuleCollection GetRules(bool access, bool includeExplicit, bool includeInherited, Type targetType)
32 {
33 ReadLock();
34 try
35 {
36 AuthorizationRuleCollection authorizationRuleCollection = new AuthorizationRuleCollection();
37 if (!IsValidTargetTypeStatic(targetType))
38 {
40 }
41 CommonAcl commonAcl = null;
42 if (access)
43 {
44 if ((_securityDescriptor.ControlFlags & ControlFlags.DiscretionaryAclPresent) != 0)
45 {
47 }
48 }
49 else if ((_securityDescriptor.ControlFlags & ControlFlags.SystemAclPresent) != 0)
50 {
52 }
53 if (commonAcl == null)
54 {
55 return authorizationRuleCollection;
56 }
57 IdentityReferenceCollection identityReferenceCollection = null;
58 if (targetType != typeof(SecurityIdentifier))
59 {
60 IdentityReferenceCollection identityReferenceCollection2 = new IdentityReferenceCollection(commonAcl.Count);
61 for (int i = 0; i < commonAcl.Count; i++)
62 {
63 CommonAce commonAce = commonAcl[i] as CommonAce;
64 if (AceNeedsTranslation(commonAce, access, includeExplicit, includeInherited))
65 {
66 identityReferenceCollection2.Add(commonAce.SecurityIdentifier);
67 }
68 }
69 identityReferenceCollection = identityReferenceCollection2.Translate(targetType);
70 }
71 int num = 0;
72 for (int j = 0; j < commonAcl.Count; j++)
73 {
74 CommonAce commonAce2 = commonAcl[j] as CommonAce;
75 if (AceNeedsTranslation(commonAce2, access, includeExplicit, includeInherited))
76 {
77 IdentityReference identityReference = ((targetType == typeof(SecurityIdentifier)) ? commonAce2.SecurityIdentifier : identityReferenceCollection[num++]);
78 if (access)
79 {
80 authorizationRuleCollection.AddRule(AccessRuleFactory(type: (commonAce2.AceQualifier != 0) ? AccessControlType.Deny : AccessControlType.Allow, identityReference: identityReference, accessMask: commonAce2.AccessMask, isInherited: commonAce2.IsInherited, inheritanceFlags: commonAce2.InheritanceFlags, propagationFlags: commonAce2.PropagationFlags));
81 }
82 else
83 {
84 authorizationRuleCollection.AddRule(AuditRuleFactory(identityReference, commonAce2.AccessMask, commonAce2.IsInherited, commonAce2.InheritanceFlags, commonAce2.PropagationFlags, commonAce2.AuditFlags));
85 }
86 }
87 }
88 return authorizationRuleCollection;
89 }
90 finally
91 {
92 ReadUnlock();
93 }
94 }
95
96 private bool AceNeedsTranslation([NotNullWhen(true)] CommonAce ace, bool isAccessAce, bool includeExplicit, bool includeInherited)
97 {
98 if (ace == null)
99 {
100 return false;
101 }
102 if (isAccessAce)
103 {
104 if (ace.AceQualifier != 0 && ace.AceQualifier != AceQualifier.AccessDenied)
105 {
106 return false;
107 }
108 }
109 else if (ace.AceQualifier != AceQualifier.SystemAudit)
110 {
111 return false;
112 }
113 if ((includeExplicit && (ace.AceFlags & AceFlags.Inherited) == 0) || (includeInherited && (ace.AceFlags & AceFlags.Inherited) != 0))
114 {
115 return true;
116 }
117 return false;
118 }
119
120 protected override bool ModifyAccess(AccessControlModification modification, AccessRule rule, out bool modified)
121 {
122 if (rule == null)
123 {
124 throw new ArgumentNullException("rule");
125 }
126 WriteLock();
127 try
128 {
129 bool flag = true;
131 {
132 if (modification == AccessControlModification.Remove || modification == AccessControlModification.RemoveAll || modification == AccessControlModification.RemoveSpecific)
133 {
134 modified = false;
135 return flag;
136 }
137 _securityDescriptor.DiscretionaryAcl = new DiscretionaryAcl(base.IsContainer, base.IsDS, GenericAcl.AclRevision, 1);
138 _securityDescriptor.AddControlFlags(ControlFlags.DiscretionaryAclPresent);
139 }
141 if (rule.AccessControlType == AccessControlType.Allow)
142 {
143 switch (modification)
144 {
147 break;
150 break;
151 case AccessControlModification.Reset:
154 break;
155 case AccessControlModification.Remove:
157 break;
158 case AccessControlModification.RemoveAll:
159 flag = _securityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, sid, -1, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None);
160 if (!flag)
161 {
162 throw new InvalidOperationException();
163 }
164 break;
165 case AccessControlModification.RemoveSpecific:
167 break;
168 default:
170 }
171 }
172 else
173 {
174 if (rule.AccessControlType != AccessControlType.Deny)
175 {
177 }
178 switch (modification)
179 {
182 break;
185 break;
186 case AccessControlModification.Reset:
189 break;
190 case AccessControlModification.Remove:
192 break;
193 case AccessControlModification.RemoveAll:
195 if (!flag)
196 {
197 throw new InvalidOperationException();
198 }
199 break;
200 case AccessControlModification.RemoveSpecific:
202 break;
203 default:
205 }
206 }
207 modified = flag;
208 base.AccessRulesModified |= modified;
209 return flag;
210 }
211 finally
212 {
213 WriteUnlock();
214 }
215 }
216
217 protected override bool ModifyAudit(AccessControlModification modification, AuditRule rule, out bool modified)
218 {
219 if (rule == null)
220 {
221 throw new ArgumentNullException("rule");
222 }
223 WriteLock();
224 try
225 {
226 bool flag = true;
227 if (_securityDescriptor.SystemAcl == null)
228 {
229 if (modification == AccessControlModification.Remove || modification == AccessControlModification.RemoveAll || modification == AccessControlModification.RemoveSpecific)
230 {
231 modified = false;
232 return flag;
233 }
234 _securityDescriptor.SystemAcl = new SystemAcl(base.IsContainer, base.IsDS, GenericAcl.AclRevision, 1);
236 }
238 switch (modification)
239 {
242 break;
245 break;
246 case AccessControlModification.Reset:
248 break;
249 case AccessControlModification.Remove:
251 break;
252 case AccessControlModification.RemoveAll:
253 flag = _securityDescriptor.SystemAcl.RemoveAudit(AuditFlags.Success | AuditFlags.Failure, sid, -1, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None);
254 if (!flag)
255 {
256 throw new InvalidOperationException();
257 }
258 break;
259 case AccessControlModification.RemoveSpecific:
261 break;
262 default:
264 }
265 modified = flag;
266 base.AuditRulesModified |= modified;
267 return flag;
268 }
269 finally
270 {
271 WriteUnlock();
272 }
273 }
274
275 protected void AddAccessRule(AccessRule rule)
276 {
277 if (rule == null)
278 {
279 throw new ArgumentNullException("rule");
280 }
281 WriteLock();
282 try
283 {
284 ModifyAccess(AccessControlModification.Add, rule, out var _);
285 }
286 finally
287 {
288 WriteUnlock();
289 }
290 }
291
292 protected void SetAccessRule(AccessRule rule)
293 {
294 if (rule == null)
295 {
296 throw new ArgumentNullException("rule");
297 }
298 WriteLock();
299 try
300 {
301 ModifyAccess(AccessControlModification.Set, rule, out var _);
302 }
303 finally
304 {
305 WriteUnlock();
306 }
307 }
308
309 protected void ResetAccessRule(AccessRule rule)
310 {
311 if (rule == null)
312 {
313 throw new ArgumentNullException("rule");
314 }
315 WriteLock();
316 try
317 {
318 ModifyAccess(AccessControlModification.Reset, rule, out var _);
319 }
320 finally
321 {
322 WriteUnlock();
323 }
324 }
325
326 protected bool RemoveAccessRule(AccessRule rule)
327 {
328 if (rule == null)
329 {
330 throw new ArgumentNullException("rule");
331 }
332 WriteLock();
333 try
334 {
335 if (_securityDescriptor == null)
336 {
337 return true;
338 }
339 bool modified;
340 return ModifyAccess(AccessControlModification.Remove, rule, out modified);
341 }
342 finally
343 {
344 WriteUnlock();
345 }
346 }
347
348 protected void RemoveAccessRuleAll(AccessRule rule)
349 {
350 if (rule == null)
351 {
352 throw new ArgumentNullException("rule");
353 }
354 WriteLock();
355 try
356 {
357 if (_securityDescriptor != null)
358 {
359 ModifyAccess(AccessControlModification.RemoveAll, rule, out var _);
360 }
361 }
362 finally
363 {
364 WriteUnlock();
365 }
366 }
367
369 {
370 if (rule == null)
371 {
372 throw new ArgumentNullException("rule");
373 }
374 WriteLock();
375 try
376 {
377 if (_securityDescriptor != null)
378 {
379 ModifyAccess(AccessControlModification.RemoveSpecific, rule, out var _);
380 }
381 }
382 finally
383 {
384 WriteUnlock();
385 }
386 }
387
388 protected void AddAuditRule(AuditRule rule)
389 {
390 if (rule == null)
391 {
392 throw new ArgumentNullException("rule");
393 }
394 WriteLock();
395 try
396 {
397 ModifyAudit(AccessControlModification.Add, rule, out var _);
398 }
399 finally
400 {
401 WriteUnlock();
402 }
403 }
404
405 protected void SetAuditRule(AuditRule rule)
406 {
407 if (rule == null)
408 {
409 throw new ArgumentNullException("rule");
410 }
411 WriteLock();
412 try
413 {
414 ModifyAudit(AccessControlModification.Set, rule, out var _);
415 }
416 finally
417 {
418 WriteUnlock();
419 }
420 }
421
422 protected bool RemoveAuditRule(AuditRule rule)
423 {
424 if (rule == null)
425 {
426 throw new ArgumentNullException("rule");
427 }
428 WriteLock();
429 try
430 {
431 bool modified;
432 return ModifyAudit(AccessControlModification.Remove, rule, out modified);
433 }
434 finally
435 {
436 WriteUnlock();
437 }
438 }
439
440 protected void RemoveAuditRuleAll(AuditRule rule)
441 {
442 if (rule == null)
443 {
444 throw new ArgumentNullException("rule");
445 }
446 WriteLock();
447 try
448 {
449 ModifyAudit(AccessControlModification.RemoveAll, rule, out var _);
450 }
451 finally
452 {
453 WriteUnlock();
454 }
455 }
456
458 {
459 if (rule == null)
460 {
461 throw new ArgumentNullException("rule");
462 }
463 WriteLock();
464 try
465 {
466 ModifyAudit(AccessControlModification.RemoveSpecific, rule, out var _);
467 }
468 finally
469 {
470 WriteUnlock();
471 }
472 }
473
474 public AuthorizationRuleCollection GetAccessRules(bool includeExplicit, bool includeInherited, Type targetType)
475 {
476 return GetRules(access: true, includeExplicit, includeInherited, targetType);
477 }
478
479 public AuthorizationRuleCollection GetAuditRules(bool includeExplicit, bool includeInherited, Type targetType)
480 {
481 return GetRules(access: false, includeExplicit, includeInherited, targetType);
482 }
483}
static string Arg_MustBeIdentityReferenceType
Definition SR.cs:16
static string Arg_EnumIllegalVal
Definition SR.cs:144
static string ArgumentOutOfRange_Enum
Definition SR.cs:18
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
Definition SR.cs:7
CommonObjectSecurity(CommonSecurityDescriptor securityDescriptor)
override bool ModifyAudit(AccessControlModification modification, AuditRule rule, out bool modified)
AuthorizationRuleCollection GetRules(bool access, bool includeExplicit, bool includeInherited, Type targetType)
AuthorizationRuleCollection GetAuditRules(bool includeExplicit, bool includeInherited, Type targetType)
override bool ModifyAccess(AccessControlModification modification, AccessRule rule, out bool modified)
bool AceNeedsTranslation([NotNullWhen(true)] CommonAce ace, bool isAccessAce, bool includeExplicit, bool includeInherited)
AuthorizationRuleCollection GetAccessRules(bool includeExplicit, bool includeInherited, Type targetType)
void AddAccess(AccessControlType accessType, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
void SetAccess(AccessControlType accessType, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
void RemoveAccessSpecific(AccessControlType accessType, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
bool RemoveAccess(AccessControlType accessType, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
SecurityIdentifier SecurityIdentifier
Definition KnownAce.cs:25
AuditRule AuditRuleFactory(IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
AccessRule AccessRuleFactory(IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
readonly CommonSecurityDescriptor _securityDescriptor
void AddAudit(AuditFlags auditFlags, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
Definition SystemAcl.cs:27
void RemoveAuditSpecific(AuditFlags auditFlags, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
Definition SystemAcl.cs:44
bool RemoveAudit(AuditFlags auditFlags, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
Definition SystemAcl.cs:39
void SetAudit(AuditFlags auditFlags, SecurityIdentifier sid, int accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
Definition SystemAcl.cs:33
IdentityReferenceCollection Translate(Type targetType)
IdentityReference Translate(Type targetType)