FileSecurityTest.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // FileSecurityTest.cs - NUnit Test Cases for FileSecurity
  2. //
  3. // Authors:
  4. // James Bellinger ([email protected])
  5. using System;
  6. using System.IO;
  7. using System.Security.AccessControl;
  8. using System.Security.Principal;
  9. using NUnit.Framework;
  10. namespace MonoTests.System.Security.AccessControl
  11. {
  12. [TestFixture]
  13. public class FileSecurityTest
  14. {
  15. [Test]
  16. public void ChangeGroupToEveryone ()
  17. {
  18. FileSecurity security;
  19. if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
  20. Assert.Ignore ();
  21. }
  22. string path = Path.GetTempFileName ();
  23. try {
  24. SecurityIdentifier worldSid = new SecurityIdentifier ("WD");
  25. security = File.GetAccessControl (path);
  26. security.SetGroup (worldSid);
  27. File.SetAccessControl (path, security);
  28. security = File.GetAccessControl (path);
  29. Assert.AreEqual (worldSid, security.GetGroup (typeof(SecurityIdentifier)));
  30. } finally {
  31. File.Delete (path);
  32. }
  33. }
  34. [Test]
  35. public void ChangeAccessRules ()
  36. {
  37. FileSecurity security;
  38. if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
  39. Assert.Ignore ();
  40. }
  41. string path = Path.GetTempFileName ();
  42. try {
  43. // Add 'Everyone' to the access list.
  44. SecurityIdentifier worldSid = new SecurityIdentifier ("WD");
  45. security = File.GetAccessControl (path);
  46. FileSystemAccessRule rule = new FileSystemAccessRule (worldSid,
  47. FileSystemRights.FullControl,
  48. AccessControlType.Allow);
  49. security.AddAccessRule (rule);
  50. File.SetAccessControl (path, security);
  51. // Make sure 'Everyone' is *on* the access list.
  52. // Let's use the SafeHandle overload to check it.
  53. AuthorizationRuleCollection rules;
  54. using (FileStream file = File.Open (path, FileMode.Open, FileAccess.Read)) {
  55. security = file.GetAccessControl ();
  56. rules = security.GetAccessRules (true, false, typeof (SecurityIdentifier));
  57. Assert.AreEqual (1, rules.Count);
  58. Assert.AreEqual (worldSid, rules[0].IdentityReference);
  59. Assert.AreEqual (InheritanceFlags.None, rules[0].InheritanceFlags);
  60. Assert.AreEqual (PropagationFlags.None, rules[0].PropagationFlags);
  61. Assert.IsFalse (rules[0].IsInherited);
  62. }
  63. // Remove 'Everyone' from the access list.
  64. security.RemoveAccessRuleSpecific (rule);
  65. File.SetAccessControl (path, security);
  66. // Make sure our non-inherited access control list is now empty.
  67. security = File.GetAccessControl (path);
  68. rules = security.GetAccessRules (true, false, typeof (SecurityIdentifier));
  69. Assert.AreEqual (0, rules.Count);
  70. } finally {
  71. File.Delete (path);
  72. }
  73. }
  74. [Test, ExpectedException (typeof (UnauthorizedAccessException))]
  75. public void EveryoneMayNotBeOwner ()
  76. {
  77. FileSecurity security;
  78. if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
  79. Assert.Ignore ();
  80. }
  81. string path = Path.GetTempFileName ();
  82. try {
  83. security = File.GetAccessControl (path);
  84. security.SetOwner (new SecurityIdentifier ("WD"));
  85. File.SetAccessControl (path, security);
  86. // If we don't get an InvalidOperationException it could be that we are running
  87. // with administrator privileges. Don't fail the test if that is the case.
  88. WindowsIdentity identity = WindowsIdentity.GetCurrent ();
  89. WindowsPrincipal principal = new WindowsPrincipal (identity);
  90. if (principal.IsInRole (WindowsBuiltInRole.Administrator)) {
  91. Assert.Ignore ("Running as Administrator");
  92. }
  93. } finally {
  94. File.Delete (path);
  95. }
  96. }
  97. }
  98. }