Merge pull request #1843 from info-lvsys/patch-1
[mono.git] / mcs / class / corlib / System.Security.AccessControl / SddlAccessRight.cs
1 //
2 // System.Security.AccessControl.SddlAccessRight.cs
3 //
4 // Author:
5 //      Kenneth Bell
6 //
7
8 using System.Collections.Generic;
9
10 namespace System.Security.AccessControl
11 {
12         internal class SddlAccessRight
13         {
14                 public string Name { get; set; }
15                 public int Value { get; set; }
16                 public int ObjectType { get; set; }
17
18                 public static SddlAccessRight LookupByName(string s)
19                 {
20                         foreach (var right in rights) {
21                                 if (right.Name == s)
22                                         return right;
23                         }
24                         
25                         return null;
26                 }
27                 
28                 public static SddlAccessRight[] Decompose(int mask)
29                 {
30                         foreach (var right in rights) {
31                                 if (mask == right.Value)
32                                         return new SddlAccessRight[] {right};
33                         }
34                         
35                         int foundType = 0;
36                         List<SddlAccessRight> found = new List<SddlAccessRight>();
37                         int accountedBits = 0;
38                         foreach (var right in rights) {
39                                 if ((mask & right.Value) == right.Value
40                                     && (accountedBits | right.Value) != accountedBits) {
41                                         
42                                         if (foundType == 0)
43                                                 foundType = right.ObjectType;
44                                         
45                                         if(right.ObjectType != 0
46                                            && foundType != right.ObjectType)
47                                                 return null;
48
49                                         found.Add(right);
50                                         accountedBits |= right.Value;
51                                 }
52                                 
53                                 if (accountedBits == mask)
54                                 {
55                                         return found.ToArray();
56                                 }
57                         }
58                         
59                         return null;
60                 }
61
62                 private static readonly SddlAccessRight[] rights = new SddlAccessRight[] {
63                         new SddlAccessRight { Name = "CC", Value = 0x00000001, ObjectType = 1},
64                         new SddlAccessRight { Name = "DC", Value = 0x00000002, ObjectType = 1},
65                         new SddlAccessRight { Name = "LC", Value = 0x00000004, ObjectType = 1},
66                         new SddlAccessRight { Name = "SW", Value = 0x00000008, ObjectType = 1},
67                         new SddlAccessRight { Name = "RP", Value = 0x00000010, ObjectType = 1},
68                         new SddlAccessRight { Name = "WP", Value = 0x00000020, ObjectType = 1},
69                         new SddlAccessRight { Name = "DT", Value = 0x00000040, ObjectType = 1},
70                         new SddlAccessRight { Name = "LO", Value = 0x00000080, ObjectType = 1},
71                         new SddlAccessRight { Name = "CR", Value = 0x00000100, ObjectType = 1},
72                         
73                         new SddlAccessRight { Name = "SD", Value = 0x00010000},
74                         new SddlAccessRight { Name = "RC", Value = 0x00020000},
75                         new SddlAccessRight { Name = "WD", Value = 0x00040000},
76                         new SddlAccessRight { Name = "WO", Value = 0x00080000},
77                         
78                         new SddlAccessRight { Name = "GA", Value = 0x10000000},
79                         new SddlAccessRight { Name = "GX", Value = 0x20000000},
80                         new SddlAccessRight { Name = "GW", Value = 0x40000000},
81                         new SddlAccessRight { Name = "GR", Value = unchecked((int)0x80000000)},
82
83                         new SddlAccessRight { Name = "FA", Value = 0x001F01FF, ObjectType = 2},
84                         new SddlAccessRight { Name = "FR", Value = 0x00120089, ObjectType = 2},
85                         new SddlAccessRight { Name = "FW", Value = 0x00120116, ObjectType = 2},
86                         new SddlAccessRight { Name = "FX", Value = 0x001200A0, ObjectType = 2},
87                         
88                         new SddlAccessRight { Name = "KA", Value = 0x000F003F, ObjectType = 3},
89                         new SddlAccessRight { Name = "KR", Value = 0x00020019, ObjectType = 3},
90                         new SddlAccessRight { Name = "KW", Value = 0x00020006, ObjectType = 3},
91                         new SddlAccessRight { Name = "KX", Value = 0x00020019, ObjectType = 3},
92
93                         new SddlAccessRight { Name = "NW", Value = 0x00000001},
94                         new SddlAccessRight { Name = "NR", Value = 0x00000002},
95                         new SddlAccessRight { Name = "NX", Value = 0x00000004},
96                 };
97         }
98 }