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

  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. // ApplicationSecurityInfo.cs
  17. //
  18. // The application security info holds all the security related information pertinent
  19. // to the application. In some sense, it is the CLR public representation of the security
  20. // information held in the manifest.
  21. //
  22. namespace System.Security.Policy
  23. {
  24.     using System.Collections;
  25.     using System.Deployment.Internal.Isolation;
  26.     using System.Deployment.Internal.Isolation.Manifest;
  27.     using System.Globalization;
  28.     using System.Runtime.InteropServices;
  29.     using System.Security.Cryptography;
  30.     using System.Security.Permissions;
  31.     using System.Security.Policy;
  32.     using System.Security.Util;
  33.     using System.Threading;
  34.     using System.Runtime.Versioning;
  35.    
  36.     [SecurityPermissionAttribute(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode)]
  37.     [System.Runtime.InteropServices.ComVisible(true)]
  38.     public sealed class ApplicationSecurityInfo
  39.     {
  40.         private ActivationContext m_context;
  41.         private object m_appId;
  42.         private object m_deployId;
  43.         private object m_defaultRequest;
  44.         private object m_appEvidence;
  45.        
  46.         internal ApplicationSecurityInfo()
  47.         {
  48.         }
  49.        
  50.         //
  51.         // Public.
  52.         //
  53.        
  54.         public ApplicationSecurityInfo(ActivationContext activationContext)
  55.         {
  56.             if (activationContext == null)
  57.                 throw new ArgumentNullException("activationContext");
  58.             m_context = activationContext;
  59.         }
  60.        
  61.         public ApplicationId ApplicationId {
  62.             get {
  63.                 if (m_appId == null && m_context != null) {
  64.                     ICMS appManifest = m_context.ApplicationComponentManifest;
  65.                     ApplicationId appId = ParseApplicationId(appManifest);
  66.                     Interlocked.CompareExchange(ref m_appId, appId, null);
  67.                 }
  68.                 return m_appId as ApplicationId;
  69.             }
  70.             set {
  71.                 if (value == null)
  72.                     throw new ArgumentNullException("value");
  73.                 m_appId = value;
  74.             }
  75.         }
  76.        
  77.         public ApplicationId DeploymentId {
  78.             get {
  79.                 if (m_deployId == null && m_context != null) {
  80.                     ICMS deplManifest = m_context.DeploymentComponentManifest;
  81.                     ApplicationId deplId = ParseApplicationId(deplManifest);
  82.                     Interlocked.CompareExchange(ref m_deployId, deplId, null);
  83.                 }
  84.                 return m_deployId as ApplicationId;
  85.             }
  86.             set {
  87.                 if (value == null)
  88.                     throw new ArgumentNullException("value");
  89.                 m_deployId = value;
  90.             }
  91.         }
  92.        
  93.         public PermissionSet DefaultRequestSet {
  94.             [ResourceExposure(ResourceScope.None)]
  95.             [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
  96.             get {
  97.                 if (m_defaultRequest == null) {
  98.                     PermissionSet defaultRequest = new PermissionSet(PermissionState.None);
  99.                     if (m_context != null) {
  100.                         // read the default request from the app manifest.
  101.                         ICMS appManifest = m_context.ApplicationComponentManifest;
  102.                         string defaultPSetId = ((IMetadataSectionEntry)appManifest.MetadataSectionEntry).defaultPermissionSetID;
  103.                         object permissionSetObj = null;
  104.                         if (defaultPSetId != null && defaultPSetId.Length > 0) {
  105.                             ((ISectionWithStringKey)appManifest.PermissionSetSection).Lookup(defaultPSetId, out permissionSetObj);
  106.                             IPermissionSetEntry defaultPSet = permissionSetObj as IPermissionSetEntry;
  107.                             if (defaultPSet != null) {
  108.                                 SecurityElement seDefaultPS = SecurityElement.FromString(defaultPSet.AllData.XmlSegment);
  109.                                 string unrestricted = seDefaultPS.Attribute("temp:Unrestricted");
  110.                                 if (unrestricted != null)
  111.                                     seDefaultPS.AddAttribute("Unrestricted", unrestricted);
  112.                                 defaultRequest = new PermissionSet(PermissionState.None);
  113.                                 defaultRequest.FromXml(seDefaultPS);
  114.                                
  115.                                 // Look for "SameSite" request.
  116.                                 string sameSite = seDefaultPS.Attribute("SameSite");
  117.                                 if (String.Compare(sameSite, "Site", StringComparison.OrdinalIgnoreCase) == 0) {
  118.                                     NetCodeGroup netCodeGroup = new NetCodeGroup(new AllMembershipCondition());
  119.                                     Url url = new Url(m_context.Identity.CodeBase);
  120.                                     PolicyStatement ps = netCodeGroup.CalculatePolicy(url.GetURLString().Host, url.GetURLString().Scheme, url.GetURLString().Port);
  121.                                     if (ps != null) {
  122.                                         PermissionSet netPermissionSet = ps.PermissionSet;
  123.                                         if (netPermissionSet != null)
  124.                                             defaultRequest.InplaceUnion(netPermissionSet);
  125.                                     }
  126.                                     if (String.Compare("file:", 0, m_context.Identity.CodeBase, 0, 5, StringComparison.OrdinalIgnoreCase) == 0) {
  127.                                         FileCodeGroup fileCodeGroup = new FileCodeGroup(new AllMembershipCondition(), FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery);
  128.                                         ps = fileCodeGroup.CalculatePolicy(url);
  129.                                         if (ps != null) {
  130.                                             PermissionSet filePermissionSet = ps.PermissionSet;
  131.                                             if (filePermissionSet != null)
  132.                                                 defaultRequest.InplaceUnion(filePermissionSet);
  133.                                         }
  134.                                     }
  135.                                 }
  136.                             }
  137.                         }
  138.                     }
  139.                     Interlocked.CompareExchange(ref m_defaultRequest, defaultRequest, null);
  140.                 }
  141.                 return m_defaultRequest as PermissionSet;
  142.             }
  143.             set {
  144.                 if (value == null)
  145.                     throw new ArgumentNullException("value");
  146.                 m_defaultRequest = value;
  147.             }
  148.         }
  149.        
  150.         public Evidence ApplicationEvidence {
  151.             get {
  152.                 if (m_appEvidence == null) {
  153.                     Evidence appEvidence = new Evidence();
  154.                     if (m_context != null) {
  155.                         appEvidence = new Evidence();
  156.                         Url deploymentUrl = new Url(m_context.Identity.CodeBase);
  157.                         appEvidence.AddHost(deploymentUrl);
  158.                         appEvidence.AddHost(Zone.CreateFromUrl(m_context.Identity.CodeBase));
  159.                         if (String.Compare("file:", 0, m_context.Identity.CodeBase, 0, 5, StringComparison.OrdinalIgnoreCase) != 0)
  160.                             appEvidence.AddHost(Site.CreateFromUrl(m_context.Identity.CodeBase));
  161.                         appEvidence.AddHost(new StrongName(new StrongNamePublicKeyBlob(DeploymentId.m_publicKeyToken), DeploymentId.Name, DeploymentId.Version));
  162.                     }
  163.                     Interlocked.CompareExchange(ref m_appEvidence, appEvidence, null);
  164.                 }
  165.                 return m_appEvidence as Evidence;
  166.             }
  167.             set {
  168.                 if (value == null)
  169.                     throw new ArgumentNullException("value");
  170.                 m_appEvidence = value;
  171.             }
  172.         }
  173.        
  174.         //
  175.         // Internal.
  176.         //
  177.        
  178.         private static ApplicationId ParseApplicationId(ICMS manifest)
  179.         {
  180.             if (manifest.Identity == null)
  181.                 return null;
  182.            
  183.             return new ApplicationId(Hex.DecodeHexString(manifest.Identity.GetAttribute("", "publicKeyToken")), manifest.Identity.GetAttribute("", "name"), new Version(manifest.Identity.GetAttribute("", "version")), manifest.Identity.GetAttribute("", "processorArchitecture"), manifest.Identity.GetAttribute("", "culture"));
  184.         }
  185.     }
  186. }

Developer Fusion