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

◆ ModifyAccess() [2/2]

bool System.Security.AccessControl.DirectoryObjectSecurity.ModifyAccess ( AccessControlModification modification,
ObjectAccessRule rule,
out bool modified )
inlineprivate

Definition at line 152 of file DirectoryObjectSecurity.cs.

153 {
154 bool flag = true;
155 if (base.SecurityDescriptor.DiscretionaryAcl == null)
156 {
157 if (modification == AccessControlModification.Remove || modification == AccessControlModification.RemoveAll || modification == AccessControlModification.RemoveSpecific)
158 {
159 modified = false;
160 return flag;
161 }
162 base.SecurityDescriptor.AddDiscretionaryAcl(GenericAcl.AclRevisionDS, 1);
163 }
164 else if ((modification == AccessControlModification.Add || modification == AccessControlModification.Set || modification == AccessControlModification.Reset) && rule.ObjectFlags != 0 && base.SecurityDescriptor.DiscretionaryAcl.Revision < GenericAcl.AclRevisionDS)
165 {
166 byte[] array = new byte[base.SecurityDescriptor.DiscretionaryAcl.BinaryLength];
167 base.SecurityDescriptor.DiscretionaryAcl.GetBinaryForm(array, 0);
168 array[0] = GenericAcl.AclRevisionDS;
169 base.SecurityDescriptor.DiscretionaryAcl = new DiscretionaryAcl(base.IsContainer, base.IsDS, new RawAcl(array, 0));
170 }
172 if (rule.AccessControlType == AccessControlType.Allow)
173 {
174 switch (modification)
175 {
177 base.SecurityDescriptor.DiscretionaryAcl.AddAccess(AccessControlType.Allow, sid, rule);
178 break;
180 base.SecurityDescriptor.DiscretionaryAcl.SetAccess(AccessControlType.Allow, sid, rule);
181 break;
182 case AccessControlModification.Reset:
183 base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Deny, sid, -1, InheritanceFlags.ContainerInherit, PropagationFlags.None, ObjectAceFlags.None, Guid.Empty, Guid.Empty);
184 base.SecurityDescriptor.DiscretionaryAcl.SetAccess(AccessControlType.Allow, sid, rule);
185 break;
186 case AccessControlModification.Remove:
187 flag = base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, sid, rule);
188 break;
189 case AccessControlModification.RemoveAll:
190 flag = base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, sid, -1, InheritanceFlags.ContainerInherit, PropagationFlags.None, ObjectAceFlags.None, Guid.Empty, Guid.Empty);
191 if (!flag)
192 {
194 }
195 break;
196 case AccessControlModification.RemoveSpecific:
197 base.SecurityDescriptor.DiscretionaryAcl.RemoveAccessSpecific(AccessControlType.Allow, sid, rule);
198 break;
199 default:
200 throw new ArgumentOutOfRangeException("modification", System.SR.ArgumentOutOfRange_Enum);
201 }
202 }
203 else
204 {
205 if (rule.AccessControlType != AccessControlType.Deny)
206 {
207 throw new ArgumentException(System.SR.Format(System.SR.TypeUnrecognized_AccessControl, rule.AccessControlType));
208 }
209 switch (modification)
210 {
212 base.SecurityDescriptor.DiscretionaryAcl.AddAccess(AccessControlType.Deny, sid, rule);
213 break;
215 base.SecurityDescriptor.DiscretionaryAcl.SetAccess(AccessControlType.Deny, sid, rule);
216 break;
217 case AccessControlModification.Reset:
218 base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, sid, -1, InheritanceFlags.ContainerInherit, PropagationFlags.None, ObjectAceFlags.None, Guid.Empty, Guid.Empty);
219 base.SecurityDescriptor.DiscretionaryAcl.SetAccess(AccessControlType.Deny, sid, rule);
220 break;
221 case AccessControlModification.Remove:
222 flag = base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Deny, sid, rule);
223 break;
224 case AccessControlModification.RemoveAll:
225 flag = base.SecurityDescriptor.DiscretionaryAcl.RemoveAccess(AccessControlType.Deny, sid, -1, InheritanceFlags.ContainerInherit, PropagationFlags.None, ObjectAceFlags.None, Guid.Empty, Guid.Empty);
226 if (!flag)
227 {
229 }
230 break;
231 case AccessControlModification.RemoveSpecific:
232 base.SecurityDescriptor.DiscretionaryAcl.RemoveAccessSpecific(AccessControlType.Deny, sid, rule);
233 break;
234 default:
235 throw new ArgumentOutOfRangeException("modification", System.SR.ArgumentOutOfRange_Enum);
236 }
237 }
238 modified = flag;
239 base.AccessRulesModified |= modified;
240 return flag;
241 }
static string ArgumentOutOfRange_Enum
Definition SR.cs:18
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string TypeUnrecognized_AccessControl
Definition SR.cs:26
static string InvalidOperation_RemoveFail
Definition SR.cs:28
Definition SR.cs:7

References System.Security.AccessControl.AccessRule< T >.AccessControlType, System.Security.AccessControl.GenericAcl.AclRevisionDS, System.SR.ArgumentOutOfRange_Enum, System.array, System.Security.AccessControl.DiscretionaryAcl, System.Guid.Empty, System.SR.Format(), System.Security.AccessControl.AuthorizationRule.IdentityReference, System.SR.InvalidOperation_RemoveFail, System.Security.AccessControl.ObjectAccessRule.ObjectFlags, System.Security.Principal.IdentityReference.Translate(), and System.SR.TypeUnrecognized_AccessControl.

Referenced by System.Security.AccessControl.DirectoryObjectSecurity.AddAccessRule(), System.Security.AccessControl.DirectoryObjectSecurity.ModifyAccess(), System.Security.AccessControl.DirectoryObjectSecurity.RemoveAccessRule(), System.Security.AccessControl.DirectoryObjectSecurity.RemoveAccessRuleAll(), System.Security.AccessControl.DirectoryObjectSecurity.RemoveAccessRuleSpecific(), System.Security.AccessControl.DirectoryObjectSecurity.ResetAccessRule(), and System.Security.AccessControl.DirectoryObjectSecurity.SetAccessRule().