CommonObjectSecurityTest.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // CommonObjectSecurityTest.cs - NUnit Test Cases for CommonObjectSecurity
  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 CommonObjectSecurityTest
  16. {
  17. [Test]
  18. public void Defaults ()
  19. {
  20. TestSecurity security;
  21. security = new TestSecurity (false);
  22. Assert.IsFalse (security.IsContainerTest);
  23. Assert.IsFalse (security.IsDSTest);
  24. security = new TestSecurity (true);
  25. Assert.IsTrue (security.IsContainerTest);
  26. Assert.IsFalse (security.IsDSTest);
  27. }
  28. [Test]
  29. public void AddAndGetAccessRulesWorkAndMergeCorrectly ()
  30. {
  31. var security = new TestSecurity (false);
  32. // CommonObjectSecurity does not appear to care at all about types on MS.NET.
  33. // It just uses AccessMask, and then GetAccessRules uses the factory methods.
  34. // So, the whole API is a mess of strong typing and repeated code backed by nothing.
  35. Assert.IsFalse (security.modify_access_called);
  36. SecurityIdentifier sid = new SecurityIdentifier (WellKnownSidType.WorldSid, null);
  37. security.AddAccessRuleTest (new TestAccessRule<int> (sid, 2, AccessControlType.Allow));
  38. security.AddAccessRuleTest (new TestAccessRule<TestRights> (sid, TestRights.One, AccessControlType.Allow));
  39. security.AddAccessRuleTest (new TestAccessRule<int> (sid, 4, AccessControlType.Allow));
  40. Assert.IsTrue (security.modify_access_called);
  41. Assert.IsFalse (security.modify_access_rule_called);
  42. Assert.IsFalse (security.modify_audit_called);
  43. Assert.IsFalse (security.access_rule_factory_called);
  44. AuthorizationRuleCollection rules1 = security.GetAccessRules (false, true, typeof (SecurityIdentifier));
  45. Assert.IsFalse (security.access_rule_factory_called);
  46. Assert.AreEqual (0, rules1.Count);
  47. Assert.IsFalse (security.access_rule_factory_called);
  48. AuthorizationRuleCollection rules2 = security.GetAccessRules (true, true, typeof (SecurityIdentifier));
  49. Assert.IsTrue (security.access_rule_factory_called);
  50. Assert.AreEqual (1, rules2.Count);
  51. Assert.IsInstanceOfType (typeof (TestAccessRule<TestRights>), rules2[0]);
  52. TestAccessRule<TestRights> rule = (TestAccessRule<TestRights>)rules2[0];
  53. Assert.AreEqual ((TestRights)7, rule.Rights);
  54. }
  55. [Test]
  56. public void AddAndPurgeWorks ()
  57. {
  58. TestSecurity security = new TestSecurity (false);
  59. NTAccount nta1 = new NTAccount(@"BUILTIN\Users");
  60. NTAccount nta2 = new NTAccount(@"BUILTIN\Administrators");
  61. security.AddAccessRuleTest (new TestAccessRule<TestRights> (nta1, TestRights.One,
  62. AccessControlType.Allow));
  63. security.AddAccessRuleTest (new TestAccessRule<TestRights> (nta2, TestRights.One,
  64. AccessControlType.Allow));
  65. AuthorizationRuleCollection rules1 = security.GetAccessRules (true, true, typeof (NTAccount));
  66. Assert.AreEqual (2, rules1.Count);
  67. security.PurgeAccessRules (nta1);
  68. AuthorizationRuleCollection rules2 = security.GetAccessRules (true, true, typeof (NTAccount));
  69. Assert.AreEqual (1, rules2.Count);
  70. Assert.IsInstanceOfType (typeof (TestAccessRule<TestRights>), rules2[0]);
  71. TestAccessRule<TestRights> rule = (TestAccessRule<TestRights>)rules2[0];
  72. Assert.AreEqual (nta2, rule.IdentityReference);
  73. }
  74. [Test]
  75. public void ResetAccessRuleCausesExactlyOneModifyAccessCall ()
  76. {
  77. TestSecurity security = new TestSecurity (false);
  78. SecurityIdentifier sid = new SecurityIdentifier ("WD");
  79. security.ResetAccessRuleTest (new TestAccessRule<TestRights> (sid, TestRights.One,
  80. AccessControlType.Allow));
  81. Assert.AreEqual (1, security.modify_access_called_count);
  82. }
  83. class TestAccessRule<T> : AccessRule
  84. {
  85. public TestAccessRule (IdentityReference identity, T rules,
  86. AccessControlType type)
  87. : this (identity, rules, InheritanceFlags.None, PropagationFlags.None, type)
  88. {
  89. }
  90. public TestAccessRule (IdentityReference identity, T rules,
  91. InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags,
  92. AccessControlType type)
  93. : base (identity, (int)(object)rules, false, inheritanceFlags, propagationFlags, type)
  94. {
  95. }
  96. public T Rights {
  97. get { return (T)(object)AccessMask; }
  98. }
  99. }
  100. class TestAuditRule<T> : AuditRule
  101. {
  102. public TestAuditRule (IdentityReference identity, T rules,
  103. InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags,
  104. AuditFlags auditFlags)
  105. : base (identity, (int)(object)rules, false, inheritanceFlags, propagationFlags, auditFlags)
  106. {
  107. }
  108. }
  109. enum TestRights
  110. {
  111. One = 1
  112. }
  113. class TestSecurity : CommonObjectSecurity
  114. {
  115. public bool access_rule_factory_called;
  116. public bool audit_rule_factory_called;
  117. public bool modify_access_called;
  118. public int modify_access_called_count;
  119. public bool modify_access_rule_called;
  120. public bool modify_audit_called;
  121. public bool modify_audit_rule_called;
  122. public TestSecurity (bool isContainer)
  123. : base (isContainer)
  124. {
  125. }
  126. public bool IsContainerTest {
  127. get { return IsContainer; }
  128. }
  129. public bool IsDSTest {
  130. get { return IsDS; }
  131. }
  132. public void AddAccessRuleTest (AccessRule rule)
  133. {
  134. AddAccessRule (rule);
  135. }
  136. public void AddAuditRuleTest (AuditRule rule)
  137. {
  138. AddAuditRule (rule);
  139. }
  140. public bool RemoveAccessRuleTest (AccessRule rule)
  141. {
  142. return RemoveAccessRule (rule);
  143. }
  144. public void RemoveAccessRuleAllTest (AccessRule rule)
  145. {
  146. RemoveAccessRuleAll (rule);
  147. }
  148. public void RemoveAccessRuleSpecificTest (AccessRule rule)
  149. {
  150. RemoveAccessRuleSpecific (rule);
  151. }
  152. public void ResetAccessRuleTest (AccessRule rule)
  153. {
  154. ResetAccessRule (rule);
  155. }
  156. public override AccessRule AccessRuleFactory (IdentityReference identityReference,
  157. int accessMask, bool isInherited,
  158. InheritanceFlags inheritanceFlags,
  159. PropagationFlags propagationFlags,
  160. AccessControlType type)
  161. {
  162. access_rule_factory_called = true;
  163. return new TestAccessRule<TestRights> (identityReference, (TestRights)accessMask,
  164. inheritanceFlags, propagationFlags, type);
  165. }
  166. public override AuditRule AuditRuleFactory (IdentityReference identityReference,
  167. int accessMask, bool isInherited,
  168. InheritanceFlags inheritanceFlags,
  169. PropagationFlags propagationFlags,
  170. AuditFlags flags)
  171. {
  172. audit_rule_factory_called = true;
  173. return new TestAuditRule<TestRights> (identityReference, (TestRights)accessMask,
  174. inheritanceFlags, propagationFlags, flags);
  175. }
  176. public override bool ModifyAccessRule (AccessControlModification modification,
  177. AccessRule rule, out bool modified)
  178. {
  179. modify_access_rule_called = true;
  180. return base.ModifyAccessRule (modification, rule, out modified);
  181. }
  182. protected override bool ModifyAccess (AccessControlModification modification,
  183. AccessRule rule, out bool modified)
  184. {
  185. modify_access_called = true;
  186. modify_access_called_count ++;
  187. return base.ModifyAccess (modification, rule, out modified);
  188. }
  189. public override bool ModifyAuditRule (AccessControlModification modification,
  190. AuditRule rule, out bool modified)
  191. {
  192. modify_audit_rule_called = true;
  193. return base.ModifyAuditRule (modification, rule, out modified);
  194. }
  195. protected override bool ModifyAudit (AccessControlModification modification,
  196. AuditRule rule, out bool modified)
  197. {
  198. modify_audit_called = true;
  199. return base.ModifyAudit (modification, rule, out modified);
  200. }
  201. public override Type AccessRightType {
  202. get { return typeof (TestRights); }
  203. }
  204. public override Type AccessRuleType {
  205. get { return typeof (TestAccessRule<TestRights>); }
  206. }
  207. public override Type AuditRuleType {
  208. get { return typeof (TestAuditRule<TestRights>); }
  209. }
  210. }
  211. }
  212. }