2005-01-31 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System.Security.Policy / FileCodeGroup.cs
1 //
2 // System.Security.Policy.FileCodeGroup
3 //
4 // Author(s):
5 //   Nick Drochak (ndrochak@gol.com)
6 //
7 // (C) 2001 Nick Drochak, All rights reserved.
8 // Copyright (C) 2004 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.Collections;
31 using System.Runtime.InteropServices;
32 using System.Security.Permissions;
33
34 namespace System.Security.Policy {
35
36         [Serializable]
37         public sealed class FileCodeGroup : CodeGroup {
38
39                 private FileIOPermissionAccess m_access;
40 #if NET_2_0
41                 private CodeGroupGrantScope _scope = CodeGroupGrantScope.Assembly;
42 #endif
43
44                 public FileCodeGroup (IMembershipCondition membershipCondition, FileIOPermissionAccess access) 
45                         : base (membershipCondition, null)
46                 {
47                         // note: FileIOPermissionAccess is a [Flag]
48                         m_access = access;
49                 }
50
51                 // for PolicyLevel (to avoid validation duplication)
52                 internal FileCodeGroup (SecurityElement e, PolicyLevel level)
53                         : base (e, level)
54                 {
55                 }
56
57                 public override CodeGroup Copy ()
58                 {
59                         FileCodeGroup copy = new FileCodeGroup (MembershipCondition, m_access);
60                         copy.Name = this.Name;
61                         copy.Description = this.Description;
62                         foreach (CodeGroup child in Children) {
63                                 copy.AddChild (child.Copy ());  // deep copy
64                         }
65                         return copy;
66                 }
67                 
68                 public override string MergeLogic {
69                         get { return "Union";}
70                 }
71
72                 public override PolicyStatement Resolve (Evidence evidence)
73                 {
74                         if (null == evidence)
75                                 throw new ArgumentNullException("evidence");
76
77                         if (!MembershipCondition.Check (evidence))
78                                 return null;
79
80                         PolicyStatement pst = null;
81                         if (this.PolicyStatement != null)
82                                 pst = this.PolicyStatement.Copy ();
83                         else
84                                 pst = PolicyStatement.Empty ();
85
86                         if (this.Children.Count > 0) {
87                                 foreach (CodeGroup child_cg in this.Children) {
88                                         PolicyStatement child_pst = child_cg.Resolve (evidence);
89                                         if (child_pst != null) {
90                                                 foreach (IPermission perm in child_pst.PermissionSet) {
91                                                         pst.PermissionSet.AddPermission (perm);
92                                                 }
93                                         }
94                                 }
95                         }
96                         return pst;
97                 }
98
99                 public override CodeGroup ResolveMatchingCodeGroups(Evidence evidence)
100                 {
101                         if (null == evidence)
102                                 throw new ArgumentNullException("evidence");
103
104                         if (!MembershipCondition.Check (evidence))
105                                 return null;
106
107                         FileCodeGroup matchRoot = new FileCodeGroup (MembershipCondition, m_access);
108
109                         foreach (CodeGroup child in Children) {
110                                 CodeGroup childMatchingCodeGroup = child.ResolveMatchingCodeGroups (evidence);
111                                 if (childMatchingCodeGroup != null)
112                                         matchRoot.AddChild (childMatchingCodeGroup);
113                         }
114
115                         return matchRoot;
116                 }
117
118                 public override string AttributeString {
119                         get { return null; }
120                 }
121
122                 public override string PermissionSetName {
123                         get { return "Same directory FileIO - " + m_access.ToString (); }
124                 }
125
126 #if NET_2_0
127                 [ComVisible (false)]
128                 public CodeGroupGrantScope Scope {
129                         get { return _scope; }
130                         set { _scope = value; }
131                 }
132 #endif
133
134                 public override bool Equals (object o)
135                 {
136                         if (!(o is FileCodeGroup))
137                                 return false;
138
139                         if (this.m_access != ((FileCodeGroup)o).m_access)
140                                 return false;
141
142                         return Equals((CodeGroup)o, false);
143                 }
144
145                 public override int GetHashCode ()
146                 {
147                         return m_access.GetHashCode ();
148                 }
149
150                 protected override void ParseXml (SecurityElement e, PolicyLevel level)
151                 {
152                         string a = e.Attribute ("Access");
153                         if (a != null)
154                                 m_access = (FileIOPermissionAccess) Enum.Parse (typeof (FileIOPermissionAccess), a, true);
155                         else
156                                 m_access = FileIOPermissionAccess.NoAccess;
157                 }
158                 
159                 protected override void CreateXml (SecurityElement element, PolicyLevel level)
160                 {
161                         element.AddAttribute ("Access", m_access.ToString ());
162                 }
163         }
164 }