The Labs \ Source Viewer \ SSCLI \ System.Security.Util \ SiteString

  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. // SiteString
  16. //
  17. namespace System.Security.Util
  18. {
  19.     using System;
  20.     using System.Collections;
  21.     using System.Globalization;
  22.    
  23.     [Serializable()]
  24.     internal class SiteString
  25.     {
  26.         protected string m_site;
  27.         protected ArrayList m_separatedSite;
  28.        
  29.         protected static char[] m_separators = {'.'};
  30.        
  31.         protected internal SiteString()
  32.         {
  33.             // Only call this in derived classes when you know what you're doing.
  34.         }
  35.        
  36.         public SiteString(string site)
  37.         {
  38.             m_separatedSite = CreateSeparatedSite(site);
  39.             m_site = site;
  40.         }
  41.        
  42.         private SiteString(string site, ArrayList separatedSite)
  43.         {
  44.             m_separatedSite = separatedSite;
  45.             m_site = site;
  46.         }
  47.        
  48.         private static ArrayList CreateSeparatedSite(string site)
  49.         {
  50.             ArrayList list = new ArrayList();
  51.            
  52.             if (site == null || site.Length == 0) {
  53.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSite"));
  54.             }
  55.            
  56.             int braIndex = -1;
  57.             int ketIndex = -1;
  58.             braIndex = site.IndexOf('[');
  59.             if (braIndex == 0)
  60.                 ketIndex = site.IndexOf(']', braIndex + 1);
  61.            
  62.             if (ketIndex != -1) {
  63.                 // Found an IPv6 address. Special case that
  64.                 string ipv6Addr = site.Substring(braIndex + 1, ketIndex - braIndex - 1);
  65.                 list.Add(ipv6Addr);
  66.                 return list;
  67.             }
  68.            
  69.             // Regular hostnames or IPv4 addresses
  70.             // We dont need to do this for IPv4 addresses, but it's easier to do it anyway
  71.             string[] separatedArray = site.Split(m_separators);
  72.            
  73.             for (int index = separatedArray.Length - 1; index > -1; --index) {
  74.                 if (separatedArray[index] == null) {
  75.                     throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSite"));
  76.                 }
  77.                 else if (separatedArray[index].Equals("")) {
  78.                     if (index != separatedArray.Length - 1) {
  79.                         throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSite"));
  80.                     }
  81.                 }
  82.                 else if (separatedArray[index].Equals("*")) {
  83.                     if (index != 0) {
  84.                         throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSite"));
  85.                     }
  86.                     list.Add(separatedArray[index]);
  87.                 }
  88.                 else if (!AllLegalCharacters(separatedArray[index])) {
  89.                     throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSite"));
  90.                 }
  91.                 else {
  92.                     list.Add(separatedArray[index]);
  93.                 }
  94.             }
  95.            
  96.             return list;
  97.         }
  98.        
  99.         private static bool AllLegalCharacters(string str)
  100.         {
  101.             for (int i = 0; i < str.Length; ++i) {
  102.                 char c = str[i];
  103.                
  104.                 if (IsLegalDNSChar(c) || IsNetbiosSplChar(c)) {
  105.                     continue;
  106.                 }
  107.                 else {
  108.                     return false;
  109.                 }
  110.             }
  111.            
  112.             return true;
  113.         }
  114.        
  115.         private static bool IsLegalDNSChar(char c)
  116.         {
  117.             if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '-'))
  118.                 return true;
  119.             else
  120.                 return false;
  121.         }
  122.         private static bool IsNetbiosSplChar(char c)
  123.         {
  124.             // ! @ # $ % ^ & ( ) - _ ' { } . ~ are OK
  125.             switch (c) {
  126.                 case '-':
  127.                 case '_':
  128.                 case '@':
  129.                 case '!':
  130.                 case '#':
  131.                 case '$':
  132.                 case '%':
  133.                 case '^':
  134.                 case '&':
  135.                 case '(':
  136.                 case ')':
  137.                 case '\'':
  138.                 case '{':
  139.                 case '}':
  140.                 case '.':
  141.                 case '~':
  142.                     return true;
  143.                 default:
  144.                     return false;
  145.             }
  146.         }
  147.        
  148.         public override string ToString()
  149.         {
  150.             return m_site;
  151.         }
  152.        
  153.         public override bool Equals(object o)
  154.         {
  155.             if (o == null || !(o is SiteString))
  156.                 return false;
  157.             else
  158.                 return this.Equals((SiteString)o, true);
  159.         }
  160.        
  161.         public override int GetHashCode()
  162.         {
  163.             TextInfo info = CultureInfo.InvariantCulture.TextInfo;
  164.            
  165.             return info.GetCaseInsensitiveHashCode(this.m_site);
  166.         }
  167.        
  168.         internal bool Equals(SiteString ss, bool ignoreCase)
  169.         {
  170.             if (this.m_site == null)
  171.                 return ss.m_site == null;
  172.             if (ss.m_site == null)
  173.                 return false;
  174.             return this.IsSubsetOf(ss, ignoreCase) && ss.IsSubsetOf(this, ignoreCase);
  175.         }
  176.        
  177.        
  178.         public virtual SiteString Copy()
  179.         {
  180.             return new SiteString(m_site, m_separatedSite);
  181.         }
  182.        
  183.         public virtual bool IsSubsetOf(SiteString operand)
  184.         {
  185.             return this.IsSubsetOf(operand, true);
  186.         }
  187.        
  188.         public virtual bool IsSubsetOf(SiteString operand, bool ignoreCase)
  189.         {
  190.             StringComparison strComp = (ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  191.             if (operand == null) {
  192.                 return false;
  193.             }
  194.             else if (this.m_separatedSite.Count == operand.m_separatedSite.Count && this.m_separatedSite.Count == 0) {
  195.                 return true;
  196.             }
  197.             else if (this.m_separatedSite.Count < operand.m_separatedSite.Count - 1) {
  198.                 return false;
  199.             }
  200.             else if (this.m_separatedSite.Count > operand.m_separatedSite.Count && operand.m_separatedSite.Count > 0 && !operand.m_separatedSite[operand.m_separatedSite.Count - 1].Equals("*")) {
  201.                 return false;
  202.             }
  203.             else if (String.Compare(this.m_site, operand.m_site, strComp) == 0) {
  204.                 return true;
  205.             }
  206.            
  207.             for (int index = 0; index < operand.m_separatedSite.Count - 1; ++index) {
  208.                 if (String.Compare((string)this.m_separatedSite[index], (string)operand.m_separatedSite[index], strComp) != 0) {
  209.                     return false;
  210.                 }
  211.             }
  212.            
  213.             if (this.m_separatedSite.Count < operand.m_separatedSite.Count) {
  214.                 return operand.m_separatedSite[operand.m_separatedSite.Count - 1].Equals("*");
  215.             }
  216.             else if (this.m_separatedSite.Count == operand.m_separatedSite.Count) {
  217.                 // last item must be the same or operand must have a * in its last item
  218.                 return (String.Compare((string)this.m_separatedSite[this.m_separatedSite.Count - 1], (string)operand.m_separatedSite[this.m_separatedSite.Count - 1], strComp) == 0 || operand.m_separatedSite[operand.m_separatedSite.Count - 1].Equals("*"));
  219.                
  220.             }
  221.             else
  222.                 return true;
  223.         }
  224.        
  225.        
  226.        
  227.         public virtual SiteString Intersect(SiteString operand)
  228.         {
  229.             if (operand == null) {
  230.                 return null;
  231.             }
  232.             else if (this.IsSubsetOf(operand)) {
  233.                 return this.Copy();
  234.             }
  235.             else if (operand.IsSubsetOf(this)) {
  236.                 return operand.Copy();
  237.             }
  238.             else {
  239.                 return null;
  240.             }
  241.         }
  242.        
  243.         public virtual SiteString Union(SiteString operand)
  244.         {
  245.             if (operand == null) {
  246.                 return this;
  247.             }
  248.             else if (this.IsSubsetOf(operand)) {
  249.                 return operand.Copy();
  250.             }
  251.             else if (operand.IsSubsetOf(this)) {
  252.                 return this.Copy();
  253.             }
  254.             else {
  255.                 return null;
  256.             }
  257.         }
  258.     }
  259. }

Developer Fusion