The Labs \ Source Viewer \ SSCLI \ System.Security.Policy \ ZoneMembershipCondition

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. // ZoneMembershipCondition.cs
  16. //
  17. // Implementation of membership condition for zones
  18. //
  19. namespace System.Security.Policy
  20. {
  21.    
  22.     using System;
  23.     using SecurityManager = System.Security.SecurityManager;
  24.     using PermissionSet = System.Security.PermissionSet;
  25.     using SecurityElement = System.Security.SecurityElement;
  26.     using System.Collections;
  27.     using System.Globalization;
  28.    
  29.     [Serializable()]
  30.     [System.Runtime.InteropServices.ComVisible(true)]
  31.     public sealed class ZoneMembershipCondition : IMembershipCondition, IConstantMembershipCondition
  32.     {
  33.         //------------------------------------------------------
  34.         //
  35.         // PRIVATE CONSTANTS
  36.         //
  37.         //------------------------------------------------------
  38.        
  39.         private static readonly string[] s_names = {"MyComputer", "Intranet", "Trusted", "Internet", "Untrusted"};
  40.        
  41.         //------------------------------------------------------
  42.         //
  43.         // PRIVATE STATE DATA
  44.         //
  45.         //------------------------------------------------------
  46.        
  47.         private SecurityZone m_zone;
  48.         private SecurityElement m_element;
  49.        
  50.         //------------------------------------------------------
  51.         //
  52.         // PUBLIC CONSTRUCTORS
  53.         //
  54.         //------------------------------------------------------
  55.        
  56.         internal ZoneMembershipCondition()
  57.         {
  58.             m_zone = SecurityZone.NoZone;
  59.         }
  60.        
  61.         public ZoneMembershipCondition(SecurityZone zone)
  62.         {
  63.             VerifyZone(zone);
  64.            
  65.             this.SecurityZone = zone;
  66.         }
  67.        
  68.        
  69.         //------------------------------------------------------
  70.         //
  71.         // PUBLIC ACCESSOR METHODS
  72.         //
  73.         //------------------------------------------------------
  74.        
  75.         public SecurityZone SecurityZone {
  76.            
  77.            
  78.             get {
  79.                 if (m_zone == SecurityZone.NoZone && m_element != null)
  80.                     ParseZone();
  81.                
  82.                 return m_zone;
  83.             }
  84.             set {
  85.                 VerifyZone(value);
  86.                 m_zone = value;
  87.             }
  88.         }
  89.        
  90.         //------------------------------------------------------
  91.         //
  92.         // PRIVATE AND PROTECTED HELPERS FOR ACCESSORS AND CONSTRUCTORS
  93.         //
  94.         //------------------------------------------------------
  95.        
  96.         private static void VerifyZone(SecurityZone zone)
  97.         {
  98.             if (zone < SecurityZone.MyComputer || zone > SecurityZone.Untrusted) {
  99.                 throw new ArgumentException(Environment.GetResourceString("Argument_IllegalZone"));
  100.             }
  101.         }
  102.        
  103.         //------------------------------------------------------
  104.         //
  105.         // IMEMBERSHIPCONDITION IMPLEMENTATION
  106.         //
  107.         //------------------------------------------------------
  108.        
  109.         public bool Check(Evidence evidence)
  110.         {
  111.             if (evidence == null)
  112.                 return false;
  113.            
  114.             IEnumerator enumerator = evidence.GetHostEnumerator();
  115.             while (enumerator.MoveNext()) {
  116.                 object obj = enumerator.Current;
  117.                
  118.                 if (obj is Zone) {
  119.                     if (m_zone == SecurityZone.NoZone && m_element != null)
  120.                         ParseZone();
  121.                    
  122.                     if (((Zone)obj).SecurityZone == m_zone) {
  123.                         return true;
  124.                     }
  125.                 }
  126.             }
  127.             return false;
  128.         }
  129.        
  130.         public IMembershipCondition Copy()
  131.         {
  132.             if (m_zone == SecurityZone.NoZone && m_element != null)
  133.                 ParseZone();
  134.            
  135.             return new ZoneMembershipCondition(m_zone);
  136.         }
  137.        
  138.         public SecurityElement ToXml()
  139.         {
  140.             return ToXml(null);
  141.         }
  142.        
  143.         public void FromXml(SecurityElement e)
  144.         {
  145.             FromXml(e, null);
  146.         }
  147.        
  148.         public SecurityElement ToXml(PolicyLevel level)
  149.         {
  150.             if (m_zone == SecurityZone.NoZone && m_element != null)
  151.                 ParseZone();
  152.            
  153.             SecurityElement root = new SecurityElement("IMembershipCondition");
  154.             System.Security.Util.XMLUtil.AddClassAttribute(root, this.GetType(), "System.Security.Policy.ZoneMembershipCondition");
  155.             // If you hit this assert then most likely you are trying to change the name of this class.
  156.             // This is ok as long as you change the hard coded string above and change the assert below.
  157.             BCLDebug.Assert(this.GetType().FullName.Equals("System.Security.Policy.ZoneMembershipCondition"), "Class name changed!");
  158.            
  159.             root.AddAttribute("version", "1");
  160.            
  161.             if (m_zone != SecurityZone.NoZone)
  162.                 root.AddAttribute("Zone", Enum.GetName(typeof(SecurityZone), m_zone));
  163.            
  164.             return root;
  165.         }
  166.        
  167.         public void FromXml(SecurityElement e, PolicyLevel level)
  168.         {
  169.             if (e == null)
  170.                 throw new ArgumentNullException("e");
  171.            
  172.             if (!e.Tag.Equals("IMembershipCondition")) {
  173.                 throw new ArgumentException(Environment.GetResourceString("Argument_MembershipConditionElement"));
  174.             }
  175.            
  176.             lock (this) {
  177.                 m_zone = SecurityZone.NoZone;
  178.                 m_element = e;
  179.             }
  180.         }
  181.        
  182.         private void ParseZone()
  183.         {
  184.             lock (this) {
  185.                 if (m_element == null)
  186.                     return;
  187.                
  188.                 string eZone = m_element.Attribute("Zone");
  189.                
  190.                 m_zone = SecurityZone.NoZone;
  191.                 if (eZone != null) {
  192.                     m_zone = (SecurityZone)Enum.Parse(typeof(SecurityZone), eZone);
  193.                 }
  194.                 else {
  195.                     throw new ArgumentException(Environment.GetResourceString("Argument_ZoneCannotBeNull"));
  196.                 }
  197.                 VerifyZone(m_zone);
  198.                
  199.                 m_element = null;
  200.             }
  201.         }
  202.        
  203.         public override bool Equals(object o)
  204.         {
  205.             ZoneMembershipCondition that = (o as ZoneMembershipCondition);
  206.            
  207.             if (that != null) {
  208.                 if (this.m_zone == SecurityZone.NoZone && this.m_element != null)
  209.                     this.ParseZone();
  210.                 if (that.m_zone == SecurityZone.NoZone && that.m_element != null)
  211.                     that.ParseZone();
  212.                
  213.                 if (this.m_zone == that.m_zone) {
  214.                     return true;
  215.                 }
  216.             }
  217.             return false;
  218.         }
  219.        
  220.         public override int GetHashCode()
  221.         {
  222.             if (this.m_zone == SecurityZone.NoZone && this.m_element != null)
  223.                 this.ParseZone();
  224.            
  225.             return (int)m_zone;
  226.         }
  227.        
  228.         public override string ToString()
  229.         {
  230.             if (m_zone == SecurityZone.NoZone && m_element != null)
  231.                 ParseZone();
  232.            
  233.             return String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Zone_ToString"), s_names[(int)m_zone]);
  234.         }
  235.     }
  236. }

Developer Fusion