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

  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. // PrincipalPermission.cs
  16. //
  17. namespace System.Security.Permissions
  18. {
  19.     using System;
  20.     using SecurityElement = System.Security.SecurityElement;
  21.     using System.Security.Util;
  22.     using System.IO;
  23.     using System.Collections;
  24.     using System.Security.Principal;
  25.     using System.Text;
  26.     using System.Threading;
  27.     using System.Globalization;
  28.     using System.Reflection;
  29.    
  30.     [Serializable()]
  31.     internal class IDRole
  32.     {
  33.         internal bool m_authenticated;
  34.         internal string m_id;
  35.         internal string m_role;
  36.        
  37.        
  38.         internal SecurityElement ToXml()
  39.         {
  40.             SecurityElement root = new SecurityElement("Identity");
  41.            
  42.             if (m_authenticated)
  43.                 root.AddAttribute("Authenticated", "true");
  44.            
  45.             if (m_id != null) {
  46.                 root.AddAttribute("ID", SecurityElement.Escape(m_id));
  47.             }
  48.            
  49.             if (m_role != null) {
  50.                 root.AddAttribute("Role", SecurityElement.Escape(m_role));
  51.             }
  52.            
  53.             return root;
  54.         }
  55.        
  56.         internal void FromXml(SecurityElement e)
  57.         {
  58.             string elAuth = e.Attribute("Authenticated");
  59.             if (elAuth != null) {
  60.                 m_authenticated = String.Compare(elAuth, "true", StringComparison.OrdinalIgnoreCase) == 0;
  61.             }
  62.             else {
  63.                 m_authenticated = false;
  64.             }
  65.            
  66.             string elID = e.Attribute("ID");
  67.             if (elID != null) {
  68.                 m_id = elID;
  69.             }
  70.             else {
  71.                 m_id = null;
  72.             }
  73.            
  74.             string elRole = e.Attribute("Role");
  75.             if (elRole != null) {
  76.                 m_role = elRole;
  77.             }
  78.             else {
  79.                 m_role = null;
  80.             }
  81.         }
  82.        
  83.         public override int GetHashCode()
  84.         {
  85.             return ((m_authenticated ? 0 : 101) + (m_id == null ? 0 : m_id.GetHashCode()) + (m_role == null ? 0 : m_role.GetHashCode()));
  86.         }
  87.        
  88.     }
  89.    
  90.     [System.Runtime.InteropServices.ComVisible(true)]
  91.     [Serializable()]
  92.     public sealed class PrincipalPermission : IPermission, IUnrestrictedPermission, ISecurityEncodable, IBuiltInPermission
  93.     {
  94.         private IDRole[] m_array;
  95.        
  96.         public PrincipalPermission(PermissionState state)
  97.         {
  98.             if (state == PermissionState.Unrestricted) {
  99.                 m_array = new IDRole[1];
  100.                 m_array[0] = new IDRole();
  101.                 m_array[0].m_authenticated = true;
  102.                 m_array[0].m_id = null;
  103.                 m_array[0].m_role = null;
  104.             }
  105.             else if (state == PermissionState.None) {
  106.                 m_array = new IDRole[1];
  107.                 m_array[0] = new IDRole();
  108.                 m_array[0].m_authenticated = false;
  109.                 m_array[0].m_id = "";
  110.                 m_array[0].m_role = "";
  111.             }
  112.             else
  113.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
  114.         }
  115.        
  116.         public PrincipalPermission(string name, string role)
  117.         {
  118.             m_array = new IDRole[1];
  119.             m_array[0] = new IDRole();
  120.             m_array[0].m_authenticated = true;
  121.             m_array[0].m_id = name;
  122.             m_array[0].m_role = role;
  123.         }
  124.        
  125.         public PrincipalPermission(string name, string role, bool isAuthenticated)
  126.         {
  127.             m_array = new IDRole[1];
  128.             m_array[0] = new IDRole();
  129.             m_array[0].m_authenticated = isAuthenticated;
  130.             m_array[0].m_id = name;
  131.             m_array[0].m_role = role;
  132.         }
  133.        
  134.         private PrincipalPermission(IDRole[] array)
  135.         {
  136.             m_array = array;
  137.         }
  138.        
  139.         private bool IsEmpty()
  140.         {
  141.             for (int i = 0; i < m_array.Length; ++i) {
  142.                 if ((m_array[i].m_id == null || !m_array[i].m_id.Equals("")) || (m_array[i].m_role == null || !m_array[i].m_role.Equals("")) || m_array[i].m_authenticated) {
  143.                     return false;
  144.                 }
  145.             }
  146.             return true;
  147.         }
  148.        
  149.         private bool VerifyType(IPermission perm)
  150.         {
  151.             // if perm is null, then obviously not of the same type
  152.             if ((perm == null) || (perm.GetType() != this.GetType())) {
  153.                 return (false);
  154.             }
  155.             else {
  156.                 return (true);
  157.             }
  158.         }
  159.        
  160.        
  161.         public bool IsUnrestricted()
  162.         {
  163.             for (int i = 0; i < m_array.Length; ++i) {
  164.                 if (m_array[i].m_id != null || m_array[i].m_role != null || !m_array[i].m_authenticated) {
  165.                     return false;
  166.                 }
  167.             }
  168.             return true;
  169.         }
  170.        
  171.        
  172.         //------------------------------------------------------
  173.         //
  174.         // IPERMISSION IMPLEMENTATION
  175.         //
  176.         //------------------------------------------------------
  177.        
  178.         public bool IsSubsetOf(IPermission target)
  179.         {
  180.             if (target == null) {
  181.                 return this.IsEmpty();
  182.             }
  183.            
  184.             try {
  185.                 PrincipalPermission operand = (PrincipalPermission)target;
  186.                
  187.                 if (operand.IsUnrestricted())
  188.                     return true;
  189.                 else if (this.IsUnrestricted())
  190.                     return false;
  191.                 else {
  192.                     for (int i = 0; i < this.m_array.Length; ++i) {
  193.                         bool foundMatch = false;
  194.                        
  195.                         for (int j = 0; j < operand.m_array.Length; ++j) {
  196.                             if (operand.m_array[j].m_authenticated == this.m_array[i].m_authenticated && (operand.m_array[j].m_id == null || (this.m_array[i].m_id != null && this.m_array[i].m_id.Equals(operand.m_array[j].m_id))) && (operand.m_array[j].m_role == null || (this.m_array[i].m_role != null && this.m_array[i].m_role.Equals(operand.m_array[j].m_role)))) {
  197.                                 foundMatch = true;
  198.                                 break;
  199.                             }
  200.                         }
  201.                        
  202.                         if (!foundMatch)
  203.                             return false;
  204.                     }
  205.                    
  206.                     return true;
  207.                 }
  208.             }
  209.             catch (InvalidCastException) {
  210.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  211.             }
  212.            
  213.            
  214.         }
  215.        
  216.         public IPermission Intersect(IPermission target)
  217.         {
  218.             if (target == null) {
  219.                 return null;
  220.             }
  221.             else if (!VerifyType(target)) {
  222.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  223.             }
  224.             else if (this.IsUnrestricted()) {
  225.                 return target.Copy();
  226.             }
  227.            
  228.             PrincipalPermission operand = (PrincipalPermission)target;
  229.            
  230.             if (operand.IsUnrestricted()) {
  231.                 return this.Copy();
  232.             }
  233.            
  234.             ArrayList idroles = null;
  235.            
  236.             for (int i = 0; i < this.m_array.Length; ++i) {
  237.                 for (int j = 0; j < operand.m_array.Length; ++j) {
  238.                     if (operand.m_array[j].m_authenticated == this.m_array[i].m_authenticated) {
  239.                         if (operand.m_array[j].m_id == null || this.m_array[i].m_id == null || this.m_array[i].m_id.Equals(operand.m_array[j].m_id)) {
  240.                             if (idroles == null) {
  241.                                 idroles = new ArrayList();
  242.                             }
  243.                            
  244.                             IDRole idrole = new IDRole();
  245.                            
  246.                             idrole.m_id = operand.m_array[j].m_id == null ? this.m_array[i].m_id : operand.m_array[j].m_id;
  247.                            
  248.                             if (operand.m_array[j].m_role == null || this.m_array[i].m_role == null || this.m_array[i].m_role.Equals(operand.m_array[j].m_role)) {
  249.                                 idrole.m_role = operand.m_array[j].m_role == null ? this.m_array[i].m_role : operand.m_array[j].m_role;
  250.                             }
  251.                             else {
  252.                                 idrole.m_role = "";
  253.                             }
  254.                            
  255.                             idrole.m_authenticated = operand.m_array[j].m_authenticated;
  256.                            
  257.                             idroles.Add(idrole);
  258.                         }
  259.                         else if (operand.m_array[j].m_role == null || this.m_array[i].m_role == null || this.m_array[i].m_role.Equals(operand.m_array[j].m_role)) {
  260.                             if (idroles == null) {
  261.                                 idroles = new ArrayList();
  262.                             }
  263.                            
  264.                             IDRole idrole = new IDRole();
  265.                            
  266.                             idrole.m_id = "";
  267.                             idrole.m_role = operand.m_array[j].m_role == null ? this.m_array[i].m_role : operand.m_array[j].m_role;
  268.                             idrole.m_authenticated = operand.m_array[j].m_authenticated;
  269.                            
  270.                             idroles.Add(idrole);
  271.                         }
  272.                     }
  273.                 }
  274.             }
  275.            
  276.             if (idroles == null) {
  277.                 return null;
  278.             }
  279.             else {
  280.                 IDRole[] idrolesArray = new IDRole[idroles.Count];
  281.                
  282.                 IEnumerator idrolesEnumerator = idroles.GetEnumerator();
  283.                 int index = 0;
  284.                
  285.                 while (idrolesEnumerator.MoveNext()) {
  286.                     idrolesArray[index++] = (IDRole)idrolesEnumerator.Current;
  287.                 }
  288.                
  289.                 return new PrincipalPermission(idrolesArray);
  290.             }
  291.         }
  292.        
  293.         public IPermission Union(IPermission other)
  294.         {
  295.             if (other == null) {
  296.                 return this.Copy();
  297.             }
  298.             else if (!VerifyType(other)) {
  299.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
  300.             }
  301.            
  302.             PrincipalPermission operand = (PrincipalPermission)other;
  303.            
  304.             if (this.IsUnrestricted() || operand.IsUnrestricted()) {
  305.                 return new PrincipalPermission(PermissionState.Unrestricted);
  306.             }
  307.            
  308.             // Now we have to do a real union
  309.            
  310.             int combinedLength = this.m_array.Length + operand.m_array.Length;
  311.             IDRole[] idrolesArray = new IDRole[combinedLength];
  312.            
  313.             int i;
  314.             int j;
  315.             for (i = 0; i < this.m_array.Length; ++i) {
  316.                 idrolesArray[i] = this.m_array[i];
  317.             }
  318.            
  319.             for (j = 0; j < operand.m_array.Length; ++j) {
  320.                 idrolesArray[i + j] = operand.m_array[j];
  321.             }
  322.            
  323.             return new PrincipalPermission(idrolesArray);
  324.            
  325.         }
  326.        
  327.         [System.Runtime.InteropServices.ComVisible(false)]
  328.         public override bool Equals(object obj)
  329.         {
  330.             IPermission perm = obj as IPermission;
  331.             if (obj != null && perm == null)
  332.                 return false;
  333.             if (!this.IsSubsetOf(perm))
  334.                 return false;
  335.             if (perm != null && !perm.IsSubsetOf(this))
  336.                 return false;
  337.             return true;
  338.         }
  339.        
  340.         [System.Runtime.InteropServices.ComVisible(false)]
  341.         public override int GetHashCode()
  342.         {
  343.             int hash = 0;
  344.             int i;
  345.             for (i = 0; i < m_array.Length; i++)
  346.                 hash += m_array[i].GetHashCode();
  347.             return hash;
  348.         }
  349.        
  350.         public IPermission Copy()
  351.         {
  352.             return new PrincipalPermission(m_array);
  353.         }
  354.        
  355.         private void ThrowSecurityException()
  356.         {
  357.             System.Reflection.AssemblyName name = null;
  358.             System.Security.Policy.Evidence evid = null;
  359.             PermissionSet.s_fullTrust.Assert();
  360.             try {
  361.                 System.Reflection.Assembly asm = Reflection.Assembly.GetCallingAssembly();
  362.                 name = asm.GetName();
  363.                 if (asm != Assembly.GetExecutingAssembly())
  364.                     // this condition is to avoid having to marshal mscorlib's evidence (which is always in teh default domain) to the current domain
  365.                     evid = asm.Evidence;
  366.             }
  367.             catch {
  368.             }
  369.             PermissionSet.RevertAssert();
  370.             throw new SecurityException(Environment.GetResourceString("Security_PrincipalPermission"), name, null, null, null, SecurityAction.Demand, this, this, evid);
  371.         }
  372.        
  373.         public void Demand()
  374.         {
  375.             new SecurityPermission(SecurityPermissionFlag.ControlPrincipal).Assert();
  376.             IPrincipal principal = Thread.CurrentPrincipal;
  377.            
  378.             if (principal == null)
  379.                 ThrowSecurityException();
  380.            
  381.             if (m_array == null)
  382.                 return;
  383.            
  384.             // A demand passes when the grant satisfies all entries.
  385.            
  386.             int count = this.m_array.Length;
  387.             bool foundMatch = false;
  388.             for (int i = 0; i < count; ++i) {
  389.                 // If the demand is authenticated, we need to check the identity and role
  390.                
  391.                 if (m_array[i].m_authenticated) {
  392.                     IIdentity identity = principal.Identity;
  393.                    
  394.                     if ((identity.IsAuthenticated && (m_array[i].m_id == null || String.Compare(identity.Name, m_array[i].m_id, StringComparison.OrdinalIgnoreCase) == 0))) {
  395.                         if (m_array[i].m_role == null) {
  396.                             foundMatch = true;
  397.                         }
  398.                         else {
  399.                             foundMatch = principal.IsInRole(m_array[i].m_role);
  400.                         }
  401.                        
  402.                         if (foundMatch)
  403.                             break;
  404.                     }
  405.                 }
  406.                 else {
  407.                     foundMatch = true;
  408.                     break;
  409.                 }
  410.             }
  411.            
  412.             if (!foundMatch)
  413.                 ThrowSecurityException();
  414.         }
  415.        
  416.         public SecurityElement ToXml()
  417.         {
  418.             SecurityElement root = new SecurityElement("IPermission");
  419.            
  420.             XMLUtil.AddClassAttribute(root, this.GetType(), "System.Security.Permissions.PrincipalPermission");
  421.             // If you hit this assert then most likely you are trying to change the name of this class.
  422.             // This is ok as long as you change the hard coded string above and change the assert below.
  423.             BCLDebug.Assert(this.GetType().FullName.Equals("System.Security.Permissions.PrincipalPermission"), "Class name changed!");
  424.            
  425.             root.AddAttribute("version", "1");
  426.            
  427.             int count = m_array.Length;
  428.             for (int i = 0; i < count; ++i) {
  429.                 root.AddChild(m_array[i].ToXml());
  430.             }
  431.            
  432.             return root;
  433.         }
  434.        
  435.         public void FromXml(SecurityElement elem)
  436.         {
  437.             CodeAccessPermission.ValidateElement(elem, this);
  438.            
  439.             if (elem.InternalChildren != null && elem.InternalChildren.Count != 0) {
  440.                 int numChildren = elem.InternalChildren.Count;
  441.                 int count = 0;
  442.                
  443.                 m_array = new IDRole[numChildren];
  444.                
  445.                 IEnumerator enumerator = elem.Children.GetEnumerator();
  446.                
  447.                 while (enumerator.MoveNext()) {
  448.                     IDRole idrole = new IDRole();
  449.                    
  450.                     idrole.FromXml((SecurityElement)enumerator.Current);
  451.                    
  452.                     m_array[count++] = idrole;
  453.                 }
  454.             }
  455.             else
  456.                 m_array = new IDRole[0];
  457.         }
  458.        
  459.         public override string ToString()
  460.         {
  461.             return ToXml().ToString();
  462.         }
  463.        
  464.         /// <internalonly/>
  465.         int IBuiltInPermission.GetTokenIndex()
  466.         {
  467.             return PrincipalPermission.GetTokenIndex();
  468.         }
  469.        
  470.         static internal int GetTokenIndex()
  471.         {
  472.             return BuiltInPermissionIndex.PrincipalPermissionIndex;
  473.         }
  474.        
  475.     }
  476.    
  477. }

Developer Fusion