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

  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. // FirstMatchCodeGroup.cs
  16. //
  17. // Representation for code groups used for the policy mechanism
  18. //
  19. namespace System.Security.Policy
  20. {
  21.    
  22.     using System;
  23.     using System.Security.Util;
  24.     using System.Security;
  25.     using System.Collections;
  26.    
  27.     [Serializable()]
  28.     [System.Runtime.InteropServices.ComVisible(true)]
  29.     public sealed class FirstMatchCodeGroup : CodeGroup
  30.     {
  31.         internal FirstMatchCodeGroup() : base()
  32.         {
  33.         }
  34.        
  35.         public FirstMatchCodeGroup(IMembershipCondition membershipCondition, PolicyStatement policy) : base(membershipCondition, policy)
  36.         {
  37.         }
  38.        
  39.        
  40.         public override PolicyStatement Resolve(Evidence evidence)
  41.         {
  42.             if (evidence == null)
  43.                 throw new ArgumentNullException("evidence");
  44.            
  45.             if (this.MembershipCondition.Check(evidence)) {
  46.                 PolicyStatement childPolicy = null;
  47.                
  48.                 IEnumerator enumerator = this.Children.GetEnumerator();
  49.                
  50.                 while (enumerator.MoveNext()) {
  51.                     childPolicy = ((CodeGroup)enumerator.Current).Resolve(evidence);
  52.                    
  53.                     // If the child has a policy, we are done.
  54.                    
  55.                     if (childPolicy != null)
  56.                         break;
  57.                 }
  58.                
  59.                 PolicyStatement thisPolicy = this.PolicyStatement;
  60.                
  61.                 if (thisPolicy == null) {
  62.                     return childPolicy;
  63.                 }
  64.                 else if (childPolicy != null) {
  65.                     // Combine the child and this policy and return it.
  66.                    
  67.                     PolicyStatement combined = new PolicyStatement();
  68.                    
  69.                     combined.SetPermissionSetNoCopy(thisPolicy.GetPermissionSetNoCopy().Union(childPolicy.GetPermissionSetNoCopy()));
  70.                    
  71.                     // if both this group and matching child group are exclusive we need to throw an exception
  72.                    
  73.                     if (((thisPolicy.Attributes & childPolicy.Attributes) & PolicyStatementAttribute.Exclusive) == PolicyStatementAttribute.Exclusive)
  74.                         throw new PolicyException(Environment.GetResourceString("Policy_MultipleExclusive"));
  75.                    
  76.                     combined.Attributes = thisPolicy.Attributes | childPolicy.Attributes;
  77.                    
  78.                     return combined;
  79.                 }
  80.                 else {
  81.                     // Otherwise we just copy the this policy.
  82.                    
  83.                     return this.PolicyStatement;
  84.                 }
  85.             }
  86.             else {
  87.                 return null;
  88.             }
  89.         }
  90.        
  91.         public override CodeGroup ResolveMatchingCodeGroups(Evidence evidence)
  92.         {
  93.             if (evidence == null)
  94.                 throw new ArgumentNullException("evidence");
  95.            
  96.             if (this.MembershipCondition.Check(evidence)) {
  97.                 CodeGroup retGroup = this.Copy();
  98.                
  99.                 retGroup.Children = new ArrayList();
  100.                
  101.                 IEnumerator enumerator = this.Children.GetEnumerator();
  102.                
  103.                 while (enumerator.MoveNext()) {
  104.                     CodeGroup matchingGroups = ((CodeGroup)enumerator.Current).ResolveMatchingCodeGroups(evidence);
  105.                    
  106.                     // If the child has a policy, we are done.
  107.                    
  108.                     if (matchingGroups != null) {
  109.                         retGroup.AddChild(matchingGroups);
  110.                         break;
  111.                     }
  112.                 }
  113.                
  114.                 return retGroup;
  115.                
  116.             }
  117.             else {
  118.                 return null;
  119.             }
  120.         }
  121.        
  122.         public override CodeGroup Copy()
  123.         {
  124.             FirstMatchCodeGroup group = new FirstMatchCodeGroup();
  125.            
  126.             group.MembershipCondition = this.MembershipCondition;
  127.             group.PolicyStatement = this.PolicyStatement;
  128.             group.Name = this.Name;
  129.             group.Description = this.Description;
  130.            
  131.             IEnumerator enumerator = this.Children.GetEnumerator();
  132.            
  133.             while (enumerator.MoveNext()) {
  134.                 group.AddChild((CodeGroup)enumerator.Current);
  135.             }
  136.            
  137.             return group;
  138.         }
  139.        
  140.        
  141.         public override string MergeLogic {
  142.             get { return Environment.GetResourceString("MergeLogic_FirstMatch"); }
  143.         }
  144.        
  145.         internal override string GetTypeName()
  146.         {
  147.             return "System.Security.Policy.FirstMatchCodeGroup";
  148.         }
  149.        
  150.     }
  151.    
  152.    
  153. }

Developer Fusion