The Labs \ Source Viewer \ SSCLI \ System.Security.Permissions \ SiteIdentityPermission

  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. // SiteIdentityPermission.cs
  16. //
  17. namespace System.Security.Permissions
  18. {
  19.     using System;
  20.     using SecurityElement = System.Security.SecurityElement;
  21.     using SiteString = System.Security.Util.SiteString;
  22.     using System.Text;
  23.     using System.Collections;
  24.     using System.Globalization;
  25.     using System.Runtime.Serialization;
  26.    
  27.     [System.Runtime.InteropServices.ComVisible(true)]
  28.     [Serializable()]
  29.     public sealed class SiteIdentityPermission : CodeAccessPermission, IBuiltInPermission
  30.     {
  31.         //------------------------------------------------------
  32.         //
  33.         // PRIVATE STATE DATA
  34.         //
  35.         //------------------------------------------------------
  36.         [OptionalField(VersionAdded = 2)]
  37.         private bool m_unrestricted;
  38.         [OptionalField(VersionAdded = 2)]
  39.         private SiteString[] m_sites;
  40.        
  41.         // This field will be populated only for non X-AD scenarios where we create a XML-ised string of the Permission
  42.         [OptionalField(VersionAdded = 2)]
  43.         private string m_serializedPermission;
  44.        
  45.         // This field is legacy info from v1.x and is never used in v2.0 and beyond: purely for serialization purposes
  46.         private SiteString m_site;
  47.        
  48.        
  49.         [OnDeserialized()]
  50.         private void OnDeserialized(StreamingContext ctx)
  51.         {
  52.             // v2.0 and beyond XML case
  53.             if (m_serializedPermission != null) {
  54.                 FromXml(SecurityElement.FromString(m_serializedPermission));
  55.                 m_serializedPermission = null;
  56.             }
  57.             //v1.x case where we read the m_site value
  58.             else if (m_site != null) {
  59.                 m_unrestricted = false;
  60.                 m_sites = new SiteString[1];
  61.                 m_sites[0] = m_site;
  62.                 m_site = null;
  63.             }
  64.         }
  65.        
  66.         [OnSerializing()]
  67.         private void OnSerializing(StreamingContext ctx)
  68.         {
  69.            
  70.             if ((ctx.State & ~(StreamingContextStates.Clone | StreamingContextStates.CrossAppDomain)) != 0) {
  71.                 m_serializedPermission = ToXml().ToString();
  72.                 //for the v2 and beyond case
  73.                 if (m_sites != null && m_sites.Length == 1)
  74.                     // for the v1.x case
  75.                     m_site = m_sites[0];
  76.                
  77.             }
  78.         }
  79.         [OnSerialized()]
  80.         private void OnSerialized(StreamingContext ctx)
  81.         {
  82.             if ((ctx.State & ~(StreamingContextStates.Clone | StreamingContextStates.CrossAppDomain)) != 0) {
  83.                 m_serializedPermission = null;
  84.                 m_site = null;
  85.             }
  86.         }
  87.        
  88.         //------------------------------------------------------
  89.         //
  90.         // PUBLIC CONSTRUCTORS
  91.         //
  92.         //------------------------------------------------------
  93.        
  94.        
  95.         public SiteIdentityPermission(PermissionState state)
  96.         {
  97.             if (state == PermissionState.Unrestricted) {
  98.                 if (CodeAccessSecurityEngine.DoesFullTrustMeanFullTrust())
  99.                     m_unrestricted = true;
  100.                 else
  101.                     throw new ArgumentException(Environment.GetResourceString("Argument_UnrestrictedIdentityPermission"));
  102.             }
  103.             else if (state == PermissionState.None) {
  104.                 m_unrestricted = false;
  105.             }
  106.             else {
  107.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
  108.             }
  109.         }
  110.        
  111.         public SiteIdentityPermission(string site)
  112.         {
  113.             Site = site;
  114.         }
  115.        
  116.         //------------------------------------------------------
  117.         //
  118.         // PUBLIC ACCESSOR METHODS
  119.         //
  120.         //------------------------------------------------------
  121.        
  122.         public string Site {
  123.            
  124.             get {
  125.                 if (m_sites == null)
  126.                     return "";
  127.                 if (m_sites.Length == 1)
  128.                     return m_sites[0].ToString();
  129.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_AmbiguousIdentity"));
  130.             }
  131.             set {
  132.                 m_unrestricted = false;
  133.                 m_sites = new SiteString[1];
  134.                 m_sites[0] = new SiteString(value);
  135.             }
  136.         }
  137.        
  138.         //------------------------------------------------------
  139.         //
  140.         // PRIVATE AND PROTECTED HELPERS FOR ACCESSORS AND CONSTRUCTORS
  141.         //
  142.         //------------------------------------------------------
  143.        
  144.         //------------------------------------------------------
  145.         //
  146.         // CODEACCESSPERMISSION IMPLEMENTATION
  147.         //
  148.         //------------------------------------------------------
  149.        
  150.         //------------------------------------------------------
  151.         //
  152.         // IPERMISSION IMPLEMENTATION
  153.         //
  154.         //------------------------------------------------------
  155.        
  156.        
  157.         public override IPermission Copy()
  158.         {
  159.             SiteIdentityPermission perm = new SiteIdentityPermission(PermissionState.None);
  160.             perm.m_unrestricted = this.m_unrestricted;
  161.             if (this.m_sites != null) {
  162.                 perm.m_sites = new SiteString[this.m_sites.Length];
  163.                 int n;
  164.                 for (n = 0; n < this.m_sites.Length; n++)
  165.                     perm.m_sites[n] = (SiteString)this.m_sites[n].Copy();
  166.             }
  167.             return perm;
  168.         }
  169.        
  170.         public override bool IsSubsetOf(IPermission target)
  171.         {
  172.             if (target == null) {
  173.                 if (m_unrestricted)
  174.                     return false;
  175.                 if (m_sites == null)
  176.                     return true;
  177.                 if (m_sites.Length == 0)
  178.                     return true;
  179.                 return false;
  180.             }
  181.             SiteIdentityPermission that = target as SiteIdentityPermission;
  182.             if (that == null)
  183.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  184.             if (that.m_unrestricted)
  185.                 return true;
  186.             if (m_unrestricted)
  187.                 return false;
  188.             if (this.m_sites != null) {
  189.                 foreach (SiteString ssThis in this.m_sites) {
  190.                     bool bOK = false;
  191.                     if (that.m_sites != null) {
  192.                         foreach (SiteString ssThat in that.m_sites) {
  193.                             if (ssThis.IsSubsetOf(ssThat)) {
  194.                                 bOK = true;
  195.                                 break;
  196.                             }
  197.                         }
  198.                     }
  199.                     if (!bOK)
  200.                         return false;
  201.                 }
  202.             }
  203.             return true;
  204.         }
  205.        
  206.         public override IPermission Intersect(IPermission target)
  207.         {
  208.             if (target == null)
  209.                 return null;
  210.             SiteIdentityPermission that = target as SiteIdentityPermission;
  211.             if (that == null)
  212.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  213.             if (this.m_unrestricted && that.m_unrestricted) {
  214.                 SiteIdentityPermission res = new SiteIdentityPermission(PermissionState.None);
  215.                 res.m_unrestricted = true;
  216.                 return res;
  217.             }
  218.             if (this.m_unrestricted)
  219.                 return that.Copy();
  220.             if (that.m_unrestricted)
  221.                 return this.Copy();
  222.             if (this.m_sites == null || that.m_sites == null || this.m_sites.Length == 0 || that.m_sites.Length == 0)
  223.                 return null;
  224.             ArrayList alSites = new ArrayList();
  225.             foreach (SiteString ssThis in this.m_sites) {
  226.                 foreach (SiteString ssThat in that.m_sites) {
  227.                     SiteString ssInt = (SiteString)ssThis.Intersect(ssThat);
  228.                     if (ssInt != null)
  229.                         alSites.Add(ssInt);
  230.                 }
  231.             }
  232.             if (alSites.Count == 0)
  233.                 return null;
  234.             SiteIdentityPermission result = new SiteIdentityPermission(PermissionState.None);
  235.             result.m_sites = (SiteString[])alSites.ToArray(typeof(SiteString));
  236.             return result;
  237.         }
  238.        
  239.         public override IPermission Union(IPermission target)
  240.         {
  241.             if (target == null) {
  242.                 if ((this.m_sites == null || this.m_sites.Length == 0) && !this.m_unrestricted)
  243.                     return null;
  244.                 return this.Copy();
  245.             }
  246.             SiteIdentityPermission that = target as SiteIdentityPermission;
  247.             if (that == null)
  248.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  249.             if (this.m_unrestricted || that.m_unrestricted) {
  250.                 SiteIdentityPermission res = new SiteIdentityPermission(PermissionState.None);
  251.                 res.m_unrestricted = true;
  252.                 return res;
  253.             }
  254.             if (this.m_sites == null || this.m_sites.Length == 0) {
  255.                 if (that.m_sites == null || that.m_sites.Length == 0)
  256.                     return null;
  257.                 return that.Copy();
  258.             }
  259.             if (that.m_sites == null || that.m_sites.Length == 0)
  260.                 return this.Copy();
  261.             ArrayList alSites = new ArrayList();
  262.             foreach (SiteString ssThis in this.m_sites)
  263.                 alSites.Add(ssThis);
  264.             foreach (SiteString ssThat in that.m_sites) {
  265.                 bool bDupe = false;
  266.                 foreach (SiteString ss in alSites) {
  267.                     if (ssThat.Equals(ss)) {
  268.                         bDupe = true;
  269.                         break;
  270.                     }
  271.                 }
  272.                 if (!bDupe)
  273.                     alSites.Add(ssThat);
  274.             }
  275.             SiteIdentityPermission result = new SiteIdentityPermission(PermissionState.None);
  276.             result.m_sites = (SiteString[])alSites.ToArray(typeof(SiteString));
  277.             return result;
  278.         }
  279.        
  280.         public override void FromXml(SecurityElement esd)
  281.         {
  282.             m_unrestricted = false;
  283.             m_sites = null;
  284.             CodeAccessPermission.ValidateElement(esd, this);
  285.             string unr = esd.Attribute("Unrestricted");
  286.             if (unr != null && String.Compare(unr, "true", StringComparison.OrdinalIgnoreCase) == 0) {
  287.                 m_unrestricted = true;
  288.                 return;
  289.             }
  290.             string elem = esd.Attribute("Site");
  291.             ArrayList al = new ArrayList();
  292.             if (elem != null)
  293.                 al.Add(new SiteString(elem));
  294.             ArrayList alChildren = esd.Children;
  295.             if (alChildren != null) {
  296.                 foreach (SecurityElement child in alChildren) {
  297.                     elem = child.Attribute("Site");
  298.                     if (elem != null)
  299.                         al.Add(new SiteString(elem));
  300.                 }
  301.             }
  302.             if (al.Count != 0)
  303.                 m_sites = (SiteString[])al.ToArray(typeof(SiteString));
  304.         }
  305.        
  306.         public override SecurityElement ToXml()
  307.         {
  308.             SecurityElement esd = CodeAccessPermission.CreatePermissionElement(this, "System.Security.Permissions.SiteIdentityPermission");
  309.             if (m_unrestricted)
  310.                 esd.AddAttribute("Unrestricted", "true");
  311.             else if (m_sites != null) {
  312.                 if (m_sites.Length == 1)
  313.                     esd.AddAttribute("Site", m_sites[0].ToString());
  314.                 else {
  315.                     int n;
  316.                     for (n = 0; n < m_sites.Length; n++) {
  317.                         SecurityElement child = new SecurityElement("Site");
  318.                         child.AddAttribute("Site", m_sites[n].ToString());
  319.                         esd.AddChild(child);
  320.                     }
  321.                 }
  322.             }
  323.             return esd;
  324.         }
  325.        
  326.         /// <internalonly/>
  327.         int IBuiltInPermission.GetTokenIndex()
  328.         {
  329.             return SiteIdentityPermission.GetTokenIndex();
  330.         }
  331.        
  332.         static internal int GetTokenIndex()
  333.         {
  334.             return BuiltInPermissionIndex.SiteIdentityPermissionIndex;
  335.         }
  336.     }
  337. }

Developer Fusion