3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // ZoneIdentityPermission.cs
8 // <OWNER>[....]</OWNER>
11 namespace System.Security.Permissions
14 #if FEATURE_CAS_POLICY
15 using SecurityElement = System.Security.SecurityElement;
16 #endif // FEATURE_CAS_POLICY
17 using System.Globalization;
18 using System.Runtime.Serialization;
19 using System.Collections;
20 using System.Collections.Generic;
21 using System.Diagnostics.Contracts;
23 [System.Runtime.InteropServices.ComVisible(true)]
25 sealed public class ZoneIdentityPermission : CodeAccessPermission, IBuiltInPermission
27 //------------------------------------------------------
31 //------------------------------------------------------
36 // MyComputer 0 0x01 (1 << 0)
37 // Intranet 1 0x02 (1 << 1)
38 // Trusted 2 0x04 (1 << 2)
39 // Internet 3 0x08 (1 << 3)
40 // Untrusted 4 0x10 (1 << 4)
42 private const uint AllZones = 0x1f;
43 [OptionalField(VersionAdded = 2)]
47 // This field will be populated only for non X-AD scenarios where we create a XML-ised string of the Permission
48 [OptionalField(VersionAdded = 2)]
49 private String m_serializedPermission;
51 // This field is legacy info from v1.x and is never used in v2.0 and beyond: purely for serialization purposes
52 private SecurityZone m_zone = SecurityZone.NoZone;
55 private void OnDeserialized(StreamingContext ctx)
57 if ((ctx.State & ~(StreamingContextStates.Clone|StreamingContextStates.CrossAppDomain)) != 0)
59 // v2.0 and beyond XML case
60 if (m_serializedPermission != null)
62 FromXml(SecurityElement.FromString(m_serializedPermission));
63 m_serializedPermission = null;
65 else //v1.x case where we read the m_zone value
67 SecurityZone = m_zone;
68 m_zone = SecurityZone.NoZone;
76 private void OnSerializing(StreamingContext ctx)
79 if ((ctx.State & ~(StreamingContextStates.Clone|StreamingContextStates.CrossAppDomain)) != 0)
81 m_serializedPermission = ToXml().ToString(); //for the v2 and beyond case
82 m_zone = SecurityZone;
87 private void OnSerialized(StreamingContext ctx)
89 if ((ctx.State & ~(StreamingContextStates.Clone|StreamingContextStates.CrossAppDomain)) != 0)
91 m_serializedPermission = null;
92 m_zone = SecurityZone.NoZone;
95 #endif // FEATURE_REMOTING
97 //------------------------------------------------------
99 // PUBLIC CONSTRUCTORS
101 //------------------------------------------------------
103 public ZoneIdentityPermission(PermissionState state)
105 if (state == PermissionState.Unrestricted)
109 else if (state == PermissionState.None)
115 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
119 public ZoneIdentityPermission( SecurityZone zone )
121 this.SecurityZone = zone;
124 internal ZoneIdentityPermission( uint zones )
126 m_zones = (zones & AllZones);
129 // Internal function to append all the Zone in this permission to the input ArrayList
130 internal void AppendZones(ArrayList zoneList)
134 for(nFlag = 1; nFlag < AllZones; nFlag <<= 1)
136 if((m_zones & nFlag) != 0)
138 zoneList.Add((SecurityZone)nEnum);
144 //------------------------------------------------------
146 // PUBLIC ACCESSOR METHODS
148 //------------------------------------------------------
150 public SecurityZone SecurityZone
155 if(value == SecurityZone.NoZone)
158 m_zones = (uint)1 << (int)value;
163 SecurityZone z = SecurityZone.NoZone;
166 for(nFlag = 1; nFlag < AllZones; nFlag <<= 1)
168 if((m_zones & nFlag) != 0)
170 if(z == SecurityZone.NoZone)
171 z = (SecurityZone)nEnum;
173 return SecurityZone.NoZone;
181 //------------------------------------------------------
183 // PRIVATE AND PROTECTED HELPERS FOR ACCESSORS AND CONSTRUCTORS
185 //------------------------------------------------------
187 private static void VerifyZone( SecurityZone zone )
189 if (zone < SecurityZone.NoZone || zone > SecurityZone.Untrusted)
191 throw new ArgumentException( Environment.GetResourceString("Argument_IllegalZone") );
193 Contract.EndContractBlock();
197 //------------------------------------------------------
199 // CODEACCESSPERMISSION IMPLEMENTATION
201 //------------------------------------------------------
203 //------------------------------------------------------
205 // IPERMISSION IMPLEMENTATION
207 //------------------------------------------------------
210 public override IPermission Copy()
212 return new ZoneIdentityPermission(this.m_zones);
215 public override bool IsSubsetOf(IPermission target)
218 return this.m_zones == 0;
220 ZoneIdentityPermission that = target as ZoneIdentityPermission;
222 throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName));
223 return (this.m_zones & that.m_zones) == this.m_zones;
226 public override IPermission Intersect(IPermission target)
231 ZoneIdentityPermission that = target as ZoneIdentityPermission;
233 throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName));
234 uint newZones = this.m_zones & that.m_zones;
237 return new ZoneIdentityPermission(newZones);
240 public override IPermission Union(IPermission target)
243 return this.m_zones != 0 ? this.Copy() : null;
245 ZoneIdentityPermission that = target as ZoneIdentityPermission;
247 throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName));
248 return new ZoneIdentityPermission(this.m_zones | that.m_zones);
251 #if FEATURE_CAS_POLICY
252 public override SecurityElement ToXml()
254 SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.ZoneIdentityPermission" );
255 if (SecurityZone != SecurityZone.NoZone)
257 esd.AddAttribute( "Zone", Enum.GetName( typeof( SecurityZone ), this.SecurityZone ) );
263 for(nFlag = 1; nFlag < AllZones; nFlag <<= 1)
265 if((m_zones & nFlag) != 0)
267 SecurityElement child = new SecurityElement("Zone");
268 child.AddAttribute( "Zone", Enum.GetName( typeof( SecurityZone ), (SecurityZone)nEnum ) );
277 public override void FromXml(SecurityElement esd)
280 CodeAccessPermission.ValidateElement( esd, this );
281 String eZone = esd.Attribute( "Zone" );
283 SecurityZone = (SecurityZone)Enum.Parse( typeof( SecurityZone ), eZone );
284 if(esd.Children != null)
286 foreach(SecurityElement child in esd.Children)
288 eZone = child.Attribute( "Zone" );
289 int enm = (int)Enum.Parse( typeof( SecurityZone ), eZone );
290 if(enm == (int)SecurityZone.NoZone)
292 m_zones |= ((uint)1 << enm);
296 #endif // FEATURE_CAS_POLICY
299 int IBuiltInPermission.GetTokenIndex()
301 return ZoneIdentityPermission.GetTokenIndex();
304 internal static int GetTokenIndex()
306 return BuiltInPermissionIndex.ZoneIdentityPermissionIndex;