DirectoryObjectSecurityTest.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // DirectoryObjectSecurityTest.cs - NUnit Test Cases for DirectoryObjectSecurity
  2. //
  3. // Authors:
  4. // James Bellinger <[email protected]>
  5. //
  6. // Copyright (C) 2012 James Bellinger
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Security.AccessControl;
  10. using System.Security.Principal;
  11. using NUnit.Framework;
  12. namespace MonoTests.System.Security.AccessControl
  13. {
  14. [TestFixture]
  15. public class DirectoryObjectSecurityTest
  16. {
  17. [Test]
  18. public void Defaults ()
  19. {
  20. TestSecurity security = new TestSecurity ();
  21. Assert.IsTrue (security.IsContainerTest);
  22. Assert.IsTrue (security.IsDSTest);
  23. }
  24. [Test, ExpectedExceptionAttribute (typeof (ArgumentOutOfRangeException))]
  25. public void ChecksAccessControlModificationRange ()
  26. {
  27. bool modifiedRet, modifiedOut;
  28. TestSecurity security = new TestSecurity ();
  29. SecurityIdentifier sid = new SecurityIdentifier ("WD");
  30. TestAccessRule rule = new TestAccessRule
  31. (sid, 1, false, InheritanceFlags.None, PropagationFlags.None,
  32. Guid.Empty, Guid.Empty, AccessControlType.Allow);
  33. modifiedRet = security.ModifyAccessRule ((AccessControlModification)43210,
  34. rule, out modifiedOut);
  35. }
  36. [Test]
  37. public void IgnoresResetOnAuditAndReturnsTrue ()
  38. {
  39. bool modifiedRet, modifiedOut;
  40. TestSecurity security = new TestSecurity ();
  41. SecurityIdentifier sid = new SecurityIdentifier ("WD");
  42. TestAuditRule rule = new TestAuditRule
  43. (sid, 1, false, InheritanceFlags.None, PropagationFlags.None,
  44. Guid.Empty, Guid.Empty, AuditFlags.Success);
  45. modifiedRet = security.ModifyAuditRule (AccessControlModification.Reset,
  46. rule, out modifiedOut);
  47. Assert.IsTrue (modifiedRet);
  48. }
  49. [Test, ExpectedException (typeof (ArgumentNullException))]
  50. public void ConstructorFailsOnNullDescriptor ()
  51. {
  52. new TestSecurity (null);
  53. }
  54. [Test]
  55. public void ConstructorLetsFalseDSThrough ()
  56. {
  57. CommonSecurityDescriptor descriptor = new CommonSecurityDescriptor
  58. (false, false, ControlFlags.None, null, null, null, null);
  59. TestSecurity security = new TestSecurity (descriptor);
  60. Assert.IsFalse (security.IsContainerTest);
  61. Assert.IsFalse (security.IsDSTest);
  62. }
  63. [Test]
  64. public void ObjectSecurityJustWrapsCommonSecurityDescriptor ()
  65. {
  66. CommonSecurityDescriptor descriptor = new CommonSecurityDescriptor
  67. (false, false, ControlFlags.None, null, null, null, null);
  68. TestSecurity security = new TestSecurity (descriptor);
  69. Assert.IsNull (security.GetOwner (typeof(SecurityIdentifier)));
  70. SecurityIdentifier sid = new SecurityIdentifier ("WD");
  71. descriptor.Owner = sid; // Not virtual, so the conclusion in the test's title.
  72. Assert.IsFalse (security.OwnerModifiedTest);
  73. Assert.AreSame (sid, security.GetOwner (typeof(SecurityIdentifier)));
  74. security.SetOwner (sid);
  75. Assert.IsTrue (security.OwnerModifiedTest);
  76. Assert.AreSame (sid, security.GetOwner (typeof(SecurityIdentifier)));
  77. }
  78. [Test, ExpectedExceptionAttribute (typeof (InvalidOperationException))]
  79. public void LocksAreEnforced ()
  80. {
  81. TestSecurity security = new TestSecurity ();
  82. bool value = security.OwnerModifiedTestWithoutLock;
  83. }
  84. [Test]
  85. [Category ("NotWorking")] // Mono does not have a working CustomAce implementation yet.
  86. public void ObjectSecurityRemovesWhatItCannotCreate ()
  87. {
  88. RawAcl acl = new RawAcl (GenericAcl.AclRevision, 1);
  89. acl.InsertAce (0, new CustomAce ((AceType)255, AceFlags.None, new byte[4]));
  90. DiscretionaryAcl dacl = new DiscretionaryAcl (true, true, acl);
  91. Assert.AreEqual (1, dacl.Count);
  92. CommonSecurityDescriptor descriptor = new CommonSecurityDescriptor
  93. (true, true, ControlFlags.None, null, null, null, dacl);
  94. TestSecurity security = new TestSecurity (descriptor);
  95. AuthorizationRuleCollection rules = security.GetAccessRules (true, true, typeof (SecurityIdentifier));
  96. Assert.AreEqual (0, rules.Count);
  97. }
  98. [Test]
  99. public void FactoryWithoutGuidsCalledWhenNotObjectAce ()
  100. {
  101. TestSecurity security = FactoryCallTest (false);
  102. Assert.IsTrue (security.access_factory_called);
  103. }
  104. [Test, ExpectedExceptionAttribute (typeof (NotImplementedException))]
  105. public void FactoryWithGuidsThrowsNotImplementedByDefault ()
  106. {
  107. FactoryCallTest (true);
  108. }
  109. TestSecurity FactoryCallTest (bool objectAce)
  110. {
  111. SecurityIdentifier sid = new SecurityIdentifier ("WD");
  112. DiscretionaryAcl dacl = new DiscretionaryAcl (true, true, 1);
  113. dacl.AddAccess (AccessControlType.Allow, sid, 1,
  114. InheritanceFlags.None, PropagationFlags.None,
  115. objectAce ? ObjectAceFlags.ObjectAceTypePresent : ObjectAceFlags.None,
  116. Guid.NewGuid (), Guid.Empty);
  117. CommonSecurityDescriptor descriptor = new CommonSecurityDescriptor
  118. (true, true, ControlFlags.None, null, null, null, dacl);
  119. TestSecurity security = new TestSecurity (descriptor);
  120. security.GetAccessRules (true, true, typeof (SecurityIdentifier));
  121. return security;
  122. }
  123. class TestAccessRule : ObjectAccessRule
  124. {
  125. public TestAccessRule(IdentityReference identity, int accessMask, bool isInherited,
  126. InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags,
  127. Guid objectType, Guid inheritedObjectType,
  128. AccessControlType type)
  129. : base(identity, accessMask, isInherited, inheritanceFlags, propagationFlags,
  130. objectType, inheritedObjectType, type)
  131. {
  132. }
  133. }
  134. class TestAuditRule : ObjectAuditRule
  135. {
  136. public TestAuditRule(IdentityReference identity, int accessMask, bool isInherited,
  137. InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags,
  138. Guid objectType, Guid inheritedObjectType,
  139. AuditFlags flags)
  140. : base(identity, accessMask, isInherited, inheritanceFlags, propagationFlags,
  141. objectType, inheritedObjectType, flags)
  142. {
  143. }
  144. }
  145. class TestSecurity : DirectoryObjectSecurity
  146. {
  147. internal bool access_factory_called;
  148. public TestSecurity ()
  149. {
  150. }
  151. public TestSecurity (CommonSecurityDescriptor descriptor)
  152. : base (descriptor)
  153. {
  154. }
  155. public bool IsContainerTest {
  156. get { return IsContainer; }
  157. }
  158. public bool IsDSTest {
  159. get { return IsDS; }
  160. }
  161. public bool OwnerModifiedTest {
  162. get { ReadLock (); bool value = OwnerModified; ReadUnlock (); return value; }
  163. set { WriteLock (); OwnerModified = value; WriteUnlock (); }
  164. }
  165. public bool OwnerModifiedTestWithoutLock {
  166. get { return OwnerModified; }
  167. }
  168. public override AccessRule AccessRuleFactory (IdentityReference identityReference,
  169. int accessMask, bool isInherited,
  170. InheritanceFlags inheritanceFlags,
  171. PropagationFlags propagationFlags,
  172. AccessControlType type)
  173. {
  174. access_factory_called = true;
  175. return new TestAccessRule (identityReference, accessMask,
  176. isInherited, inheritanceFlags, propagationFlags,
  177. Guid.Empty, Guid.Empty, type);
  178. }
  179. public override AuditRule AuditRuleFactory (IdentityReference identityReference,
  180. int accessMask, bool isInherited,
  181. InheritanceFlags inheritanceFlags,
  182. PropagationFlags propagationFlags,
  183. AuditFlags flags)
  184. {
  185. return new TestAuditRule (identityReference, accessMask,
  186. isInherited, inheritanceFlags, propagationFlags,
  187. Guid.Empty, Guid.Empty, flags);
  188. }
  189. public override Type AccessRightType {
  190. get { return typeof (int); }
  191. }
  192. public override Type AccessRuleType {
  193. get { return typeof (TestAccessRule); }
  194. }
  195. public override Type AuditRuleType {
  196. get { return typeof (TestAuditRule); }
  197. }
  198. }
  199. }
  200. }