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

  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. // PermissionRequestEvidence.cs
  16. //
  17. // Encapsulation of permission request as an evidence type.
  18. //
  19. namespace System.Security.Policy
  20. {
  21.     using System.Runtime.Remoting;
  22.     using System;
  23.     using System.IO;
  24.     using System.Security.Util;
  25.     using System.Collections;
  26.     using System.Runtime.Serialization;
  27.    
  28.     [Serializable()]
  29.     [System.Runtime.InteropServices.ComVisible(true)]
  30.     public sealed class PermissionRequestEvidence : IBuiltInEvidence
  31.     {
  32.         private PermissionSet m_request;
  33.         private PermissionSet m_optional;
  34.         private PermissionSet m_denied;
  35.         private string m_strRequest;
  36.         private string m_strOptional;
  37.         private string m_strDenied;
  38.         private const char idRequest = (char)0;
  39.         private const char idOptional = (char)1;
  40.         private const char idDenied = (char)2;
  41.        
  42.         public PermissionRequestEvidence(PermissionSet request, PermissionSet optional, PermissionSet denied)
  43.         {
  44.             if (request == null)
  45.                 m_request = null;
  46.             else
  47.                 m_request = request.Copy();
  48.            
  49.             if (optional == null)
  50.                 m_optional = null;
  51.             else
  52.                 m_optional = optional.Copy();
  53.            
  54.             if (denied == null)
  55.                 m_denied = null;
  56.             else
  57.                 m_denied = denied.Copy();
  58.         }
  59.        
  60.         internal PermissionRequestEvidence()
  61.         {
  62.         }
  63.        
  64.         public PermissionSet RequestedPermissions {
  65.             get { return m_request; }
  66.         }
  67.        
  68.         public PermissionSet OptionalPermissions {
  69.             get { return m_optional; }
  70.         }
  71.        
  72.         public PermissionSet DeniedPermissions {
  73.             get { return m_denied; }
  74.         }
  75.        
  76.         public PermissionRequestEvidence Copy()
  77.         {
  78.             return new PermissionRequestEvidence(m_request, m_optional, m_denied);
  79.         }
  80.        
  81.         internal SecurityElement ToXml()
  82.         {
  83.             SecurityElement root = new SecurityElement("System.Security.Policy.PermissionRequestEvidence");
  84.             // If you hit this assert then most likely you are trying to change the name of this class.
  85.             // This is ok as long as you change the hard coded string above and change the assert below.
  86.             BCLDebug.Assert(this.GetType().FullName.Equals("System.Security.Policy.PermissionRequestEvidence"), "Class name changed!");
  87.            
  88.             root.AddAttribute("version", "1");
  89.            
  90.             SecurityElement elem;
  91.            
  92.             if (m_request != null) {
  93.                 elem = new SecurityElement("Request");
  94.                 elem.AddChild(m_request.ToXml());
  95.                 root.AddChild(elem);
  96.             }
  97.            
  98.             if (m_optional != null) {
  99.                 elem = new SecurityElement("Optional");
  100.                 elem.AddChild(m_optional.ToXml());
  101.                 root.AddChild(elem);
  102.             }
  103.            
  104.             if (m_denied != null) {
  105.                 elem = new SecurityElement("Denied");
  106.                 elem.AddChild(m_denied.ToXml());
  107.                 root.AddChild(elem);
  108.             }
  109.            
  110.             return root;
  111.         }
  112.        
  113.        
  114.         internal void CreateStrings()
  115.         {
  116.             if (m_strRequest == null && m_request != null)
  117.                 m_strRequest = m_request.ToXml().ToString();
  118.            
  119.             if (m_strOptional == null && m_optional != null)
  120.                 m_strOptional = m_optional.ToXml().ToString();
  121.            
  122.             if (m_strDenied == null && m_denied != null)
  123.                 m_strDenied = m_denied.ToXml().ToString();
  124.         }
  125.        
  126.         /// <internalonly/>
  127.         int IBuiltInEvidence.OutputToBuffer(char[] buffer, int position, bool verbose)
  128.         {
  129.             CreateStrings();
  130.            
  131.             int currentPosition = position;
  132.             int numPermSetsPos = 0;
  133.             int numPermSets = 0;
  134.             int tempLength;
  135.            
  136.             buffer[currentPosition++] = BuiltInEvidenceHelper.idPermissionRequestEvidence;
  137.            
  138.             if (verbose) {
  139.                 // Reserve some space to store the number of permission sets added
  140.                 numPermSetsPos = currentPosition;
  141.                 currentPosition += 2;
  142.             }
  143.            
  144.             if (m_strRequest != null) {
  145.                 tempLength = m_strRequest.Length;
  146.                 if (verbose) {
  147.                     buffer[currentPosition++] = idRequest;
  148.                     BuiltInEvidenceHelper.CopyIntToCharArray(tempLength, buffer, currentPosition);
  149.                     currentPosition += 2;
  150.                     numPermSets++;
  151.                 }
  152.                 m_strRequest.CopyTo(0, buffer, currentPosition, tempLength);
  153.                 currentPosition += tempLength;
  154.             }
  155.            
  156.             if (m_strOptional != null) {
  157.                 tempLength = m_strOptional.Length;
  158.                 if (verbose) {
  159.                     buffer[currentPosition++] = idOptional;
  160.                     BuiltInEvidenceHelper.CopyIntToCharArray(tempLength, buffer, currentPosition);
  161.                     currentPosition += 2;
  162.                     numPermSets++;
  163.                 }
  164.                 m_strOptional.CopyTo(0, buffer, currentPosition, tempLength);
  165.                 currentPosition += tempLength;
  166.             }
  167.            
  168.             if (m_strDenied != null) {
  169.                 tempLength = m_strDenied.Length;
  170.                 if (verbose) {
  171.                     buffer[currentPosition++] = idDenied;
  172.                     BuiltInEvidenceHelper.CopyIntToCharArray(tempLength, buffer, currentPosition);
  173.                     currentPosition += 2;
  174.                     numPermSets++;
  175.                 }
  176.                 m_strDenied.CopyTo(0, buffer, currentPosition, tempLength);
  177.                 currentPosition += tempLength;
  178.             }
  179.            
  180.             if (verbose)
  181.                 BuiltInEvidenceHelper.CopyIntToCharArray(numPermSets, buffer, numPermSetsPos);
  182.            
  183.             return currentPosition;
  184.         }
  185.        
  186.         /// <internalonly/>
  187.         int IBuiltInEvidence.GetRequiredSize(bool verbose)
  188.         {
  189.             CreateStrings();
  190.            
  191.             int currentPosition = 1;
  192.            
  193.             if (m_strRequest != null) {
  194.                 if (verbose)
  195.                     currentPosition += 3;
  196.                 // identifier + length
  197.                 currentPosition += m_strRequest.Length;
  198.             }
  199.            
  200.             if (m_strOptional != null) {
  201.                 if (verbose)
  202.                     currentPosition += 3;
  203.                 currentPosition += m_strOptional.Length;
  204.             }
  205.            
  206.             if (m_strDenied != null) {
  207.                 if (verbose)
  208.                     currentPosition += 3;
  209.                 currentPosition += m_strDenied.Length;
  210.             }
  211.            
  212.             if (verbose)
  213.                 currentPosition += 2;
  214.             // Number of permission sets in the evidence
  215.             return currentPosition;
  216.         }
  217.        
  218.         /// <internalonly/>
  219.         int IBuiltInEvidence.InitFromBuffer(char[] buffer, int position)
  220.         {
  221.             int numPermSets = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position);
  222.             position += 2;
  223.            
  224.             int tempLength;
  225.             for (int i = 0; i < numPermSets; i++) {
  226.                 char psKind = buffer[position++];
  227.                
  228.                 tempLength = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position);
  229.                 position += 2;
  230.                
  231.                 string tempStr = new string(buffer, position, tempLength);
  232.                 position += tempLength;
  233.                 Parser p = new Parser(tempStr);
  234.                
  235.                 PermissionSet psTemp = new PermissionSet();
  236.                 psTemp.FromXml(p.GetTopElement());
  237.                
  238.                 switch (psKind) {
  239.                     case idRequest:
  240.                         m_strRequest = tempStr;
  241.                         m_request = psTemp;
  242.                         break;
  243.                     case idOptional:
  244.                        
  245.                         m_strOptional = tempStr;
  246.                         m_optional = psTemp;
  247.                         break;
  248.                     case idDenied:
  249.                        
  250.                         m_strDenied = tempStr;
  251.                         m_denied = psTemp;
  252.                         break;
  253.                     default:
  254.                        
  255.                         throw new SerializationException(Environment.GetResourceString("Serialization_UnableToFixup"));
  256.                         break;
  257.                 }
  258.             }
  259.            
  260.             return position;
  261.         }
  262.        
  263.         public override string ToString()
  264.         {
  265.             return ToXml().ToString();
  266.         }
  267.     }
  268. }

Developer Fusion