1 //
2 // FileIOPermissionAttributeTest.cs -
3 //	NUnit Test Cases for FileIOPermissionAttribute
4 //
5 // Author:
6 //	Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 
31 using NUnit.Framework;
32 using System;
33 using System.IO;
34 using System.Reflection;
35 using System.Security;
36 using System.Security.Permissions;
37 using System.Text;
38 
39 namespace MonoTests.System.Security.Permissions {
40 
41 	[TestFixture]
42 #if MOBILE
43 	[Ignore]
44 #endif
45 	public class FileIOPermissionAttributeTest {
46 
47 		[Test]
Default()48 		public void Default ()
49 		{
50 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
51 			Assert.IsNull (a.Append, "Append");
52 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
53 			Assert.IsNull (a.Read, "Read");
54 			Assert.IsNull (a.Write, "Write");
55 			Assert.IsNotNull (a.AllFiles, "AllFiles");
56 			Assert.IsNotNull (a.AllLocalFiles, "AllLocalFiles");
57 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
58 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
59 
60 			Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId");
61 			Assert.IsFalse (a.Unrestricted, "Unrestricted");
62 
63 			FileIOPermission perm = (FileIOPermission) a.CreatePermission ();
64 			Assert.AreEqual (FileIOPermissionAccess.NoAccess, perm.AllFiles, "CreatePermission-AllFiles");
65 			Assert.AreEqual (FileIOPermissionAccess.NoAccess, perm.AllLocalFiles, "CreatePermission-AllLocalFiles");
66 			Assert.IsFalse (perm.IsUnrestricted (), "perm-Unrestricted");
67 		}
68 
69 		[Test]
Action()70 		public void Action ()
71 		{
72 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
73 			Assert.AreEqual (SecurityAction.Assert, a.Action, "Action=Assert");
74 			a.Action = SecurityAction.Demand;
75 			Assert.AreEqual (SecurityAction.Demand, a.Action, "Action=Demand");
76 			a.Action = SecurityAction.Deny;
77 			Assert.AreEqual (SecurityAction.Deny, a.Action, "Action=Deny");
78 			a.Action = SecurityAction.InheritanceDemand;
79 			Assert.AreEqual (SecurityAction.InheritanceDemand, a.Action, "Action=InheritanceDemand");
80 			a.Action = SecurityAction.LinkDemand;
81 			Assert.AreEqual (SecurityAction.LinkDemand, a.Action, "Action=LinkDemand");
82 			a.Action = SecurityAction.PermitOnly;
83 			Assert.AreEqual (SecurityAction.PermitOnly, a.Action, "Action=PermitOnly");
84 			a.Action = SecurityAction.RequestMinimum;
85 			Assert.AreEqual (SecurityAction.RequestMinimum, a.Action, "Action=RequestMinimum");
86 			a.Action = SecurityAction.RequestOptional;
87 			Assert.AreEqual (SecurityAction.RequestOptional, a.Action, "Action=RequestOptional");
88 			a.Action = SecurityAction.RequestRefuse;
89 			Assert.AreEqual (SecurityAction.RequestRefuse, a.Action, "Action=RequestRefuse");
90 		}
91 
92 		[Test]
Action_Invalid()93 		public void Action_Invalid ()
94 		{
95 			FileDialogPermissionAttribute a = new FileDialogPermissionAttribute ((SecurityAction)Int32.MinValue);
96 			// no validation in attribute
97 		}
98 
99 		[Test]
All()100 		public void All ()
101 		{
102 			string filename = Assembly.GetCallingAssembly ().Location;
103 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
104 			attr.All = filename;
105 			Assert.AreEqual (filename, attr.Append, "All=Append");
106 			Assert.AreEqual (filename, attr.PathDiscovery, "All=PathDiscovery");
107 			Assert.AreEqual (filename, attr.Read, "All=Read");
108 			Assert.AreEqual (filename, attr.Write, "All=Write");
109 			Assert.IsNotNull (attr.AllFiles, "AllFiles");
110 			Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
111 			Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
112 			Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
113 			FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
114 			filename = Path.GetFullPath (filename);
115 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "All=FileIOPermissionAttribute-Append");
116 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "All=FileIOPermissionAttribute-PathDiscovery");
117 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "All=FileIOPermissionAttribute-Read");
118 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "All=FileIOPermissionAttribute-Write");
119 		}
120 
121 		[Test]
122 		[ExpectedException (typeof (NotSupportedException))]
All_Get()123 		public void All_Get ()
124 		{
125 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
126 			string s = attr.All;
127 		}
128 
129 		[Test]
Append()130 		public void Append ()
131 		{
132 			string filename = Assembly.GetCallingAssembly ().Location;
133 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
134 			attr.Append = filename;
135 			Assert.AreEqual (filename, attr.Append, "Append=Append");
136 			Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
137 			Assert.IsNull (attr.Read, "Read=null");
138 			Assert.IsNull (attr.Write, "Write=null");
139 			Assert.IsNotNull (attr.AllFiles, "AllFiles");
140 			Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
141 			Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
142 			Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
143 			FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
144 			filename = Path.GetFullPath (filename);
145 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "Append=FileIOPermissionAttribute-Append");
146 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "Append=FileIOPermissionAttribute-PathDiscovery");
147 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "Append=FileIOPermissionAttribute-Read");
148 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "Append=FileIOPermissionAttribute-Write");
149 		}
150 
151 		[Test]
PathDiscovery()152 		public void PathDiscovery ()
153 		{
154 			string filename = Assembly.GetCallingAssembly ().Location;
155 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
156 			attr.PathDiscovery = filename;
157 			Assert.IsNull (attr.Append, "Append=null");
158 			Assert.AreEqual (filename, attr.PathDiscovery, "PathDiscovery=PathDiscovery");
159 			Assert.IsNull (attr.Read, "Read=null");
160 			Assert.IsNull (attr.Write, "Write=null");
161 			Assert.IsNotNull (attr.AllFiles, "AllFiles");
162 			Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
163 			Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
164 			Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
165 			FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
166 			filename = Path.GetFullPath (filename);
167 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
168 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
169 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "PathDiscovery=FileIOPermissionAttribute-Read");
170 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "PathDiscovery=FileIOPermissionAttribute-Write");
171 		}
172 
173 		[Test]
Read()174 		public void Read ()
175 		{
176 			string filename = Assembly.GetCallingAssembly ().Location;
177 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
178 			attr.Read = filename;
179 			Assert.IsNull (attr.Append, "Append=null");
180 			Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
181 			Assert.AreEqual (filename, attr.Read, "Read=Read");
182 			Assert.IsNull (attr.Write, "Write=null");
183 			Assert.IsNotNull (attr.AllFiles, "AllFiles");
184 			Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
185 			Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
186 			Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
187 			FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
188 			filename = Path.GetFullPath (filename);
189 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
190 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
191 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "PathDiscovery=FileIOPermissionAttribute-Read");
192 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "PathDiscovery=FileIOPermissionAttribute-Write");
193 		}
194 
195 		[Test]
ChangeAccessControl()196 		public void ChangeAccessControl ()
197 		{
198 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
199 			a.ChangeAccessControl = "mono";
200 			Assert.IsNull (a.Append, "Append");
201 			Assert.AreEqual ("mono", a.ChangeAccessControl, "ChangeAccessControl");
202 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
203 			Assert.IsNull (a.Read, "Read");
204 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
205 			Assert.IsNull (a.Write, "Write");
206 
207 			a.ChangeAccessControl = null;
208 			Assert.IsNull (a.Append, "Append");
209 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
210 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
211 			Assert.IsNull (a.Read, "Read");
212 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
213 			Assert.IsNull (a.Write, "Write");
214 		}
215 
216 		[Test]
ViewAccessControl()217 		public void ViewAccessControl ()
218 		{
219 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
220 			a.ViewAccessControl = "mono";
221 			Assert.IsNull (a.Append, "Append");
222 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
223 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
224 			Assert.IsNull (a.Read, "Read");
225 			Assert.AreEqual ("mono", a.ViewAccessControl, "ViewAccessControl");
226 			Assert.IsNull (a.Write, "Write");
227 
228 			a.ViewAccessControl = null;
229 			Assert.IsNull (a.Append, "Append");
230 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
231 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
232 			Assert.IsNull (a.Read, "Read");
233 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
234 			Assert.IsNull (a.Write, "Write");
235 		}
236 
237 		[Test]
ViewAndModify_Set()238 		public void ViewAndModify_Set ()
239 		{
240 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
241 			a.ViewAndModify = "mono";
242 			Assert.AreEqual ("mono", a.Append, "Append");
243 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
244 			Assert.AreEqual ("mono", a.PathDiscovery, "PathDiscovery");
245 			Assert.AreEqual ("mono", a.Read, "Read");
246 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
247 			Assert.AreEqual ("mono", a.Write, "Write");
248 
249 			a.ViewAndModify = null;
250 			Assert.IsNull (a.Append, "Append");
251 			Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
252 			Assert.IsNull (a.PathDiscovery, "PathDiscovery");
253 			Assert.IsNull (a.Read, "Read");
254 			Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
255 			Assert.IsNull (a.Write, "Write");
256 		}
257 
258 		[Test]
259 		[ExpectedException (typeof (NotSupportedException))]
ViewAndModify_Get()260 		public void ViewAndModify_Get ()
261 		{
262 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
263 			a.ViewAndModify = "mono";
264 			Assert.AreEqual ("ViewAndModify", "mono", a.ViewAndModify);
265 		}
266 
267 		[Test]
Write()268 		public void Write ()
269 		{
270 			string filename = Assembly.GetCallingAssembly ().Location;
271 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
272 			attr.Write = filename;
273 			Assert.IsNull (attr.Append, "Append=null");
274 			Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
275 			Assert.IsNull (attr.Read, "Read=null");
276 			Assert.AreEqual (filename, attr.Write, "Write=Write");
277 			FileIOPermission p = (FileIOPermission) attr.CreatePermission ();
278 			filename = Path.GetFullPath (filename);
279 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
280 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
281 			Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "PathDiscovery=FileIOPermissionAttribute-Read");
282 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "PathDiscovery=FileIOPermissionAttribute-Write");
283 		}
284 
285 		[Test]
Unrestricted()286 		public void Unrestricted ()
287 		{
288 			FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
289 			a.Unrestricted = true;
290 
291 			FileIOPermission perm = (FileIOPermission) a.CreatePermission ();
292 			Assert.IsTrue (perm.IsUnrestricted (), "CreatePermission.IsUnrestricted");
293 			Assert.AreEqual (FileIOPermissionAccess.AllAccess, perm.AllFiles, "CreatePermission.AllFiles");
294 			Assert.AreEqual (FileIOPermissionAccess.AllAccess, perm.AllLocalFiles, "CreatePermission.AllLocalFiles");
295 		}
296 
297 		[Test]
Attributes()298 		public void Attributes ()
299 		{
300 			Type t = typeof (FileDialogPermissionAttribute);
301 			Assert.IsTrue (t.IsSerializable, "IsSerializable");
302 
303 			object [] attrs = t.GetCustomAttributes (typeof (AttributeUsageAttribute), false);
304 			Assert.AreEqual (1, attrs.Length, "AttributeUsage");
305 			AttributeUsageAttribute aua = (AttributeUsageAttribute)attrs [0];
306 			Assert.IsTrue (aua.AllowMultiple, "AllowMultiple");
307 			Assert.IsFalse (aua.Inherited, "Inherited");
308 			AttributeTargets at = (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method);
309 			Assert.AreEqual (at, aua.ValidOn, "ValidOn");
310 		}
311 
312 		[Test]
313 		[Category("NotDotNet")]
NonC14NPath()314 		public void NonC14NPath ()
315 		{
316 			string filename = Path.Combine (Path.GetTempPath (), "test");
317 			filename = Path.Combine (filename, "..");
318 			filename = Path.Combine (filename, "here");
319 			FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
320 			// attribute class will keep the .. in the path
321 			attr.All = filename;
322 			Assert.AreEqual (filename, attr.Append, "All=Append");
323 			Assert.AreEqual (filename, attr.PathDiscovery, "All=PathDiscovery");
324 			Assert.AreEqual (filename, attr.Read, "All=Read");
325 			Assert.AreEqual (filename, attr.Write, "All=Write");
326 			// but the permission class will c14n it
327 			filename = Path.GetFullPath (filename);
328 			FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
329 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "All=FileIOPermissionAttribute-Append");
330 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "All=FileIOPermissionAttribute-PathDiscovery");
331 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "All=FileIOPermissionAttribute-Read");
332 			Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "All=FileIOPermissionAttribute-Write");
333 		}
334 	}
335 }
336