Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / corlib / Test / System.Security.AccessControl / RegistrySecurityTest.cs
1 // RegistrySecurityTest.cs - NUnit Test Cases for RegistrySecurity
2 //
3 // Authors:
4 //      James Bellinger (jfb@zer7.com)
5
6 using System;
7 using System.IO;
8 using System.Security.AccessControl;
9 using System.Security.Principal;
10 using Microsoft.Win32;
11 using NUnit.Framework;
12
13 namespace MonoTests.System.Security.AccessControl
14 {
15         [TestFixture]
16         public class RegistrySecurityTest
17         {
18                 [Test]
19                 public void ChangeGroupToEveryone ()
20                 {
21                         string keyName = @"SOFTWARE\Mono RegistrySecurityTest ChangeGroupToEveryone";
22
23                         RegistrySecurity security;
24                         if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
25                                 Assert.Ignore (); return;
26                         }
27
28                         try {
29                                 using (RegistryKey key = Registry.CurrentUser.CreateSubKey (keyName)) {
30                                         // Before we begin manipulating this, make sure we're in the right spot.
31                                         Assert.AreEqual (key.Name, @"HKEY_CURRENT_USER\" + keyName);
32
33                                         // Set the group to Everyone.
34                                         SecurityIdentifier worldSid = new SecurityIdentifier ("WD");
35
36                                         security = key.GetAccessControl ();
37                                         security.SetGroup (worldSid);
38                                         key.SetAccessControl (security);
39
40                                         // Make sure it actually became Everyone.
41                                         security = key.GetAccessControl ();
42                                         Assert.AreEqual (worldSid, security.GetGroup (typeof(SecurityIdentifier)));
43                                 }
44                         } finally {
45                                 Registry.CurrentUser.DeleteSubKey (keyName);
46                         }
47                 }
48
49                 [Test]
50                 public void EveryoneCanRead ()
51                 {
52                         string keyName = @"Software\Mono RegistrySecurityTest EveryoneCanRead";
53
54                         RegistrySecurity security;
55                         if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
56                                 Assert.Ignore (); return;
57                         }
58
59                         try {
60                                 using (RegistryKey key = Registry.CurrentUser.CreateSubKey (keyName)) {
61                                         AuthorizationRuleCollection explicitRules, inheritedRules;
62
63                                         // Before we begin manipulating this, make sure we're in the right spot.
64                                         Assert.AreEqual (key.Name, @"HKEY_CURRENT_USER\" + keyName);
65
66                                         // Let's add Everyone to the read list.
67                                         SecurityIdentifier worldSid = new SecurityIdentifier ("WD");
68
69                                         security = key.GetAccessControl ();
70                                         inheritedRules = security.GetAccessRules (false, true, typeof (SecurityIdentifier));
71                                         Assert.AreNotEqual (0, inheritedRules.Count);
72                                         explicitRules = security.GetAccessRules (true, false, typeof (SecurityIdentifier));
73                                         Assert.AreEqual (0, explicitRules.Count);
74
75                                         security.AddAccessRule (new RegistryAccessRule (worldSid,
76                                                                                         RegistryRights.FullControl,
77                                                                                         AccessControlType.Allow));
78                                         key.SetAccessControl (security);
79
80                                         // Verify that we have our permission!
81                                         security = key.GetAccessControl ();
82                                         inheritedRules = security.GetAccessRules (false, true, typeof (SecurityIdentifier));
83                                         Assert.AreNotEqual (0, inheritedRules.Count);
84                                         explicitRules = security.GetAccessRules (true, false, typeof (SecurityIdentifier));
85                                         Assert.AreEqual (1, explicitRules.Count);
86
87                                         RegistryAccessRule rule = (RegistryAccessRule)explicitRules [0];
88                                         Assert.AreEqual (AccessControlType.Allow, rule.AccessControlType);
89                                         Assert.AreEqual (worldSid, rule.IdentityReference);
90                                         Assert.AreEqual (InheritanceFlags.None, rule.InheritanceFlags);
91                                         Assert.AreEqual (PropagationFlags.None, rule.PropagationFlags);
92                                         Assert.AreEqual (RegistryRights.FullControl, rule.RegistryRights);
93                                         Assert.IsFalse (rule.IsInherited);
94                                 }
95                         } finally {
96                                 Registry.CurrentUser.DeleteSubKey (keyName);
97                         }
98                 }
99         }
100 }
101