[corlib] Hunting down rare Task.WaitAll race
[mono.git] / mcs / class / corlib / System.Security.AccessControl / AuthorizationRule.cs
1 //
2 // System.Security.AccessControl.AuthorizationRule implementation
3 //
4 // Authors:
5 //      Dick Porter  <dick@ximian.com>
6 //      Atsushi Enomoto  <atsushi@ximian.com>
7 //
8 // Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Security.Principal;
31
32 namespace System.Security.AccessControl {
33         public abstract class AuthorizationRule
34         {
35                 IdentityReference identity;
36                 int accessMask;
37                 bool isInherited;
38                 InheritanceFlags inheritanceFlags;
39                 PropagationFlags propagationFlags;
40                 
41                 internal AuthorizationRule ()
42                 {
43                         /* Give it a 0-param constructor */
44                 }
45                 
46                 protected internal AuthorizationRule (IdentityReference identity,
47                                                       int accessMask, bool isInherited,
48                                                       InheritanceFlags inheritanceFlags,
49                                                       PropagationFlags propagationFlags)
50                 {
51                         if (null == identity)
52                                 throw new ArgumentNullException ("identity");
53                                 
54                         if (!(identity is SecurityIdentifier) && !(identity is NTAccount))
55                                 throw new ArgumentException ("identity");
56
57                         // Unit testing showed that MS.NET 4.0 actually throws ArgumentException
58                         // for accessMask == 0, not the ArgumentOutOfRangeException specified.                  
59                         if (accessMask == 0)
60                                 throw new ArgumentException ("accessMask");
61
62                         if (0 != (inheritanceFlags & ~(InheritanceFlags.ContainerInherit|InheritanceFlags.ObjectInherit)))
63                                 throw new ArgumentOutOfRangeException ();
64
65                         if (0 != (propagationFlags & ~(PropagationFlags.NoPropagateInherit|PropagationFlags.InheritOnly)))
66                                 throw new ArgumentOutOfRangeException ();
67                         
68                         this.identity = identity;
69                         this.accessMask = accessMask;
70                         this.isInherited = isInherited;
71                         this.inheritanceFlags = inheritanceFlags;
72                         this.propagationFlags = propagationFlags;
73                 }
74
75                 public IdentityReference IdentityReference
76                 {
77                         get {
78                                 return(identity);
79                         }
80                 }
81                 
82                 public InheritanceFlags InheritanceFlags
83                 {
84                         get {
85                                 return(inheritanceFlags);
86                         }
87                 }
88
89                 public bool IsInherited
90                 {
91                         get {
92                                 return(isInherited);
93                         }
94                 }
95
96                 public PropagationFlags PropagationFlags
97                 {
98                         get {
99                                 return(propagationFlags);
100                         }
101                 }
102
103                 protected internal int AccessMask
104                 {
105                         get {
106                                 return(accessMask);
107                         }
108                 }
109         }
110 }
111