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

  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. //
  16. // UrlMembershipCondition.cs
  17. //
  18. // Implementation of membership condition for urls
  19. //
  20. namespace System.Security.Policy
  21. {
  22.     using System;
  23.     using System.Collections;
  24.     using System.Globalization;
  25.     using System.Security;
  26.     using System.Security.Util;
  27.    
  28.     [Serializable()]
  29.     [System.Runtime.InteropServices.ComVisible(true)]
  30.     public sealed class UrlMembershipCondition : IMembershipCondition, IConstantMembershipCondition
  31.     {
  32.         //------------------------------------------------------
  33.         //
  34.         // PRIVATE STATE DATA
  35.         //
  36.         //------------------------------------------------------
  37.        
  38.         private URLString m_url;
  39.         private SecurityElement m_element;
  40.        
  41.         //------------------------------------------------------
  42.         //
  43.         // PUBLIC CONSTRUCTORS
  44.         //
  45.         //------------------------------------------------------
  46.        
  47.         internal UrlMembershipCondition()
  48.         {
  49.             m_url = null;
  50.         }
  51.        
  52.         public UrlMembershipCondition(string url)
  53.         {
  54.             if (url == null)
  55.                 throw new ArgumentNullException("url");
  56.            
  57.             // Parse the Url to check that it's valid.
  58.                 /* not parsed */                /* parse eagerly */            m_url = new URLString(url, false, true);
  59.         }
  60.        
  61.         //------------------------------------------------------
  62.         //
  63.         // PUBLIC ACCESSOR METHODS
  64.         //
  65.         //------------------------------------------------------
  66.        
  67.         public string Url {
  68.            
  69.            
  70.             get {
  71.                 if (m_url == null && m_element != null)
  72.                     ParseURL();
  73.                
  74.                 return m_url.ToString();
  75.             }
  76.             set {
  77.                 if (value == null)
  78.                     throw new ArgumentNullException("value");
  79.                 m_url = new URLString(value);
  80.             }
  81.         }
  82.        
  83.         //------------------------------------------------------
  84.         //
  85.         // IMEMBERSHIPCONDITION IMPLEMENTATION
  86.         //
  87.         //------------------------------------------------------
  88.        
  89.         public bool Check(Evidence evidence)
  90.         {
  91.             if (evidence == null)
  92.                 return false;
  93.            
  94.             IEnumerator enumerator = evidence.GetHostEnumerator();
  95.             while (enumerator.MoveNext()) {
  96.                 if (enumerator.Current is Url) {
  97.                     if (m_url == null && m_element != null)
  98.                         ParseURL();
  99.                    
  100.                     if (((Url)enumerator.Current).GetURLString().IsSubsetOf(m_url)) {
  101.                         return true;
  102.                     }
  103.                 }
  104.             }
  105.             return false;
  106.         }
  107.        
  108.         public IMembershipCondition Copy()
  109.         {
  110.             if (m_url == null && m_element != null)
  111.                 ParseURL();
  112.            
  113.             UrlMembershipCondition mc = new UrlMembershipCondition();
  114.             mc.m_url = new URLString(m_url.ToString());
  115.             return mc;
  116.         }
  117.        
  118.         public SecurityElement ToXml()
  119.         {
  120.             return ToXml(null);
  121.         }
  122.        
  123.         public void FromXml(SecurityElement e)
  124.         {
  125.             FromXml(e, null);
  126.         }
  127.        
  128.         public SecurityElement ToXml(PolicyLevel level)
  129.         {
  130.             if (m_url == null && m_element != null)
  131.                 ParseURL();
  132.            
  133.             SecurityElement root = new SecurityElement("IMembershipCondition");
  134.             System.Security.Util.XMLUtil.AddClassAttribute(root, this.GetType(), "System.Security.Policy.UrlMembershipCondition");
  135.             // If you hit this assert then most likely you are trying to change the name of this class.
  136.             // This is ok as long as you change the hard coded string above and change the assert below.
  137.             BCLDebug.Assert(this.GetType().FullName.Equals("System.Security.Policy.UrlMembershipCondition"), "Class name changed!");
  138.            
  139.             root.AddAttribute("version", "1");
  140.             if (m_url != null)
  141.                 root.AddAttribute("Url", m_url.ToString());
  142.            
  143.             return root;
  144.         }
  145.        
  146.         public void FromXml(SecurityElement e, PolicyLevel level)
  147.         {
  148.             if (e == null)
  149.                 throw new ArgumentNullException("e");
  150.            
  151.             if (!e.Tag.Equals("IMembershipCondition")) {
  152.                 throw new ArgumentException(Environment.GetResourceString("Argument_MembershipConditionElement"));
  153.             }
  154.            
  155.             lock (this) {
  156.                 m_element = e;
  157.                 m_url = null;
  158.             }
  159.         }
  160.        
  161.         private void ParseURL()
  162.         {
  163.             lock (this) {
  164.                 if (m_element == null)
  165.                     return;
  166.                
  167.                 string elurl = m_element.Attribute("Url");
  168.                 if (elurl == null)
  169.                     throw new ArgumentException(Environment.GetResourceString("Argument_UrlCannotBeNull"));
  170.                 else
  171.                     m_url = new URLString(elurl);
  172.                
  173.                 m_element = null;
  174.             }
  175.         }
  176.        
  177.         public override bool Equals(object o)
  178.         {
  179.             UrlMembershipCondition that = (o as UrlMembershipCondition);
  180.            
  181.             if (that != null) {
  182.                 if (this.m_url == null && this.m_element != null)
  183.                     this.ParseURL();
  184.                 if (that.m_url == null && that.m_element != null)
  185.                     that.ParseURL();
  186.                
  187.                 if (Equals(this.m_url, that.m_url)) {
  188.                     return true;
  189.                 }
  190.             }
  191.             return false;
  192.         }
  193.        
  194.         public override int GetHashCode()
  195.         {
  196.             if (m_url == null && m_element != null)
  197.                 ParseURL();
  198.            
  199.             if (m_url != null) {
  200.                 return m_url.GetHashCode();
  201.             }
  202.             else {
  203.                 return typeof(UrlMembershipCondition).GetHashCode();
  204.             }
  205.         }
  206.        
  207.         public override string ToString()
  208.         {
  209.             if (m_url == null && m_element != null)
  210.                 ParseURL();
  211.            
  212.             if (m_url != null)
  213.                 return String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Url_ToStringArg"), m_url.ToString());
  214.             else
  215.                 return Environment.GetResourceString("Url_ToString");
  216.         }
  217.     }
  218. }

Developer Fusion