The Labs \ Source Viewer \ SSCLI \ Microsoft.Tools.Caspol \ OptionTableEntry

  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. *  caspol.cs
  17. *
  18. *  caspol is a command-line utility for manipulating the policy for a machine.
  19. *
  20. *                                       
  21. */
  22. using System;
  23. using System.Collections;
  24. using System.IO;
  25. using System.Security.Policy;
  26. using System.Security;
  27. using System.Text;
  28. using System.Reflection;
  29. using System.Security.Cryptography;
  30. using System.Security.Cryptography.X509Certificates;
  31. using System.Security.Permissions;
  32. using System.Security.Principal;
  33. using Microsoft.Win32;
  34. using System.Runtime.InteropServices;
  35. using System.Runtime.CompilerServices;
  36. using System.Globalization;
  37. using System.Resources;
  38. using System.Threading;
  39. namespace Microsoft.Tools.Caspol
  40. {
  41.     delegate void OptionHandler(string[] args, int index, out int numArgsUsed);
  42.     delegate IMembershipCondition MembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset);
  43.     delegate void CodeGroupAttributeHandler(CodeGroup group, string[] args, int index, out int offset);
  44.    
  45.     enum LevelType
  46.     {
  47.         None = 0,
  48.         Machine = 1,
  49.         UserDefault = 2,
  50.         UserCustom = 3,
  51.         All = 4,
  52.         Enterprise = 5,
  53.         AllCustom = 6
  54.     }
  55.    
  56.     internal class caspol
  57.     {
  58.        
  59.         #if !PLATFORM_UNIX
  60.         internal const string DLLPREFIX = "";
  61.         internal const string DLLSUFFIX = ".dll";
  62.         #else // !PLATFORM_UNIX
  63.         #if __APPLE__
  64.         internal const string DLLPREFIX = "lib";
  65.         internal const string DLLSUFFIX = ".dylib";
  66.         #else
  67.         internal const string DLLPREFIX = "lib";
  68.         internal const string DLLSUFFIX = ".so";
  69.         #endif
  70.         #endif // !PLATFORM_UNIX
  71.        
  72.         internal const string ROTOR_PALRT = DLLPREFIX + "rotor_palrt" + DLLSUFFIX;
  73.        
  74.         [DllImport(ROTOR_PALRT, CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "PAL_FetchConfigurationStringW")]
  75.         static internal extern bool FetchConfigurationString(bool perMachine, string parameterName, StringBuilder parameterValue, int parameterValueLength);
  76.        
  77.         [DllImport(ROTOR_PALRT, CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "PAL_SetConfigurationStringW")]
  78.         static internal extern bool SetConfigurationString(bool perMachine, string parameterName, string parameterValue);
  79.        
  80.        
  81.        
  82.         // Indicator of the last specified level.
  83.         private static LevelType m_levelType = LevelType.None;
  84.         private static PolicyLevel m_currentCustomLevel;
  85.         private static string m_levelPath;
  86.         private static ArrayList m_levelAssemblyList;
  87.        
  88.         private static ArrayList m_machineAssemblies = new ArrayList();
  89.         private static ArrayList m_userAssemblies = new ArrayList();
  90.         private static ArrayList m_enterpriseAssemblies = new ArrayList();
  91.         private static ArrayList m_customUserAssemblies = new ArrayList();
  92.        
  93.         // The space used to indent the code groups
  94.         private const string m_indent = " ";
  95.        
  96.         // The allowed separators within labels (right now only 1.2.3 is legal)
  97.         private const string m_labelSeparators = ".";
  98.        
  99.         private static bool m_force = false;
  100.        
  101.         private static bool m_success = true;
  102.        
  103.         private static string m_danglingLevelIndicator = null;
  104.        
  105.         static internal ResourceManager manager = new ResourceManager("caspol", Assembly.GetExecutingAssembly());
  106.        
  107.         // The table of options that are recognized.
  108.         // Note: the order in this table is also the order in which they are displayed
  109.         // on the help screen.
  110.         private static OptionTableEntry[] optionTable = null;
  111.         private static OptionTableEntry[] OptionTable {
  112.             get {
  113.                 if (optionTable == null) {
  114.                     optionTable = new OptionTableEntry[] {new OptionTableEntry(manager.GetString("OptionTable_Machine"), new OptionHandler(MachineHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_MachineAbbr"), new OptionHandler(MachineHandler), manager.GetString("OptionTable_Machine"), false), new OptionTableEntry(manager.GetString("OptionTable_User"), new OptionHandler(UserHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_UserAbbr"), new OptionHandler(UserHandler), manager.GetString("OptionTable_User"), false), new OptionTableEntry(manager.GetString("OptionTable_Enterprise"), new OptionHandler(EnterpriseHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_EnterpriseAbbr"), new OptionHandler(EnterpriseHandler), manager.GetString("OptionTable_Enterprise"), false), new OptionTableEntry(manager.GetString("OptionTable_CustomUser"), new OptionHandler(CustomUserHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_CustomUserAbbr"), new OptionHandler(CustomUserHandler), manager.GetString("OptionTable_CustomUser"), true), new OptionTableEntry(manager.GetString("OptionTable_All"), new OptionHandler(AllHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_AllAbbr"), new OptionHandler(AllHandler), manager.GetString("OptionTable_All"), false),
  115.                     new OptionTableEntry(manager.GetString("OptionTable_CustomAll"), new OptionHandler(CustomAllHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_CustomAllAbbr"), new OptionHandler(CustomAllHandler), manager.GetString("OptionTable_CustomAll"), true), new OptionTableEntry(manager.GetString("OptionTable_List"), new OptionHandler(ListHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ListAbbr"), new OptionHandler(ListHandler), manager.GetString("OptionTable_List"), false), new OptionTableEntry(manager.GetString("OptionTable_ListGroups"), new OptionHandler(ListGroupHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ListGroupsAbbr"), new OptionHandler(ListGroupHandler), manager.GetString("OptionTable_ListGroups"), true), new OptionTableEntry(manager.GetString("OptionTable_ListPSet"), new OptionHandler(ListPermHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ListPSetAbbr"), new OptionHandler(ListPermHandler), manager.GetString("OptionTable_ListPSet"), true), new OptionTableEntry(manager.GetString("OptionTable_ListFullTrust"), new OptionHandler(ListFullTrustHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ListFullTrustAbbr"), new OptionHandler(ListFullTrustHandler), manager.GetString("OptionTable_ListFullTrust"), true),
  116.                     new OptionTableEntry(manager.GetString("OptionTable_ListDescription"), new OptionHandler(ListDescriptionHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ListDescriptionAbbr"), new OptionHandler(ListDescriptionHandler), manager.GetString("OptionTable_ListDescription"), true), new OptionTableEntry(manager.GetString("OptionTable_CheckFullTrust"), new OptionHandler(CheckFullTrustHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_CheckFullTrustAbbr"), new OptionHandler(CheckFullTrustHandler), manager.GetString("OptionTable_CheckFullTrust"), true), new OptionTableEntry(manager.GetString("OptionTable_AddPSet"), new OptionHandler(AddPermHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_AddPSetAbbr"), new OptionHandler(AddPermHandler), manager.GetString("OptionTable_AddPSet"), true), new OptionTableEntry(manager.GetString("OptionTable_ChgPSet"), new OptionHandler(ChgPermHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ChgPSetAbbr"), new OptionHandler(ChgPermHandler), manager.GetString("OptionTable_ChgPSet"), true), new OptionTableEntry(manager.GetString("OptionTable_RemPSet"), new OptionHandler(RemPermHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_RemPSetAbbr"), new OptionHandler(RemPermHandler), manager.GetString("OptionTable_RemPSet"), true),
  117.                     new OptionTableEntry(manager.GetString("OptionTable_AddFullTrust"), new OptionHandler(AddFullTrustHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_AddFullTrustAbbr"), new OptionHandler(AddFullTrustHandler), manager.GetString("OptionTable_AddFullTrust"), true), new OptionTableEntry(manager.GetString("OptionTable_RemFullTrust"), new OptionHandler(RemFullTrustHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_RemFullTrustAbbr"), new OptionHandler(RemFullTrustHandler), manager.GetString("OptionTable_RemFullTrust"), true), new OptionTableEntry(manager.GetString("OptionTable_RemGroup"), new OptionHandler(RemGroupHandler), null, true, true), new OptionTableEntry(manager.GetString("OptionTable_RemGroupAbbr"), new OptionHandler(RemGroupHandler), manager.GetString("OptionTable_RemGroup"), true, true), new OptionTableEntry(manager.GetString("OptionTable_ChgGroup"), new OptionHandler(ChgGroupHandler), null, true, true), new OptionTableEntry(manager.GetString("OptionTable_ChgGroupAbbr"), new OptionHandler(ChgGroupHandler), manager.GetString("OptionTable_ChgGroup"), true, true), new OptionTableEntry(manager.GetString("OptionTable_AddGroup"), new OptionHandler(AddGroupHandler), null, true, true), new OptionTableEntry(manager.GetString("OptionTable_AddGroupAbbr"), new OptionHandler(AddGroupHandler), manager.GetString("OptionTable_AddGroup"), true, true),
  118.                     new OptionTableEntry(manager.GetString("OptionTable_ResolveGroup"), new OptionHandler(ResolveGroupHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ResolveGroupAbbr"), new OptionHandler(ResolveGroupHandler), manager.GetString("OptionTable_ResolveGroup"), true), new OptionTableEntry(manager.GetString("OptionTable_ResolvePerm"), new OptionHandler(ResolvePermHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ResolvePermAbbr"), new OptionHandler(ResolvePermHandler), manager.GetString("OptionTable_ResolvePerm"), true), new OptionTableEntry(manager.GetString("OptionTable_Security"), new OptionHandler(SecurityHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_SecurityAbbr"), new OptionHandler(SecurityHandler), manager.GetString("OptionTable_Security"), false), new OptionTableEntry(manager.GetString("OptionTable_Execution"), new OptionHandler(ExecutionHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ExecutionAbbr"), new OptionHandler(ExecutionHandler), manager.GetString("OptionTable_Execution"), false), new OptionTableEntry(manager.GetString("OptionTable_PolChgPrompt"), new OptionHandler(PolicyChangeHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_PolChgPromptAbbr"), new OptionHandler(PolicyChangeHandler), manager.GetString("OptionTable_PolChgPrompt"), true),
  119.                     new OptionTableEntry(manager.GetString("OptionTable_Quiet"), new OptionHandler(QuietHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_QuietAbbr"), new OptionHandler(QuietHandler), manager.GetString("OptionTable_Quiet"), false), new OptionTableEntry(manager.GetString("OptionTable_Recover"), new OptionHandler(RecoverHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_RecoverAbbr"), new OptionHandler(RecoverHandler), manager.GetString("OptionTable_Recover"), false), new OptionTableEntry(manager.GetString("OptionTable_Reset"), new OptionHandler(ResetHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ResetLockDown"), new OptionHandler(ResetLockDownHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ResetAbbr"), new OptionHandler(ResetHandler), manager.GetString("OptionTable_Reset"), true), new OptionTableEntry(manager.GetString("OptionTable_ResetLockDownAbbr"), new OptionHandler(ResetLockDownHandler), manager.GetString("OptionTable_ResetLockDown"), true), new OptionTableEntry(manager.GetString("OptionTable_Force"), new OptionHandler(ForceHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_ForceAbbr"), new OptionHandler(ForceHandler), manager.GetString("OptionTable_Force"), false),
  120.                     new OptionTableEntry(manager.GetString("OptionTable_BuildCache"), new OptionHandler(BuildCacheHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_BuildCacheAbbr"), new OptionHandler(BuildCacheHandler), manager.GetString("OptionTable_BuildCache"), false), new OptionTableEntry(manager.GetString("OptionTable_Help"), new OptionHandler(HelpHandler), null, true), new OptionTableEntry(manager.GetString("OptionTable_HelpAbbr1"), new OptionHandler(HelpHandler), manager.GetString("OptionTable_Help"), false), new OptionTableEntry(manager.GetString("OptionTable_HelpAbbr2"), new OptionHandler(HelpHandler), manager.GetString("OptionTable_Help"), true), new OptionTableEntry(manager.GetString("OptionTable_HelpAbbr3"), new OptionHandler(HelpHandler), manager.GetString("OptionTable_Help"), true)};
  121.                 }
  122.                 return optionTable;
  123.             }
  124.         }
  125.        
  126.         private static MembershipConditionTableEntry[] mshipTable = null;
  127.         private static MembershipConditionTableEntry[] MembershipTable {
  128.             get {
  129.                 if (mshipTable == null) {
  130.                     mshipTable = new MembershipConditionTableEntry[] {new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_All"), new MembershipConditionHandler(AllMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_AppDir"), new MembershipConditionHandler(ApplicationDirectoryMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Custom"), new MembershipConditionHandler(CustomMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Gac"), new MembershipConditionHandler(GacMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Site"), new MembershipConditionHandler(SiteMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Strong"), new MembershipConditionHandler(StrongNameMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Url"), new MembershipConditionHandler(URLMembershipConditionHandler)), new MembershipConditionTableEntry(manager.GetString("MembershipConditionTable_Zone"), new MembershipConditionHandler(ZoneMembershipConditionHandler))};
  131.                 }
  132.                 return mshipTable;
  133.             }
  134.         }
  135.        
  136.         private static CodeGroupAttributeTableEntry[] cgAttrTable = null;
  137.         private static CodeGroupAttributeTableEntry[] CodeGroupAttrTable {
  138.             get {
  139.                 if (cgAttrTable == null) {
  140.                     cgAttrTable = new CodeGroupAttributeTableEntry[] {new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_Exclusive"), PolicyStatementAttribute.Exclusive, manager.GetString("Help_Option_ExclusiveFlag")), new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_LevelFinal"), PolicyStatementAttribute.LevelFinal, manager.GetString("Help_Option_LevelFinalFlag")), new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_Name"), new CodeGroupAttributeHandler(CodeGroupNameHandler), true), new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_NameAbbr"), new CodeGroupAttributeHandler(CodeGroupNameHandler), false), new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_Description"), new CodeGroupAttributeHandler(CodeGroupDescriptionHandler), true), new CodeGroupAttributeTableEntry(manager.GetString("CodeGroupAttributeTable_DescriptionAbbr"), new CodeGroupAttributeHandler(CodeGroupDescriptionHandler), false)};
  141.                 }
  142.                 return cgAttrTable;
  143.             }
  144.         }
  145.        
  146.         // Map between zone number and zone name.
  147.         private static string[] s_names = {"MyComputer", "Intranet", "Trusted", "Internet", "Untrusted"};
  148.        
  149.         private static bool screenPauseEnabled = false;
  150.         private static readonly int ScreenHeight = 23;
  151.         private static int linesSeen = 0;
  152.        
  153.         private static void PauseCapableWriteLine(string msg)
  154.         {
  155.             string[] splitMsg = msg.Split('\n');
  156.            
  157.             for (int i = 0; i < splitMsg.Length; ++i) {
  158.                 Console.WriteLine(splitMsg[i].Trim(System.Environment.NewLine.ToCharArray()));
  159.                 if (++linesSeen == ScreenHeight && screenPauseEnabled) {
  160.                     Console.WriteLine(manager.GetString("Dialog_PressEnterToContinue"));
  161.                     Console.ReadLine();
  162.                     linesSeen = 0;
  163.                 }
  164.             }
  165.         }
  166.        
  167.         static string GenerateHeader()
  168.         {
  169.             StringBuilder sb = new StringBuilder();
  170.             sb.Append(manager.GetString("PAL_Copyright_Line1") + " " + ThisAssembly.InformationalVersion);
  171.             sb.Append(Environment.NewLine + CommonResStrings.CopyrightForCmdLine + Environment.NewLine);
  172.             return sb.ToString();
  173.         }
  174.        
  175.         public static void Main(string[] args)
  176.         {
  177.             SetConsoleUI();
  178.             PauseCapableWriteLine(GenerateHeader());
  179.             try {
  180.                 if (args.Length == 0) {
  181.                     Error(null, manager.GetString("Error_NotEnoughArgs"), -1);
  182.                 }
  183.                 else {
  184.                     string[] normalizedArgs = args;
  185.                    
  186.                     // Uncomment the line below to enable the new format
  187.                     // Note: this doesn't change acceptance of the old style.
  188.                     // normalizedArgs = NormalizeArguments( args );
  189.                    
  190.                     Run(normalizedArgs);
  191.                 }
  192.             }
  193.             catch (ExitException) {
  194.             }
  195.         }
  196.        
  197.         private static void SetConsoleUI()
  198.         {
  199.         }
  200.        
  201.         static void Run(string[] args)
  202.         {
  203.             int numArgs = args.Length;
  204.             int currentIndex = 0;
  205.             int numArgsUsed = 0;
  206.            
  207.             while (currentIndex < numArgs) {
  208.                 bool foundOption = false;
  209.                
  210.                 for (int index = 0; index < OptionTable.Length; ++index) {
  211.                     if (args[currentIndex].Length > 0 && args[currentIndex][0] == '/') {
  212.                         args[currentIndex] = '-' + args[currentIndex].Substring(1, args[currentIndex].Length - 1);
  213.                     }
  214.                    
  215.                     if (String.Compare(OptionTable[index].option, args[currentIndex], StringComparison.OrdinalIgnoreCase) == 0) {
  216.                         try {
  217.                             OptionTable[index].handler(args, currentIndex, out numArgsUsed);
  218.                         }
  219.                         catch (Exception e) {
  220.                             if (!(e is ExitException)) {
  221.                                 #if _DEBUG
  222.                                 Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_RuntimeError"), e.ToString()), -1);
  223.                                 #else
  224.                                 string message = e.Message;
  225.                                
  226.                                 if (message == null || message.Equals("")) {
  227.                                     message = e.GetType().AssemblyQualifiedName;
  228.                                 }
  229.                                
  230.                                 Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_RuntimeError"), message), -1);
  231.                                 #endif
  232.                             }
  233.                             return;
  234.                         }
  235.                        
  236.                         foundOption = true;
  237.                         currentIndex += numArgsUsed;
  238.                         break;
  239.                     }
  240.                 }
  241.                 if (!foundOption) {
  242.                     try {
  243.                         Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidOption"), args[currentIndex]), -1);
  244.                     }
  245.                     catch (Exception e) {
  246.                         if (!(e is ExitException)) {
  247.                             string message = e.Message;
  248.                            
  249.                             if (message == null || message.Equals("")) {
  250.                                 message = e.GetType().AssemblyQualifiedName;
  251.                             }
  252.                            
  253.                             Help(null, manager.GetString("Error_UnhandledError") + message);
  254.                         }
  255.                         return;
  256.                     }
  257.                 }
  258.             }
  259.             if (m_danglingLevelIndicator != null)
  260.                 PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_DanglingLevelIndicator"), m_danglingLevelIndicator));
  261.            
  262.             if (m_success)
  263.                 PauseCapableWriteLine(manager.GetString("Dialog_Success"));
  264.         }
  265.        
  266.         private static PermissionSet GeneratecaspolRequiredPermSet()
  267.         {
  268.             // caspol.exe requires the FullTrust permission set.
  269.             return new PermissionSet(PermissionState.Unrestricted);
  270.         }
  271.        
  272.         private static int ConvertHexDigit(char val)
  273.         {
  274.             int retval;
  275.             if (val <= '9')
  276.                 retval = (val - '0');
  277.             else if (val >= 'a' && val <= 'f')
  278.                 retval = ((val - 'a') + 10);
  279.             else if (val >= 'A' && val <= 'F')
  280.                 retval = ((val - 'A') + 10);
  281.             else
  282.                 throw new ArgumentException(manager.GetString("Argument_ImproperlyFormattedHexString"));
  283.             return retval;
  284.         }
  285.        
  286.         public static byte[] DecodeHexString(string hexString)
  287.         {
  288.             if (hexString == null)
  289.                 throw new ArgumentNullException("hexString");
  290.            
  291.             bool spaceSkippingMode = false;
  292.            
  293.             int i = 0;
  294.             int length = hexString.Length;
  295.            
  296.             if (hexString.StartsWith("0x", StringComparison.Ordinal)) {
  297.                 length = hexString.Length - 2;
  298.                 i = 2;
  299.             }
  300.            
  301.             // Hex strings must always have 2N or (3N - 1) entries.
  302.             if (length % 2 != 0 && length % 3 != 2) {
  303.                 throw new ArgumentException(manager.GetString("Argument_ImproperlyFormattedHexString"));
  304.             }
  305.            
  306.             byte[] sArray;
  307.            
  308.             if (length >= 3 && hexString[i + 2] == ' ') {
  309.                 spaceSkippingMode = true;
  310.                
  311.                 // Each hex digit will take three spaces, except the first (hence the plus 1).
  312.                 sArray = new byte[length / 3 + 1];
  313.             }
  314.             else {
  315.                 // Each hex digit will take two spaces
  316.                 sArray = new byte[length / 2];
  317.             }
  318.            
  319.             int digit;
  320.             int rawdigit;
  321.             for (int j = 0; i < hexString.Length; i += 2,j++) {
  322.                 rawdigit = ConvertHexDigit(hexString[i]);
  323.                 digit = ConvertHexDigit(hexString[i + 1]);
  324.                 sArray[j] = (byte)(digit | (rawdigit << 4));
  325.                 if (spaceSkippingMode)
  326.                     i++;
  327.             }
  328.             return (sArray);
  329.         }
  330.        
  331.         static void CodeGroupNameHandler(CodeGroup group, string[] args, int index, out int offset)
  332.         {
  333.             offset = 2;
  334.            
  335.             if (args[index].Equals("__internal_usage__")) {
  336.                 PauseCapableWriteLine(manager.GetString("Help_Option_Name"));
  337.                 return;
  338.             }
  339.            
  340.             if (args.Length - index < 1) {
  341.                 ErrorMShip(args[0], manager.GetString("CodeGroupAttributeTable_Name"), manager.GetString("Error_NotEnoughArgs"), -1);
  342.             }
  343.            
  344.             if (args[index + 1][0] >= '0' && args[index + 1][0] <= '9') {
  345.                 ErrorMShip(args[0], manager.GetString("CodeGroupAttributeTable_Name"), manager.GetString("Error_CodeGroup_ImproperName"), -1);
  346.             }
  347.            
  348.             group.Name = args[index + 1];
  349.         }
  350.        
  351.         static void CodeGroupDescriptionHandler(CodeGroup group, string[] args, int index, out int offset)
  352.         {
  353.             offset = 2;
  354.            
  355.             if (args[index].Equals("__internal_usage__")) {
  356.                 PauseCapableWriteLine(manager.GetString("Help_Option_Description"));
  357.                 return;
  358.             }
  359.            
  360.             if (args.Length - index < 1) {
  361.                 ErrorMShip(args[0], manager.GetString("CodeGroupAttributeTable_Description"), manager.GetString("Error_NotEnoughArgs"), -1);
  362.             }
  363.            
  364.             group.Description = args[index + 1];
  365.         }
  366.        
  367.         static PolicyStatementAttribute IsExclusive(CodeGroup group, string[] args, int index, out int argsUsed)
  368.         {
  369.             PolicyStatementAttribute attr = PolicyStatementAttribute.Nothing;
  370.            
  371.             argsUsed = 0;
  372.            
  373.             int usedInThisIteration;
  374.             int tableCount = CodeGroupAttrTable.Length;
  375.            
  376.             do {
  377.                 usedInThisIteration = 0;
  378.                
  379.                 if ((args.Length - (index + argsUsed)) == 0) {
  380.                     break;
  381.                 }
  382.                
  383.                 for (int i = 0; i < tableCount; ++i) {
  384.                     if (String.Compare(args[index + argsUsed], CodeGroupAttrTable[i].label, StringComparison.OrdinalIgnoreCase) == 0) {
  385.                         if (CodeGroupAttrTable[i].handler == null) {
  386.                             if ((args.Length - (index + argsUsed + 1)) <= 0) {
  387.                                 throw new Exception(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_NotEnoughArgs")));
  388.                             }
  389.                             else if (String.Compare(args[index + argsUsed + 1], manager.GetString("Misc_On"), StringComparison.OrdinalIgnoreCase) == 0) {
  390.                                 attr |= CodeGroupAttrTable[i].value;
  391.                             }
  392.                             else if (String.Compare(args[index + argsUsed + 1], manager.GetString("Misc_Off"), StringComparison.OrdinalIgnoreCase) == 0) {
  393.                                 attr &= ~CodeGroupAttrTable[i].value;
  394.                             }
  395.                             else {
  396.                                 throw new Exception(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidOptionTo"), CodeGroupAttrTable[i].label, args[index + argsUsed + 1]));
  397.                             }
  398.                             usedInThisIteration = 2;
  399.                         }
  400.                         else {
  401.                             CodeGroupAttrTable[i].handler(group, args, index + argsUsed, out usedInThisIteration);
  402.                         }
  403.                         break;
  404.                     }
  405.                    
  406.                 }
  407.                 if (usedInThisIteration == 0) {
  408.                     break;
  409.                 }
  410.                 else {
  411.                     argsUsed += usedInThisIteration;
  412.                 }
  413.                
  414.             }
  415.             while (true);
  416.            
  417.             return attr;
  418.         }
  419.        
  420.         static IMembershipCondition CreateMembershipCondition(PolicyLevel level, string[] args, int index, out int offset)
  421.         {
  422.             IMembershipCondition mship = CreateMembershipConditionNoThrow(level, args, index, out offset);
  423.            
  424.             if (mship == null) {
  425.                 int optionIndex = index >= 2 ? 2 : 0;
  426.                 ErrorMShip(args[optionIndex], null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_UnknownMembershipCondition"), args[index]), -1);
  427.             }
  428.            
  429.             return mship;
  430.         }
  431.        
  432.         static IMembershipCondition CreateMembershipConditionNoThrow(PolicyLevel level, string[] args, int index, out int offset)
  433.         {
  434.             for (int i = 0; i < MembershipTable.Length; ++i) {
  435.                 if (String.Compare(MembershipTable[i].option, args[index], StringComparison.OrdinalIgnoreCase) == 0) {
  436.                     return MembershipTable[i].handler(level, args, index, out offset);
  437.                 }
  438.             }
  439.            
  440.             offset = 0;
  441.            
  442.             return null;
  443.         }
  444.        
  445.         static IMembershipCondition AllMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  446.         {
  447.             offset = 1;
  448.            
  449.             if (args[index].Equals("__internal_usage__")) {
  450.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_All"));
  451.                 return null;
  452.             }
  453.            
  454.             return new AllMembershipCondition();
  455.         }
  456.        
  457.         static IMembershipCondition ApplicationDirectoryMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  458.         {
  459.             offset = 1;
  460.            
  461.             if (args[index].Equals("__internal_usage__")) {
  462.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_AppDir"));
  463.                 return null;
  464.             }
  465.            
  466.             return new ApplicationDirectoryMembershipCondition();
  467.         }
  468.        
  469.         static IMembershipCondition CustomMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  470.         {
  471.             if (args[index].Equals("__internal_usage__")) {
  472.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Custom"));
  473.                 offset = 1;
  474.                 return null;
  475.             }
  476.            
  477.             if (args.Length - index < 2) {
  478.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), manager.GetString("Error_NotEnoughArgs"), -1);
  479.             }
  480.            
  481.             offset = 2;
  482.            
  483.             SecurityElement element = ReadXmlFile(args, index + 1);
  484.            
  485.             if (element == null)
  486.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), manager.GetString("Error_Custom_ErrorDecodingArg"), -1);
  487.            
  488.             // Grab the class name and create the proper membership condition;
  489.            
  490.             IMembershipCondition cond = null;
  491.             Type type;
  492.             string className = element.Attribute("class");
  493.            
  494.             if (className == null)
  495.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), manager.GetString("Error_Custom_InvalidXml"), -1);
  496.            
  497.             type = Type.GetType(className);
  498.            
  499.             try {
  500.                 cond = (IMembershipCondition)Activator.CreateInstance(type);
  501.             }
  502.             catch (Exception) {
  503.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), manager.GetString("Error_Custom_UnableToCreate"), -1);
  504.             }
  505.            
  506.             if (cond == null)
  507.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), manager.GetString("Error_Custom_InvalidXml"), -1);
  508.            
  509.             try {
  510.                 cond.FromXml(element);
  511.             }
  512.             catch (Exception e2) {
  513.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Custom"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_Custom_InvalidXml"), e2), -1);
  514.             }
  515.            
  516.             m_levelAssemblyList.Add(cond.GetType().Module.Assembly);
  517.            
  518.             return cond;
  519.         }
  520.        
  521.        
  522.         static IMembershipCondition SiteMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  523.         {
  524.             offset = 2;
  525.            
  526.             if (args[index].Equals("__internal_usage__")) {
  527.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Site"));
  528.                 return null;
  529.             }
  530.            
  531.             if (args.Length - index < 1) {
  532.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Site"), manager.GetString("Error_NotEnoughArgs"), -1);
  533.             }
  534.            
  535.             return new SiteMembershipCondition(args[index + 1]);
  536.         }
  537.        
  538.         static IMembershipCondition GacMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  539.         {
  540.             offset = 1;
  541.            
  542.             if (args[index].Equals("__internal_usage__")) {
  543.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Gac"));
  544.                 return null;
  545.             }
  546.            
  547.             return new GacMembershipCondition();
  548.         }
  549.        
  550.         static IMembershipCondition StrongNameMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  551.         {
  552.             if (args[index].Equals("__internal_usage__")) {
  553.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Strong"));
  554.                 offset = 0;
  555.                 return null;
  556.             }
  557.            
  558.             if (args.Length - index < 5) {
  559.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Strong"), manager.GetString("Error_NotEnoughArgs"), -1);
  560.             }
  561.            
  562.             StrongNamePublicKeyBlob publicKey = null;
  563.             string assemblyName = null;
  564.             string assemblyVersion = null;
  565.            
  566.             if (String.Compare(args[index + 1], manager.GetString("Misc_File"), StringComparison.OrdinalIgnoreCase) == 0) {
  567.                 AssemblyName name = AssemblyName.GetAssemblyName(args[index + 2]);
  568.                 byte[] publicKeyBytes = name.GetPublicKey();
  569.                 if (publicKeyBytes == null || publicKeyBytes.Length < 1)
  570.                     Error(manager.GetString("MembershipConditionTable_Strong"), manager.GetString("Error_NotStrongNamed"), -1);
  571.                 publicKey = new StrongNamePublicKeyBlob(publicKeyBytes);
  572.                 assemblyName = args[index + 3];
  573.                 assemblyVersion = args[index + 4];
  574.                 offset = 5;
  575.             }
  576.             else if (String.Compare(args[index + 1], manager.GetString("Misc_Hex"), StringComparison.OrdinalIgnoreCase) == 0) {
  577.                 publicKey = new StrongNamePublicKeyBlob(DecodeHexString(args[index + 2]));
  578.                 assemblyName = args[index + 3];
  579.                 assemblyVersion = args[index + 4];
  580.                 offset = 5;
  581.             }
  582.             else {
  583.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Strong"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_StrongName_InvalidOption"), args[index + 1]), -1);
  584.                 // not reached
  585.                 offset = 0;
  586.             }
  587.            
  588.             if (String.Compare(assemblyName, manager.GetString("Misc_NoName"), StringComparison.OrdinalIgnoreCase) == 0) {
  589.                 assemblyName = null;
  590.             }
  591.            
  592.             if (String.Compare(assemblyVersion, manager.GetString("Misc_NoVersion"), StringComparison.OrdinalIgnoreCase) == 0) {
  593.                 assemblyVersion = null;
  594.             }
  595.            
  596.             Version asmVer = null;
  597.            
  598.             if (assemblyVersion != null) {
  599.                 try {
  600.                     asmVer = new Version(assemblyVersion);
  601.                 }
  602.                 catch (Exception) {
  603.                     ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Strong"), manager.GetString("Error_StrongName_ImproperlyFormattedVersion"), -1);
  604.                 }
  605.             }
  606.            
  607.             return new StrongNameMembershipCondition(publicKey, assemblyName, asmVer);
  608.         }
  609.        
  610.         static IMembershipCondition URLMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  611.         {
  612.             offset = 2;
  613.            
  614.             if (args[index].Equals("__internal_usage__")) {
  615.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Url"));
  616.                 return null;
  617.             }
  618.            
  619.             if (args.Length - index < 1) {
  620.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Url"), manager.GetString("Error_NotEnoughArgs"), -1);
  621.             }
  622.            
  623.             return new UrlMembershipCondition(args[index + 1]);
  624.         }
  625.        
  626.         static IMembershipCondition ZoneMembershipConditionHandler(PolicyLevel level, string[] args, int index, out int offset)
  627.         {
  628.             offset = 2;
  629.            
  630.             if (args[index].Equals("__internal_usage__")) {
  631.                 PauseCapableWriteLine(manager.GetString("Help_MembershipCondition_Zone"));
  632.                 for (int i = 0; i < s_names.Length; ++i)
  633.                     PauseCapableWriteLine(" " + s_names[i]);
  634.                 return null;
  635.             }
  636.            
  637.             if (args.Length - index < 2) {
  638.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Zone"), manager.GetString("Error_NotEnoughArgs"), -1);
  639.             }
  640.            
  641.             SecurityZone zoneNum = SecurityZone.NoZone;
  642.            
  643.             try {
  644.                 zoneNum = (SecurityZone)Int32.Parse(args[index + 1], CultureInfo.InvariantCulture);
  645.             }
  646.             catch (Exception) {
  647.                 for (int i = 0; i < s_names.Length; ++i) {
  648.                     if (String.Compare(args[index + 1], s_names[i], StringComparison.OrdinalIgnoreCase) == 0) {
  649.                         zoneNum = (SecurityZone)i;
  650.                         break;
  651.                     }
  652.                 }
  653.             }
  654.            
  655.             if (zoneNum < SecurityZone.MyComputer || zoneNum > SecurityZone.Untrusted) {
  656.                 ErrorMShip(args[0], manager.GetString("MembershipConditionTable_Zone"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_Zone_InvalidZone"), args[index + 1]), -1);
  657.             }
  658.            
  659.             return new ZoneMembershipCondition(zoneNum);
  660.         }
  661.        
  662.         static PolicyLevel GetLevel(PolicyLevelType type)
  663.         {
  664.             IEnumerator enumerator;
  665.            
  666.             try {
  667.                 enumerator = SecurityManager.PolicyHierarchy();
  668.             }
  669.             catch (SecurityException) {
  670.                 Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InsufficientRightsToRetrieveLevel")), -1);
  671.                 // not reached
  672.                 return null;
  673.             }
  674.            
  675.             while (enumerator.MoveNext()) {
  676.                 PolicyLevel level = (PolicyLevel)enumerator.Current;
  677.                 if (level.Type.Equals(type)) {
  678.                     return level;
  679.                 }
  680.             }
  681.            
  682.             return null;
  683.         }
  684.        
  685.         static PolicyLevel GetLevel()
  686.         {
  687.             return GetLevel(LevelType.None);
  688.         }
  689.        
  690.         static PolicyLevel GetLevel(LevelType type)
  691.         {
  692.             m_danglingLevelIndicator = null;
  693.            
  694.             if (m_levelType == LevelType.None) {
  695.                 if (type == LevelType.None) {
  696.                     m_levelAssemblyList = m_machineAssemblies;
  697.                     return GetLevel(System.Security.PolicyLevelType.Machine);
  698.                 }
  699.                 else if (type == LevelType.All) {
  700.                     return null;
  701.                 }
  702.                 else {
  703.                     Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_UnknownLevelType")), -1);
  704.                     // not reached
  705.                     return null;
  706.                 }
  707.             }
  708.             else if (m_levelType == LevelType.Machine) {
  709.                 m_levelAssemblyList = m_machineAssemblies;
  710.                 return GetLevel(System.Security.PolicyLevelType.Machine);
  711.             }
  712.             else if (m_levelType == LevelType.UserDefault) {
  713.                 m_levelAssemblyList = m_userAssemblies;
  714.                 return GetLevel(System.Security.PolicyLevelType.User);
  715.             }
  716.             else if (m_levelType == LevelType.UserCustom) {
  717.                 if (m_currentCustomLevel == null) {
  718.                     m_levelAssemblyList = m_customUserAssemblies;
  719.                     try {
  720.                         m_currentCustomLevel = SecurityManager.LoadPolicyLevelFromFile(m_levelPath, PolicyLevelType.User);
  721.                     }
  722.                     catch (Exception e) {
  723.                         Error(null, e.Message, -1);
  724.                     }
  725.                 }
  726.                 return m_currentCustomLevel;
  727.             }
  728.             else if (m_levelType == LevelType.All) {
  729.                 return null;
  730.             }
  731.             else if (m_levelType == LevelType.Enterprise) {
  732.                 m_levelAssemblyList = m_enterpriseAssemblies;
  733.                 return GetLevel(System.Security.PolicyLevelType.Enterprise);
  734.             }
  735.             else if (m_levelType == LevelType.AllCustom) {
  736.                 if (m_currentCustomLevel == null) {
  737.                     try {
  738.                         m_currentCustomLevel = SecurityManager.LoadPolicyLevelFromFile(m_levelPath, PolicyLevelType.User);
  739.                     }
  740.                     catch (Exception e) {
  741.                         Error(null, e.Message, -1);
  742.                     }
  743.                 }
  744.                 return null;
  745.             }
  746.             else {
  747.                 Error(null, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_UnknownLevelType")), -1);
  748.                 // not reached
  749.                 return null;
  750.             }
  751.         }
  752.        
  753.         static string ParentLabel(string label)
  754.         {
  755.             if (label[0] < '0' || label[0] > '9') {
  756.                 PolicyLevel level = GetLevel();
  757.                 object obj;
  758.                 string numericLabel = "1";
  759.                 if (level.RootCodeGroup.Name.Equals(label))
  760.                     obj = level.RootCodeGroup;
  761.                 else
  762.                     obj = GetLabelByName(label, level.RootCodeGroup, ref numericLabel);
  763.                 label = numericLabel;
  764.             }
  765.            
  766.             string[] separated = label.Split(m_labelSeparators.ToCharArray());
  767.             int size = separated[separated.Length - 1] == null || separated[separated.Length - 1].Equals("") ? separated.Length - 1 : separated.Length;
  768.            
  769.             StringBuilder sb = new StringBuilder();
  770.            
  771.             for (int i = 0; i < size - 1; ++i) {
  772.                 sb.Append(separated[i]);
  773.                 sb.Append('.');
  774.             }
  775.            
  776.             return sb.ToString();
  777.         }
  778.        
  779.         static void ReplaceLabel(string label, CodeGroup obj)
  780.         {
  781.             PolicyLevel level = GetLevel();
  782.            
  783.             if (level == null) {
  784.                 return;
  785.             }
  786.            
  787.             if (label == null) {
  788.                 return;
  789.             }
  790.            
  791.             if (label[0] < '0' || label[0] > '9') {
  792.                 string numericLabel = "1";
  793.                 GetLabelByName(label, level.RootCodeGroup, ref numericLabel);
  794.                 label = numericLabel;
  795.             }
  796.            
  797.             string[] separated = label.Split(m_labelSeparators.ToCharArray());
  798.             int size = separated[separated.Length - 1] == null || separated[separated.Length - 1].Equals("") ? separated.Length - 1 : separated.Length;
  799.            
  800.             if (size >= 1 && !separated[0].Equals("1")) {
  801.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidLabelArg"), label));
  802.             }
  803.            
  804.             CodeGroup group = level.RootCodeGroup;
  805.            
  806.             if (size == 1 && separated[0].Equals("1")) {
  807.                 level.RootCodeGroup = obj;
  808.                 return;
  809.             }
  810.            
  811.             ArrayList groupsList = new ArrayList();
  812.            
  813.             CodeGroup newGroup = group;
  814.            
  815.             groupsList.Insert(0, group);
  816.            
  817.             for (int index = 1; index < size - 1; ++index) {
  818.                 IEnumerator enumerator = group.Children.GetEnumerator();
  819.                 int count = 1;
  820.                
  821.                 while (enumerator.MoveNext()) {
  822.                     if (count == Int32.Parse(separated[index], CultureInfo.InvariantCulture)) {
  823.                         newGroup = (CodeGroup)enumerator.Current;
  824.                         break;
  825.                     }
  826.                     else {
  827.                         count++;
  828.                     }
  829.                 }
  830.                
  831.                 if (newGroup == null)
  832.                     throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidLabelArg"), label));
  833.                 else {
  834.                     group = newGroup;
  835.                     groupsList.Insert(0, group);
  836.                 }
  837.             }
  838.            
  839.             groupsList.Insert(0, obj);
  840.            
  841.             for (int i = 1; i < groupsList.Count; ++i) {
  842.                 newGroup = (CodeGroup)groupsList[i];
  843.                
  844.                 IEnumerator finalEnumerator = newGroup.Children.GetEnumerator();
  845.                
  846.                 newGroup.Children = new ArrayList();
  847.                
  848.                 int finalCount = 1;
  849.                 while (finalEnumerator.MoveNext()) {
  850.                     if (finalCount == Int32.Parse(separated[size - i], CultureInfo.InvariantCulture)) {
  851.                         newGroup.AddChild((CodeGroup)groupsList[i - 1]);
  852.                     }
  853.                     else {
  854.                         newGroup.AddChild((CodeGroup)finalEnumerator.Current);
  855.                     }
  856.                     finalCount++;
  857.                 }
  858.             }
  859.            
  860.             level.RootCodeGroup = (CodeGroup)groupsList[groupsList.Count - 1];
  861.         }
  862.        
  863.         static object GetLabel(string label)
  864.         {
  865.             PolicyLevel level = GetLevel();
  866.            
  867.             if (level == null) {
  868.                 return null;
  869.             }
  870.            
  871.             if (label == null) {
  872.                 return null;
  873.             }
  874.            
  875.             if (label[0] < '0' || label[0] > '9') {
  876.                 string numericLabel = "1";
  877.                 if (level.RootCodeGroup.Name.Equals(label))
  878.                     return level.RootCodeGroup;
  879.                 else
  880.                     return GetLabelByName(label, level.RootCodeGroup, ref numericLabel);
  881.             }
  882.            
  883.             string[] separated = label.Split(m_labelSeparators.ToCharArray());
  884.             int size = separated[separated.Length - 1] == null || separated[separated.Length - 1].Equals("") ? separated.Length - 1 : separated.Length;
  885.            
  886.             if (size >= 1 && !separated[0].Equals("1")) {
  887.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidLabelArg"), label));
  888.             }
  889.            
  890.             CodeGroup group = level.RootCodeGroup;
  891.            
  892.             if (size == 1 && separated[0].Equals("1")) {
  893.                 return group;
  894.             }
  895.            
  896.             for (int index = 1; index < size; ++index) {
  897.                 CodeGroup newGroup = null;
  898.                 IEnumerator enumerator = group.Children.GetEnumerator();
  899.                 int count = 1;
  900.                
  901.                 while (enumerator.MoveNext()) {
  902.                     if (count == Int32.Parse(separated[index], CultureInfo.InvariantCulture)) {
  903.                         newGroup = (CodeGroup)enumerator.Current;
  904.                         break;
  905.                     }
  906.                     else {
  907.                         count++;
  908.                     }
  909.                 }
  910.                
  911.                 if (newGroup == null)
  912.                     throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidLabelArg"), label));
  913.                 else
  914.                     group = newGroup;
  915.             }
  916.            
  917.             return group;
  918.         }
  919.        
  920.         static object GetLabelByName(string label, CodeGroup group, ref string numericLabel)
  921.         {
  922.             if (group.Name != null && group.Name.Equals(label)) {
  923.                 numericLabel = "1";
  924.                 return group;
  925.             }
  926.            
  927.             return GetLabelByNameHelper(label, group, ref numericLabel);
  928.         }
  929.        
  930.         static object GetLabelByNameHelper(string label, CodeGroup group, ref string numericLabel)
  931.         {
  932.             IEnumerator enumerator = group.Children.GetEnumerator();
  933.            
  934.             int count = 1;
  935.            
  936.             while (enumerator.MoveNext()) {
  937.                 string tempNumericLabel;
  938.                
  939.                 tempNumericLabel = numericLabel + "." + count;
  940.                
  941.                 CodeGroup currentGroup = (CodeGroup)enumerator.Current;
  942.                
  943.                 if (currentGroup.Name != null && currentGroup.Name.Equals(label)) {
  944.                     numericLabel = tempNumericLabel;
  945.                     return enumerator.Current;
  946.                 }
  947.                
  948.                 object retval = GetLabelByNameHelper(label, currentGroup, ref tempNumericLabel);
  949.                
  950.                 if (retval != null) {
  951.                     numericLabel = tempNumericLabel;
  952.                     return retval;
  953.                 }
  954.                
  955.                 count++;
  956.             }
  957.            
  958.             numericLabel = null;
  959.             return null;
  960.         }
  961.        
  962.         static bool DisplayMShipInfo(string which)
  963.         {
  964.             if (which == null)
  965.                 return true;
  966.            
  967.             for (int i = 0; i < OptionTable.Length; ++i) {
  968.                 // Only list if we've said to list it.
  969.                 if (String.Compare(which, OptionTable[i].option, StringComparison.OrdinalIgnoreCase) == 0)
  970.                     return OptionTable[i].displayMShip;
  971.             }
  972.            
  973.             return true;
  974.         }
  975.        
  976.         static void Error(string which, string message, int errorCode)
  977.         {
  978.             ErrorMShip(which, null, message, errorCode, DisplayMShipInfo(which));
  979.         }
  980.        
  981.         static void ErrorMShip(string whichOption, string whichMShip, string message, int errorCode)
  982.         {
  983.             ErrorMShip(whichOption, whichMShip, message, errorCode, true);
  984.         }
  985.        
  986.         static void ErrorMShip(string whichOption, string whichMShip, string message, int errorCode, bool displayMshipInfo)
  987.         {
  988.             HelpMShip(whichOption, whichMShip, String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_Arg"), message), displayMshipInfo);
  989.             System.Environment.ExitCode = errorCode;
  990.             throw new ExitException();
  991.         }
  992.        
  993.         static void Help(string which, string message)
  994.         {
  995.             HelpMShip(which, null, message, DisplayMShipInfo(which));
  996.         }
  997.        
  998.         static void HelpMShip(string whichOption, string whichMShip, string message, bool displayMShipInfo)
  999.         {
  1000.             PauseCapableWriteLine(message + Environment.NewLine);
  1001.            
  1002.             if (whichOption == null) {
  1003.                 PauseCapableWriteLine(manager.GetString("SeeHelp"));
  1004.                 return;
  1005.             }
  1006.            
  1007.             PauseCapableWriteLine(manager.GetString("Usage") + Environment.NewLine);
  1008.            
  1009.             string[] helpArgs = new string[1];
  1010.             helpArgs[0] = "__internal_usage__";
  1011.             int numArgs;
  1012.            
  1013.             for (int i = 0; i < OptionTable.Length; ++i) {
  1014.                 // Only list if we've said to list it.
  1015.                 if (OptionTable[i].list) {
  1016.                     // Look for all the options that aren't the same as something as and that we have requested.
  1017.                     if (OptionTable[i].sameAs == null && (whichOption.Equals("*") || String.Compare(whichOption, OptionTable[i].option, StringComparison.OrdinalIgnoreCase) == 0)) {
  1018.                         // For each option we find, print out all like options first.
  1019.                         for (int j = 0; j < OptionTable.Length; ++j) {
  1020.                             if (OptionTable[j].list && OptionTable[j].sameAs != null && String.Compare(OptionTable[i].option, OptionTable[j].sameAs, StringComparison.OrdinalIgnoreCase) == 0) {
  1021.                                 StringBuilder sb = new StringBuilder();
  1022.                                 sb.Append(manager.GetString("Usage_Name"));
  1023.                                 sb.Append(" ");
  1024.                                 sb.Append(OptionTable[j].option);
  1025.                                 PauseCapableWriteLine(sb.ToString());
  1026.                             }
  1027.                         }
  1028.                         OptionTable[i].handler(helpArgs, 0, out numArgs);
  1029.                         PauseCapableWriteLine("");
  1030.                     }
  1031.                 }
  1032.             }
  1033.            
  1034.             if (displayMShipInfo) {
  1035.                 PauseCapableWriteLine(Environment.NewLine + manager.GetString("Usage_MembershipCondition"));
  1036.                
  1037.                 for (int i = 0; i < MembershipTable.Length; ++i) {
  1038.                     if (whichMShip == null || String.Compare(whichMShip, MembershipTable[i].option, StringComparison.OrdinalIgnoreCase) == 0) {
  1039.                         int offset = 0;
  1040.                         MembershipTable[i].handler(null, helpArgs, 0, out offset);
  1041.                     }
  1042.                 }
  1043.                
  1044.                 PauseCapableWriteLine(Environment.NewLine + manager.GetString("Usage_CodeGroupAttribute"));
  1045.                
  1046.                 for (int i = 0; i < CodeGroupAttrTable.Length; ++i) {
  1047.                     if (CodeGroupAttrTable[i].display) {
  1048.                         if (CodeGroupAttrTable[i].handler == null) {
  1049.                             PauseCapableWriteLine(" " + CodeGroupAttrTable[i].label + manager.GetString("Dialog_OnOff"));
  1050.                             PauseCapableWriteLine(" " + CodeGroupAttrTable[i].description);
  1051.                         }
  1052.                         else {
  1053.                             CodeGroupAttrTable[i].handler(null, helpArgs, 0, out numArgs);
  1054.                         }
  1055.                     }
  1056.                 }
  1057.             }
  1058.         }
  1059.        
  1060.         private static StrongName FindStrongName(Evidence evidence)
  1061.         {
  1062.             if (evidence == null)
  1063.                 return null;
  1064.            
  1065.             IEnumerator enumerator = evidence.GetHostEnumerator();
  1066.            
  1067.             while (enumerator.MoveNext()) {
  1068.                 StrongName sn = enumerator.Current as StrongName;
  1069.                
  1070.                 if (sn != null)
  1071.                     return sn;
  1072.             }
  1073.            
  1074.             return null;
  1075.         }
  1076.        
  1077.         private static bool GetAnswer()
  1078.         {
  1079.             string input = Console.ReadLine();
  1080.             return !(input == null || (String.Compare(input, manager.GetString("Misc_Yes"), StringComparison.OrdinalIgnoreCase) != 0 && String.Compare(input, manager.GetString("Misc_YesAbbr"), StringComparison.OrdinalIgnoreCase) != 0));
  1081.         }
  1082.        
  1083.         public static bool CompareAssemblyNames(AssemblyName left, AssemblyName right)
  1084.         {
  1085.             if (left == null && right == null)
  1086.                 return true;
  1087.            
  1088.             if (left == null || right == null)
  1089.                 return false;
  1090.            
  1091.             return String.Compare(left.FullName, right.FullName, StringComparison.Ordinal) == 0;
  1092.         }
  1093.        
  1094.         public static bool AlreadyLoaded(ArrayList loadedAssemblies, AssemblyName assemblyName)
  1095.         {
  1096.             if (loadedAssemblies == null)
  1097.                 return false;
  1098.            
  1099.             for (int i = 0; i < loadedAssemblies.Count; ++i) {
  1100.                 if (String.Compare("mscorlib", assemblyName.Name, StringComparison.OrdinalIgnoreCase) == 0)
  1101.                     return true;
  1102.                
  1103.                 if (CompareAssemblyNames(((Assembly)loadedAssemblies[i]).GetName(), assemblyName))
  1104.                     return true;
  1105.             }
  1106.            
  1107.             return false;
  1108.         }
  1109.        
  1110.         public static void DetermineAllReferencedAssemblies(ArrayList loadedAssemblies)
  1111.         {
  1112.             bool done = false;
  1113.            
  1114.             while (!done) {
  1115.                 done = true;
  1116.                
  1117.                 for (int i = 0; i < loadedAssemblies.Count; ++i) {
  1118.                     AssemblyName[] referencedAssemblies = ((Assembly)loadedAssemblies[i]).GetReferencedAssemblies();
  1119.                    
  1120.                     for (int j = 0; j < referencedAssemblies.Length; j++) {
  1121.                         if (!AlreadyLoaded(loadedAssemblies, referencedAssemblies[j])) {
  1122.                             done = false;
  1123.                             loadedAssemblies.Add(Assembly.Load(referencedAssemblies[j]));
  1124.                         }
  1125.                     }
  1126.                 }
  1127.             }
  1128.         }
  1129.        
  1130.         private static void CheckAddedAssemblies(PolicyLevel level, ref ArrayList assemblies)
  1131.         {
  1132.             try {
  1133.                 if (assemblies == null || level == null)
  1134.                     return;
  1135.                
  1136.                 IEnumerator enumerator = assemblies.GetEnumerator();
  1137.                
  1138.                 while (enumerator.MoveNext()) {
  1139.                     Assembly assembly = (Assembly)enumerator.Current;
  1140.                     StrongName sn = FindStrongName(assembly.Evidence);
  1141.                    
  1142.                     if (sn == null) {
  1143.                         PauseCapableWriteLine(manager.GetString("Dialog_AssemblyNotStrongNamed"));
  1144.                         if (!GetAnswer())
  1145.                             throw new ExitException();
  1146.                     }
  1147.                     else if (!sn.Name.Equals("mscorlib")) {
  1148.                         #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  1149.                         IEnumerator snEnumerator = level.FullTrustAssemblies.GetEnumerator();
  1150.                         bool found = false;
  1151.                        
  1152.                         Evidence evidence = new Evidence();
  1153.                         evidence.AddHost(sn);
  1154.                        
  1155.                         while (snEnumerator.MoveNext()) {
  1156.                             if (((StrongNameMembershipCondition)snEnumerator.Current).Check(evidence)) {
  1157.                                 found = true;
  1158.                                 break;
  1159.                             }
  1160.                         }
  1161.                        
  1162.                         if (!found) {
  1163.                             PauseCapableWriteLine(manager.GetString("Dialog_StrongNameAssemblyAdded1"));
  1164.                             PauseCapableWriteLine(sn.Name + " " + sn.Version);
  1165.                             PauseCapableWriteLine(manager.GetString("Dialog_StrongNameAssemblyAdded2"));
  1166.                             if (GetAnswer()) {
  1167.                                 level.AddFullTrustAssembly(sn);
  1168.                             }
  1169.                         }
  1170.                         #pragma warning restore 618
  1171.                     }
  1172.                 }
  1173.             }
  1174.             finally {
  1175.                 assemblies = new ArrayList();
  1176.             }
  1177.         }
  1178.        
  1179.         private static bool Quiet = false;
  1180.        
  1181.        
  1182.         private static bool PolicyPrompt {
  1183.             get {
  1184.                 StringBuilder sb = new StringBuilder(100);
  1185.                 if (!FetchConfigurationString(true, "CaspolSettings", sb, 100))
  1186.                     return true;
  1187.                 string value = sb.ToString();
  1188.                 return (value == String.Empty ? true : (value != "1"));
  1189.             }
  1190.            
  1191.             set {
  1192.                 string keyValue = value ? "0" : "1";
  1193.                 if (!SetConfigurationString(true, "CaspolSettings", keyValue))
  1194.                     throw new Exception(manager.GetString("Error_UnableToSaveSettings"));
  1195.             }
  1196.         }
  1197.        
  1198.         private const string CLR_CASOFF_MUTEX = "Global\\CLR_CASOFF_MUTEX";
  1199.        
  1200.         private static void DisableCodeAccessSecurity()
  1201.         {
  1202.             bool created;
  1203.             Mutex m = new Mutex(true, CLR_CASOFF_MUTEX, out created);
  1204.         }
  1205.        
  1206.         static void SafeSavePolicy()
  1207.         {
  1208.             CheckAddedAssemblies(GetLevel(System.Security.PolicyLevelType.Enterprise), ref m_enterpriseAssemblies);
  1209.             CheckAddedAssemblies(GetLevel(System.Security.PolicyLevelType.Machine), ref m_machineAssemblies);
  1210.             CheckAddedAssemblies(GetLevel(System.Security.PolicyLevelType.User), ref m_userAssemblies);
  1211.             CheckAddedAssemblies(m_currentCustomLevel, ref m_customUserAssemblies);
  1212.            
  1213.             if (!m_force) {
  1214.                 PermissionSet denied = null;
  1215.                 PermissionSet granted = null;
  1216.                 try {
  1217.                     granted = SecurityManager.ResolvePolicy(Assembly.GetExecutingAssembly().Evidence, null, null, null, out denied);
  1218.                 }
  1219.                 catch (PolicyException) {
  1220.                 }
  1221.                
  1222.                 PermissionSet caspolRequired = GeneratecaspolRequiredPermSet();
  1223.                 if (granted == null || !caspolRequired.IsSubsetOf(granted) || (denied != null && caspolRequired.Intersect(denied) != null)) {
  1224.                     PauseCapableWriteLine(manager.GetString("Dialog_CaspolOperationRestricted"));
  1225.                     m_success = false;
  1226.                     throw new ExitException();
  1227.                 }
  1228.             }
  1229.            
  1230.             IEnumerator levelEnumerator = null;
  1231.            
  1232.             PolicyLevel level = GetLevel();
  1233.            
  1234.             if (level == null && m_levelType == LevelType.All) {
  1235.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1236.             }
  1237.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1238.                 ArrayList list = new ArrayList();
  1239.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1240.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1241.                 list.Add(m_currentCustomLevel);
  1242.                 levelEnumerator = list.GetEnumerator();
  1243.             }
  1244.             else if (level != null) {
  1245.                 ArrayList list = new ArrayList();
  1246.                 list.Add(level);
  1247.                 levelEnumerator = list.GetEnumerator();
  1248.             }
  1249.            
  1250.             if (levelEnumerator == null)
  1251.                 return;
  1252.            
  1253.             if (PolicyPrompt && !Quiet) {
  1254.                 PauseCapableWriteLine(manager.GetString("Dialog_AlterPolicy"));
  1255.                 if (!GetAnswer()) {
  1256.                     PauseCapableWriteLine(manager.GetString("Dialog_PolicySaveAborted"));
  1257.                     m_success = false;
  1258.                     throw new ExitException();
  1259.                 }
  1260.             }
  1261.            
  1262.             while (levelEnumerator.MoveNext()) {
  1263.                 PolicyLevel pl = (PolicyLevel)levelEnumerator.Current;
  1264.                 SecurityManager.SavePolicyLevel(pl);
  1265.             }
  1266.            
  1267.             Quiet = false;
  1268.         }
  1269.        
  1270.         static void MachineHandler(string[] args, int index, out int numArgsUsed)
  1271.         {
  1272.             numArgsUsed = 1;
  1273.            
  1274.             if (args[index].Equals("__internal_usage__")) {
  1275.                 PauseCapableWriteLine(manager.GetString("Help_Option_Machine"));
  1276.                 return;
  1277.             }
  1278.            
  1279.             m_danglingLevelIndicator = manager.GetString("OptionTable_Machine");
  1280.             m_levelPath = null;
  1281.             m_levelType = LevelType.Machine;
  1282.         }
  1283.        
  1284.         static void UserHandler(string[] args, int index, out int numArgsUsed)
  1285.         {
  1286.             numArgsUsed = 1;
  1287.            
  1288.             if (args[index].Equals("__internal_usage__")) {
  1289.                 PauseCapableWriteLine(manager.GetString("Help_Option_User"));
  1290.                 return;
  1291.             }
  1292.            
  1293.             m_danglingLevelIndicator = manager.GetString("OptionTable_User");
  1294.             m_levelPath = null;
  1295.             m_levelType = LevelType.UserDefault;
  1296.         }
  1297.        
  1298.         static void EnterpriseHandler(string[] args, int index, out int numArgsUsed)
  1299.         {
  1300.             numArgsUsed = 1;
  1301.            
  1302.             if (args[index].Equals("__internal_usage__")) {
  1303.                 PauseCapableWriteLine(manager.GetString("Help_Option_Enterprise"));
  1304.                 return;
  1305.             }
  1306.            
  1307.             m_danglingLevelIndicator = manager.GetString("OptionTable_Enterprise");
  1308.             m_levelPath = null;
  1309.             m_levelType = LevelType.Enterprise;
  1310.         }
  1311.        
  1312.         static void CustomUserHandler(string[] args, int index, out int numArgsUsed)
  1313.         {
  1314.             numArgsUsed = 1;
  1315.            
  1316.             if (args[index].Equals("__internal_usage__")) {
  1317.                 PauseCapableWriteLine(manager.GetString("Help_Option_CustomUser"));
  1318.                 return;
  1319.             }
  1320.            
  1321.             numArgsUsed = 2;
  1322.            
  1323.             if (args.Length - index < 2) {
  1324.                 Error(manager.GetString("OptionTable_CustomUser"), manager.GetString("Error_NotEnoughArgs"), -1);
  1325.             }
  1326.            
  1327.             m_danglingLevelIndicator = manager.GetString("OptionTable_CustomUser");
  1328.             m_levelPath = args[index + 1];
  1329.             m_levelType = LevelType.UserCustom;
  1330.             m_currentCustomLevel = null;
  1331.         }
  1332.        
  1333.         static void AllHandler(string[] args, int index, out int numArgsUsed)
  1334.         {
  1335.             numArgsUsed = 1;
  1336.            
  1337.             if (args[index].Equals("__internal_usage__")) {
  1338.                 PauseCapableWriteLine(manager.GetString("Help_Option_All"));
  1339.                 return;
  1340.             }
  1341.            
  1342.             m_danglingLevelIndicator = manager.GetString("OptionTable_All");
  1343.             m_levelPath = null;
  1344.             m_levelType = LevelType.All;
  1345.         }
  1346.        
  1347.         static void CustomAllHandler(string[] args, int index, out int numArgsUsed)
  1348.         {
  1349.             numArgsUsed = 1;
  1350.            
  1351.             if (args[index].Equals("__internal_usage__")) {
  1352.                 PauseCapableWriteLine(manager.GetString("Help_Option_CustomAll"));
  1353.                 return;
  1354.             }
  1355.            
  1356.             numArgsUsed = 2;
  1357.            
  1358.             if (args.Length - index < 2) {
  1359.                 Error(manager.GetString("OptionTable_CustomAll"), manager.GetString("Error_NotEnoughArgs"), -1);
  1360.             }
  1361.            
  1362.             m_danglingLevelIndicator = manager.GetString("OptionTable_CustomAll");
  1363.             m_levelPath = args[index + 1];
  1364.             m_levelType = LevelType.AllCustom;
  1365.             m_currentCustomLevel = null;
  1366.         }
  1367.        
  1368.         static void SecurityHandler(string[] args, int index, out int numArgsUsed)
  1369.         {
  1370.             if (args[index].Equals("__internal_usage__")) {
  1371.                 numArgsUsed = 1;
  1372.                 PauseCapableWriteLine(manager.GetString("Help_Option_Security"));
  1373.                 return;
  1374.             }
  1375.            
  1376.             numArgsUsed = 2;
  1377.            
  1378.             if (args.Length - index < 2) {
  1379.                 Error(manager.GetString("OptionTable_Security"), manager.GetString("Error_NotEnoughArgs"), -1);
  1380.             }
  1381.            
  1382.             if (String.Compare(args[index + 1], manager.GetString("Misc_On"), StringComparison.OrdinalIgnoreCase) == 0) {
  1383.                 PauseCapableWriteLine(manager.GetString("Dialog_SecurityOn_Warning"));
  1384.             }
  1385.             else if (String.Compare(args[index + 1], manager.GetString("Misc_Off"), StringComparison.OrdinalIgnoreCase) == 0) {
  1386.                 DisableCodeAccessSecurity();
  1387.                 PauseCapableWriteLine(manager.GetString("Dialog_SecurityOff_Warning"));
  1388.                 Console.ReadLine();
  1389.             }
  1390.             else {
  1391.                 Error(manager.GetString("OptionTable_Security"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidOption"), args[index + 1]), -1);
  1392.             }
  1393.         }
  1394.        
  1395.         static void ExecutionHandler(string[] args, int index, out int numArgsUsed)
  1396.         {
  1397.             if (args[index].Equals("__internal_usage__")) {
  1398.                 numArgsUsed = 1;
  1399.                 PauseCapableWriteLine(manager.GetString("Help_Option_Execution"));
  1400.                 return;
  1401.             }
  1402.            
  1403.             numArgsUsed = 2;
  1404.            
  1405.             if (args.Length - index < 2) {
  1406.                 Error(manager.GetString("OptionTable_Execution"), manager.GetString("Error_NotEnoughArgs"), -1);
  1407.             }
  1408.            
  1409.             if (String.Compare(args[index + 1], manager.GetString("Misc_On"), StringComparison.OrdinalIgnoreCase) == 0) {
  1410.                 SecurityManager.CheckExecutionRights = true;
  1411.             }
  1412.             else if (String.Compare(args[index + 1], manager.GetString("Misc_Off"), StringComparison.OrdinalIgnoreCase) == 0) {
  1413.                 SecurityManager.CheckExecutionRights = false;
  1414.             }
  1415.             else {
  1416.                 Error(manager.GetString("OptionTable_Execution"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidOption"), args[index + 1]), -1);
  1417.             }
  1418.            
  1419.             SecurityManager.SavePolicy();
  1420.         }
  1421.        
  1422.         static void BuildCacheHandler(string[] args, int index, out int numArgsUsed)
  1423.         {
  1424.             numArgsUsed = 1;
  1425.            
  1426.             if (args[index].Equals("__internal_usage__")) {
  1427.                 PauseCapableWriteLine(manager.GetString("Help_Option_BuildCache"));
  1428.                 return;
  1429.             }
  1430.            
  1431.             SecurityManager.SavePolicy();
  1432.         }
  1433.        
  1434.         static void PolicyChangeHandler(string[] args, int index, out int numArgsUsed)
  1435.         {
  1436.             if (args[index].Equals("__internal_usage__")) {
  1437.                 numArgsUsed = 1;
  1438.                 PauseCapableWriteLine(manager.GetString("Help_Option_PolChgPrompt"));
  1439.                 return;
  1440.             }
  1441.            
  1442.             numArgsUsed = 2;
  1443.            
  1444.             if (args.Length - index < 2) {
  1445.                 Error(manager.GetString("OptionTable_PolChgPrompt"), manager.GetString("Error_NotEnoughArgs"), -1);
  1446.             }
  1447.            
  1448.             if (String.Compare(args[index + 1], manager.GetString("Misc_On"), StringComparison.OrdinalIgnoreCase) == 0) {
  1449.                 PolicyPrompt = true;
  1450.             }
  1451.             else if (String.Compare(args[index + 1], manager.GetString("Misc_Off"), StringComparison.OrdinalIgnoreCase) == 0) {
  1452.                 PolicyPrompt = false;
  1453.             }
  1454.             else {
  1455.                 Error(manager.GetString("OptionTable_PolChgPrompt"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_InvalidOption"), args[index + 1]), -1);
  1456.             }
  1457.         }
  1458.        
  1459.         static void QuietHandler(string[] args, int index, out int numArgsUsed)
  1460.         {
  1461.             numArgsUsed = 1;
  1462.            
  1463.             if (args[index].Equals("__internal_usage__")) {
  1464.                 PauseCapableWriteLine(manager.GetString("Help_Option_Quiet"));
  1465.                 return;
  1466.             }
  1467.            
  1468.             Quiet = true;
  1469.         }
  1470.        
  1471.         static void RecoverHandler(string[] args, int index, out int numArgsUsed)
  1472.         {
  1473.             numArgsUsed = 1;
  1474.            
  1475.             if (args[index].Equals("__internal_usage__")) {
  1476.                 PauseCapableWriteLine(manager.GetString("Help_Option_Recover"));
  1477.                 return;
  1478.             }
  1479.            
  1480.             IEnumerator levelEnumerator = null;
  1481.            
  1482.             PolicyLevel level = GetLevel();
  1483.            
  1484.             if (level == null && m_levelType == LevelType.All) {
  1485.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1486.             }
  1487.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1488.                 ArrayList list = new ArrayList();
  1489.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1490.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1491.                 list.Add(m_currentCustomLevel);
  1492.                 levelEnumerator = list.GetEnumerator();
  1493.             }
  1494.             else if (level != null) {
  1495.                 ArrayList list = new ArrayList();
  1496.                 list.Add(level);
  1497.                 levelEnumerator = list.GetEnumerator();
  1498.             }
  1499.            
  1500.             if (levelEnumerator == null) {
  1501.                 Error(manager.GetString("OptionTable_Recover"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1502.             }
  1503.            
  1504.             try {
  1505.                 while (levelEnumerator.MoveNext()) {
  1506.                     ((PolicyLevel)levelEnumerator.Current).Recover();
  1507.                 }
  1508.             }
  1509.             catch (Exception e) {
  1510.                 string message = e.Message;
  1511.                
  1512.                 if (message == null || message.Equals("")) {
  1513.                     message = e.GetType().AssemblyQualifiedName;
  1514.                 }
  1515.                
  1516.                 Error(manager.GetString("OptionTable_Recover"), message, -1);
  1517.             }
  1518.         }
  1519.        
  1520.         static void ResetHandler(string[] args, int index, out int numArgsUsed)
  1521.         {
  1522.             numArgsUsed = 1;
  1523.            
  1524.             if (args[index].Equals("__internal_usage__")) {
  1525.                 PauseCapableWriteLine(manager.GetString("Help_Option_Reset"));
  1526.                 return;
  1527.             }
  1528.            
  1529.             IEnumerator levelEnumerator = null;
  1530.            
  1531.             PolicyLevel level = GetLevel();
  1532.            
  1533.             if (level == null && m_levelType == LevelType.All) {
  1534.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1535.             }
  1536.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1537.                 ArrayList list = new ArrayList();
  1538.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1539.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1540.                 list.Add(m_currentCustomLevel);
  1541.                 levelEnumerator = list.GetEnumerator();
  1542.             }
  1543.             else if (level != null) {
  1544.                 ArrayList list = new ArrayList();
  1545.                 list.Add(level);
  1546.                 levelEnumerator = list.GetEnumerator();
  1547.             }
  1548.            
  1549.             if (levelEnumerator == null) {
  1550.                 Error(manager.GetString("OptionTable_Reset"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1551.             }
  1552.            
  1553.             try {
  1554.                 while (levelEnumerator.MoveNext()) {
  1555.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1556.                     PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ResettingPolicy"), currentLevel.Label));
  1557.                     currentLevel.Reset();
  1558.                 }
  1559.             }
  1560.             catch (Exception e) {
  1561.                 string message = e.Message;
  1562.                
  1563.                 if (String.IsNullOrEmpty(message)) {
  1564.                     message = e.GetType().AssemblyQualifiedName;
  1565.                 }
  1566.                
  1567.                 Error(manager.GetString("OptionTable_Reset"), message, -1);
  1568.             }
  1569.            
  1570.             SafeSavePolicy();
  1571.         }
  1572.        
  1573.         static void ResetLockDownHandler(string[] args, int index, out int numArgsUsed)
  1574.         {
  1575.             numArgsUsed = 1;
  1576.            
  1577.             if (args[index].Equals("__internal_usage__")) {
  1578.                 PauseCapableWriteLine(manager.GetString("Help_Option_ResetLockDown"));
  1579.                 return;
  1580.             }
  1581.            
  1582.             IEnumerator levelEnumerator = null;
  1583.            
  1584.             PolicyLevel level = GetLevel();
  1585.            
  1586.             if (level == null && m_levelType == LevelType.All) {
  1587.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1588.             }
  1589.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1590.                 ArrayList list = new ArrayList();
  1591.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1592.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1593.                 list.Add(m_currentCustomLevel);
  1594.                 levelEnumerator = list.GetEnumerator();
  1595.             }
  1596.             else if (level != null) {
  1597.                 ArrayList list = new ArrayList();
  1598.                 list.Add(level);
  1599.                 levelEnumerator = list.GetEnumerator();
  1600.             }
  1601.            
  1602.             if (levelEnumerator == null) {
  1603.                 Error(manager.GetString("OptionTable_ResetLockDown"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1604.             }
  1605.            
  1606.             try {
  1607.                 while (levelEnumerator.MoveNext()) {
  1608.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1609.                     PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ResettingPolicy"), currentLevel.Label));
  1610.                     currentLevel.Reset();
  1611.                    
  1612.                     //
  1613.                     // for the machine policy, we reset the internet, local intranet and trusted zones to Nothing.
  1614.                     // Also, their child samesite code groups will be removed
  1615.                     //
  1616.                     if (currentLevel.Type == PolicyLevelType.Machine) {
  1617.                         CodeGroup rootCodeGroup = currentLevel.RootCodeGroup;
  1618.                         int numGroup = 0;
  1619.                         ArrayList codeGroups = new ArrayList();
  1620.                         foreach (CodeGroup codeGroup in rootCodeGroup.Children) {
  1621.                             numGroup++;
  1622.                             switch (numGroup) {
  1623.                                 case 2:
  1624.                                 case 3:
  1625.                                 case 5:
  1626.                                     codeGroup.PolicyStatement = new PolicyStatement(currentLevel.GetNamedPermissionSet("Nothing"));
  1627.                                     codeGroup.Children = new ArrayList();
  1628.                                     codeGroups.Add(codeGroup);
  1629.                                     break;
  1630.                                 default:
  1631.                                     codeGroups.Add(codeGroup);
  1632.                                     break;
  1633.                             }
  1634.                         }
  1635.                         rootCodeGroup.Children = codeGroups;
  1636.                         currentLevel.RootCodeGroup = rootCodeGroup;
  1637.                     }
  1638.                 }
  1639.             }
  1640.             catch (Exception e) {
  1641.                 string message = e.Message;
  1642.                
  1643.                 if (String.IsNullOrEmpty(message)) {
  1644.                     message = e.GetType().AssemblyQualifiedName;
  1645.                 }
  1646.                
  1647.                 Error(manager.GetString("OptionTable_ResetLockDown"), message, -1);
  1648.             }
  1649.            
  1650.             SafeSavePolicy();
  1651.         }
  1652.        
  1653.        
  1654.         static void ForceHandler(string[] args, int index, out int numArgsUsed)
  1655.         {
  1656.             numArgsUsed = 1;
  1657.            
  1658.             if (args[index].Equals("__internal_usage__")) {
  1659.                 PauseCapableWriteLine(manager.GetString("Help_Option_Force"));
  1660.                 return;
  1661.             }
  1662.            
  1663.             m_force = true;
  1664.         }
  1665.        
  1666.         static void HelpHandler(string[] args, int index, out int numArgsUsed)
  1667.         {
  1668.             numArgsUsed = 1;
  1669.            
  1670.             if (args[index].Equals("__internal_usage__")) {
  1671.                 PauseCapableWriteLine(manager.GetString("Help_Option_Help"));
  1672.                 return;
  1673.             }
  1674.            
  1675.             try {
  1676.                 screenPauseEnabled = true;
  1677.                 m_success = false;
  1678.                
  1679.                 Help("*", manager.GetString("Dialog_HelpScreen"));
  1680.             }
  1681.             finally {
  1682.                 screenPauseEnabled = false;
  1683.             }
  1684.         }
  1685.        
  1686.         private static void DisplayLevelCodeGroups(PolicyLevel level)
  1687.         {
  1688.             DisplayCodeGroups(level.RootCodeGroup, level.RootCodeGroup);
  1689.         }
  1690.        
  1691.         private static void DisplayCodeGroups(CodeGroup displayGroup, CodeGroup rootGroup)
  1692.         {
  1693.             string label = "1";
  1694.            
  1695.             PauseCapableWriteLine(label + ". " + (displayGroup.MergeLogic.Equals(manager.GetString("Misc_MergeUnion")) ? "" : ("(" + displayGroup.MergeLogic + ") ")) + displayGroup.MembershipCondition.ToString() + ": " + (displayGroup.PermissionSetName == null ? manager.GetString("Dialog_Unknown") : displayGroup.PermissionSetName) + (displayGroup.AttributeString == null || displayGroup.AttributeString.Equals("") ? "" : " (" + displayGroup.AttributeString + ")"));
  1696.            
  1697.             if (displayGroup == rootGroup)
  1698.                 ListCodeGroup(label, m_indent, displayGroup.Children.GetEnumerator(), null);
  1699.             else
  1700.                 ListCodeGroup(label, m_indent, displayGroup.Children.GetEnumerator(), rootGroup.Children.GetEnumerator());
  1701.         }
  1702.        
  1703.         private static void DisplayLevelCodeGroupNameDescriptions(PolicyLevel level)
  1704.         {
  1705.             DisplayCodeGroupNameDescriptions(level.RootCodeGroup);
  1706.         }
  1707.        
  1708.         private static void DisplayCodeGroupNameDescriptions(CodeGroup group)
  1709.         {
  1710.             string label = "1";
  1711.            
  1712.             PauseCapableWriteLine(label + ". " + (group.Name != null && !group.Name.Equals("") ? group.Name : manager.GetString("Dialog_NoLabel")) + ": " + (group.Description != null && !group.Description.Equals("") ? group.Description : manager.GetString("Dialog_NoDescription")));
  1713.            
  1714.             ListCodeGroupNameDescription(label, m_indent, group.Children.GetEnumerator());
  1715.         }
  1716.        
  1717.         private static void DisplayLevelPermissionSets(PolicyLevel level)
  1718.         {
  1719.             IEnumerator permEnumerator = level.NamedPermissionSets.GetEnumerator();
  1720.            
  1721.             int inner_count = 1;
  1722.            
  1723.             while (permEnumerator.MoveNext()) {
  1724.                 NamedPermissionSet permSet = (NamedPermissionSet)permEnumerator.Current;
  1725.                
  1726.                 StringBuilder sb = new StringBuilder();
  1727.                
  1728.                 sb.Append(inner_count + ". " + permSet.Name);
  1729.                 if (permSet.Description != null && !permSet.Description.Equals("")) {
  1730.                     sb.Append(" (" + permSet.Description + ")");
  1731.                 }
  1732.                 sb.Append(" =" + Environment.NewLine + FormatXmlString(permSet.ToXml().ToString()) + Environment.NewLine);
  1733.                
  1734.                 PauseCapableWriteLine(sb.ToString());
  1735.                
  1736.                 ++inner_count;
  1737.             }
  1738.         }
  1739.        
  1740.         private static void DisplayLevelFullTrustAssemblies(PolicyLevel level)
  1741.         {
  1742.             #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  1743.             IEnumerator ftEnumerator = level.FullTrustAssemblies.GetEnumerator();
  1744.             #pragma warning restore 618
  1745.            
  1746.             int inner_count = 1;
  1747.            
  1748.             while (ftEnumerator.MoveNext()) {
  1749.                 StrongNameMembershipCondition sn = (StrongNameMembershipCondition)ftEnumerator.Current;
  1750.                
  1751.                 StringBuilder sb = new StringBuilder();
  1752.                
  1753.                 sb.Append(inner_count + ". ");
  1754.                 if (sn.Name != null) {
  1755.                     sb.Append(" " + sn.Name);
  1756.                 }
  1757.                 if ((object)sn.Version != null) {
  1758.                     sb.Append(" " + sn.Version);
  1759.                 }
  1760.                 sb.Append(" =" + Environment.NewLine + sn.ToString());
  1761.                
  1762.                 PauseCapableWriteLine(sb.ToString());
  1763.                
  1764.                 ++inner_count;
  1765.             }
  1766.         }
  1767.        
  1768.         static void DisplaySecurityOnOff()
  1769.         {
  1770.             #pragma warning disable 618 // for obsolete SecurityEnabled getter/setter.
  1771.             PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_SecurityIs"), manager.GetString(SecurityManager.SecurityEnabled ? "Misc_OnCap" : "Misc_OffCap")));
  1772.             #pragma warning restore 618
  1773.             PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ExecutionCheckingIs"), manager.GetString(SecurityManager.CheckExecutionRights ? "Misc_OnCap" : "Misc_OffCap")));
  1774.            
  1775.             try {
  1776.                 PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_PolicyChangePromptIs"), manager.GetString(PolicyPrompt ? "Misc_OnCap" : "Misc_OffCap")));
  1777.             }
  1778.             catch (Exception) {
  1779.                 PauseCapableWriteLine(manager.GetString("Dialog_UnableToDisplayChangePrompt"));
  1780.             }
  1781.         }
  1782.        
  1783.         static void ListHandler(string[] args, int index, out int numArgsUsed)
  1784.         {
  1785.             numArgsUsed = 1;
  1786.            
  1787.             if (args[index].Equals("__internal_usage__")) {
  1788.                 PauseCapableWriteLine(manager.GetString("Help_Option_List"));
  1789.                 return;
  1790.             }
  1791.            
  1792.             IEnumerator levelEnumerator = null;
  1793.            
  1794.             PolicyLevel level = GetLevel();
  1795.            
  1796.             if (level == null && m_levelType == LevelType.All) {
  1797.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1798.             }
  1799.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1800.                 ArrayList list = new ArrayList();
  1801.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1802.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1803.                 list.Add(m_currentCustomLevel);
  1804.                 levelEnumerator = list.GetEnumerator();
  1805.             }
  1806.             else if (level != null) {
  1807.                 ArrayList list = new ArrayList();
  1808.                 list.Add(level);
  1809.                 levelEnumerator = list.GetEnumerator();
  1810.             }
  1811.            
  1812.             if (levelEnumerator == null) {
  1813.                 Error(manager.GetString("OptionTable_List"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1814.             }
  1815.            
  1816.             DisplaySecurityOnOff();
  1817.            
  1818.             try {
  1819.                 while (levelEnumerator.MoveNext()) {
  1820.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1821.                     PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), currentLevel.Label));
  1822.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_CodeGroups") + Environment.NewLine);
  1823.                     DisplayLevelCodeGroups(currentLevel);
  1824.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_NamedPermissionSets") + Environment.NewLine);
  1825.                     DisplayLevelPermissionSets(currentLevel);
  1826.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_FullTrustAssemblies") + Environment.NewLine);
  1827.                     DisplayLevelFullTrustAssemblies(currentLevel);
  1828.                 }
  1829.             }
  1830.             catch (Exception e) {
  1831.                 Error(manager.GetString("OptionTable_List"), e.Message, -1);
  1832.             }
  1833.         }
  1834.        
  1835.         static void ListGroupHandler(string[] args, int index, out int numArgsUsed)
  1836.         {
  1837.             numArgsUsed = 1;
  1838.            
  1839.             if (args[index].Equals("__internal_usage__")) {
  1840.                 PauseCapableWriteLine(manager.GetString("Help_Option_ListGroups"));
  1841.                 return;
  1842.             }
  1843.            
  1844.             IEnumerator levelEnumerator = null;
  1845.            
  1846.             PolicyLevel level = GetLevel();
  1847.            
  1848.             if (level == null && m_levelType == LevelType.All) {
  1849.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1850.             }
  1851.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1852.                 ArrayList list = new ArrayList();
  1853.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1854.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1855.                 list.Add(m_currentCustomLevel);
  1856.                 levelEnumerator = list.GetEnumerator();
  1857.             }
  1858.             else if (level != null) {
  1859.                 ArrayList list = new ArrayList();
  1860.                 list.Add(level);
  1861.                 levelEnumerator = list.GetEnumerator();
  1862.             }
  1863.            
  1864.             if (levelEnumerator == null) {
  1865.                 Error(manager.GetString("OptionTable_ListGroups"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1866.             }
  1867.            
  1868.             DisplaySecurityOnOff();
  1869.            
  1870.             try {
  1871.                 while (levelEnumerator.MoveNext()) {
  1872.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1873.                     PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), currentLevel.Label));
  1874.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_CodeGroups") + Environment.NewLine);
  1875.                     DisplayLevelCodeGroups(currentLevel);
  1876.                 }
  1877.             }
  1878.             catch (Exception e) {
  1879.                 Error(manager.GetString("OptionTable_ListGroups"), e.Message, -1);
  1880.             }
  1881.         }
  1882.        
  1883.         static void ListPermHandler(string[] args, int index, out int numArgsUsed)
  1884.         {
  1885.             numArgsUsed = 1;
  1886.            
  1887.             if (args[index].Equals("__internal_usage__")) {
  1888.                 PauseCapableWriteLine(manager.GetString("Help_Option_ListPSet"));
  1889.                 return;
  1890.             }
  1891.            
  1892.             IEnumerator levelEnumerator = null;
  1893.            
  1894.             PolicyLevel level = GetLevel();
  1895.            
  1896.             if (level == null && m_levelType == LevelType.All) {
  1897.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1898.             }
  1899.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1900.                 ArrayList list = new ArrayList();
  1901.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1902.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1903.                 list.Add(m_currentCustomLevel);
  1904.                 levelEnumerator = list.GetEnumerator();
  1905.             }
  1906.             else if (level != null) {
  1907.                 ArrayList list = new ArrayList();
  1908.                 list.Add(level);
  1909.                 levelEnumerator = list.GetEnumerator();
  1910.             }
  1911.            
  1912.             if (levelEnumerator == null) {
  1913.                 Error(manager.GetString("OptionTable_ListPset"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1914.             }
  1915.            
  1916.             DisplaySecurityOnOff();
  1917.            
  1918.             try {
  1919.                 while (levelEnumerator.MoveNext()) {
  1920.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1921.                     PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), currentLevel.Label));
  1922.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_NamedPermissionSets") + Environment.NewLine);
  1923.                     DisplayLevelPermissionSets(currentLevel);
  1924.                 }
  1925.             }
  1926.             catch (Exception e) {
  1927.                 Error(manager.GetString("OptionTable_ListPset"), e.Message, -1);
  1928.             }
  1929.         }
  1930.        
  1931.         static void ListFullTrustHandler(string[] args, int index, out int numArgsUsed)
  1932.         {
  1933.             numArgsUsed = 1;
  1934.            
  1935.             if (args[index].Equals("__internal_usage__")) {
  1936.                 PauseCapableWriteLine(manager.GetString("Help_Option_ListFullTrust"));
  1937.                 return;
  1938.             }
  1939.            
  1940.             IEnumerator levelEnumerator = null;
  1941.            
  1942.             PolicyLevel level = GetLevel();
  1943.            
  1944.             if (level == null && m_levelType == LevelType.All) {
  1945.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1946.             }
  1947.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1948.                 ArrayList list = new ArrayList();
  1949.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1950.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1951.                 list.Add(m_currentCustomLevel);
  1952.                 levelEnumerator = list.GetEnumerator();
  1953.             }
  1954.             else if (level != null) {
  1955.                 ArrayList list = new ArrayList();
  1956.                 list.Add(level);
  1957.                 levelEnumerator = list.GetEnumerator();
  1958.             }
  1959.            
  1960.             if (levelEnumerator == null) {
  1961.                 Error(manager.GetString("OptionTable_ListFullTrust"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  1962.             }
  1963.            
  1964.             DisplaySecurityOnOff();
  1965.            
  1966.             try {
  1967.                 while (levelEnumerator.MoveNext()) {
  1968.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  1969.                     PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), currentLevel.Label));
  1970.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_FullTrustAssemblies") + Environment.NewLine);
  1971.                     DisplayLevelFullTrustAssemblies(currentLevel);
  1972.                 }
  1973.             }
  1974.             catch (Exception e) {
  1975.                 Error(manager.GetString("OptionTable_ListFullTrust"), e.Message, -1);
  1976.             }
  1977.         }
  1978.        
  1979.         static void ListDescriptionHandler(string[] args, int index, out int numArgsUsed)
  1980.         {
  1981.             numArgsUsed = 1;
  1982.            
  1983.             if (args[index].Equals("__internal_usage__")) {
  1984.                 PauseCapableWriteLine(manager.GetString("Help_Option_ListDescription"));
  1985.                 return;
  1986.             }
  1987.            
  1988.             IEnumerator levelEnumerator = null;
  1989.            
  1990.             PolicyLevel level = GetLevel();
  1991.            
  1992.             if (level == null && m_levelType == LevelType.All) {
  1993.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  1994.             }
  1995.             else if (level == null && m_levelType == LevelType.AllCustom) {
  1996.                 ArrayList list = new ArrayList();
  1997.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  1998.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  1999.                 list.Add(m_currentCustomLevel);
  2000.                 levelEnumerator = list.GetEnumerator();
  2001.             }
  2002.             else if (level != null) {
  2003.                 ArrayList list = new ArrayList();
  2004.                 list.Add(level);
  2005.                 levelEnumerator = list.GetEnumerator();
  2006.             }
  2007.            
  2008.             if (levelEnumerator == null) {
  2009.                 Error(manager.GetString("OptionTable_ListDescription"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2010.             }
  2011.            
  2012.             DisplaySecurityOnOff();
  2013.            
  2014.             try {
  2015.                 while (levelEnumerator.MoveNext()) {
  2016.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  2017.                     PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), currentLevel.Label));
  2018.                     PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_CodeGroups") + Environment.NewLine);
  2019.                     DisplayLevelCodeGroupNameDescriptions(currentLevel);
  2020.                 }
  2021.             }
  2022.             catch (Exception e) {
  2023.                 Error(manager.GetString("OptionTable_ListDescription"), e.Message, -1);
  2024.             }
  2025.         }
  2026.        
  2027.         static void ListCodeGroup(string prefix, string indent, IEnumerator dispEnumerator, IEnumerator rootEnumerator)
  2028.         {
  2029.             if (dispEnumerator == null)
  2030.                 return;
  2031.            
  2032.             int count = 0;
  2033.             CodeGroup rootGroup = null;
  2034.            
  2035.             while (dispEnumerator.MoveNext()) {
  2036.                 CodeGroup group = (CodeGroup)dispEnumerator.Current;
  2037.                
  2038.                 if (rootEnumerator == null)
  2039.                     ++count;
  2040.                 else {
  2041.                     do {
  2042.                         if (!rootEnumerator.MoveNext())
  2043.                             Error(manager.GetString("OptionTable_ResolveGroup"), manager.GetString("Error_CodeGroup_NoMatch"), -1);
  2044.                         rootGroup = (CodeGroup)rootEnumerator.Current;
  2045.                         ++count;
  2046.                     }
  2047.                     while (!rootGroup.Equals(group));
  2048.                 }
  2049.                
  2050.                 string label = prefix + "." + count;
  2051.                
  2052.                 PauseCapableWriteLine(indent + label + ". " + (group.MergeLogic.Equals(manager.GetString("Misc_MergeUnion")) ? "" : ("(" + group.MergeLogic + ") ")) + (group.MembershipCondition == null ? group.GetType().FullName : group.MembershipCondition.ToString()) + ": " + (group.PermissionSetName == null ? manager.GetString("Dialog_Unknown") : group.PermissionSetName) + (group.AttributeString == null || group.AttributeString.Equals("") ? "" : " (" + group.AttributeString + ")"));
  2053.                
  2054.                 if (rootEnumerator == null)
  2055.                     ListCodeGroup(label, indent + m_indent, group.Children.GetEnumerator(), null);
  2056.                 else
  2057.                     ListCodeGroup(label, indent + m_indent, group.Children.GetEnumerator(), rootGroup.Children.GetEnumerator());
  2058.             }
  2059.         }
  2060.        
  2061.         static void ListCodeGroupNameDescription(string prefix, string indent, IEnumerator enumerator)
  2062.         {
  2063.             if (enumerator == null)
  2064.                 return;
  2065.            
  2066.             int count = 1;
  2067.            
  2068.             while (enumerator.MoveNext()) {
  2069.                 string label = prefix + "." + count;
  2070.                 CodeGroup group = (CodeGroup)enumerator.Current;
  2071.                
  2072.                 PauseCapableWriteLine(indent + label + ". " + (group.Name != null && !group.Name.Equals("") ? group.Name : manager.GetString("Dialog_NoLabel")) + ": " + (group.Description != null && !group.Description.Equals("") ? group.Description : manager.GetString("Dialog_NoDescription")));
  2073.                
  2074.                 ListCodeGroupNameDescription(label, indent + m_indent, group.Children.GetEnumerator());
  2075.                
  2076.                 ++count;
  2077.             }
  2078.         }
  2079.        
  2080.         static void CheckFullTrustHandler(string[] args, int index, out int numArgsUsed)
  2081.         {
  2082.             numArgsUsed = 1;
  2083.            
  2084.             if (args[index].Equals("__internal_usage__")) {
  2085.                 PauseCapableWriteLine(manager.GetString("Help_Option_CheckFullTrust"));
  2086.                 return;
  2087.             }
  2088.            
  2089.             IEnumerator levelEnumerator = null;
  2090.            
  2091.             PolicyLevel level = GetLevel();
  2092.            
  2093.             if (level == null && m_levelType == LevelType.All) {
  2094.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  2095.             }
  2096.             else if (level == null && m_levelType == LevelType.AllCustom) {
  2097.                 ArrayList list = new ArrayList();
  2098.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  2099.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  2100.                 list.Add(m_currentCustomLevel);
  2101.                 levelEnumerator = list.GetEnumerator();
  2102.             }
  2103.             else if (level != null) {
  2104.                 ArrayList list = new ArrayList();
  2105.                 list.Add(level);
  2106.                 levelEnumerator = list.GetEnumerator();
  2107.             }
  2108.            
  2109.             if (levelEnumerator == null) {
  2110.                 Error(manager.GetString("OptionTable_CheckFullTrust"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2111.             }
  2112.            
  2113.             try {
  2114.                 while (levelEnumerator.MoveNext()) {
  2115.                     bool needToSave = false;
  2116.                     PolicyLevel currentLevel = (PolicyLevel)levelEnumerator.Current;
  2117.                     SecurityManager.SavePolicyLevel(currentLevel);
  2118.                     Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
  2119.                    
  2120.                     for (int i = 0; i < loadedAssemblies.Length; ++i) {
  2121.                         AssemblyName name = loadedAssemblies[i].GetName();
  2122.                        
  2123.                         if (String.Compare(name.Name, "caspol", StringComparison.OrdinalIgnoreCase) == 0)
  2124.                             continue;
  2125.                        
  2126.                         if (String.Compare(name.Name, "mscorlib", StringComparison.OrdinalIgnoreCase) != 0) {
  2127.                             #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  2128.                             if (!IsFullTrustAssembly(currentLevel.FullTrustAssemblies, loadedAssemblies[i].Evidence)) {
  2129.                                 IEnumerator eviEnumerator = loadedAssemblies[i].Evidence.GetHostEnumerator();
  2130.                                 StrongName sn = null;
  2131.                                
  2132.                                 while (eviEnumerator.MoveNext()) {
  2133.                                     sn = eviEnumerator.Current as StrongName;
  2134.                                    
  2135.                                     if (sn != null)
  2136.                                         break;
  2137.                                 }
  2138.                                
  2139.                                 if (sn == null) {
  2140.                                     Error(manager.GetString("OptionTable_CheckFullTrust"), manager.GetString("Dialog_AssemblyNotStrongNamed"), -1);
  2141.                                 }
  2142.                                 else {
  2143.                                     currentLevel.AddFullTrustAssembly(sn);
  2144.                                     needToSave = true;
  2145.                                 }
  2146.                             }
  2147.                             #pragma warning restore 618
  2148.                         }
  2149.                        
  2150.                         Evidence resourceEvidence;
  2151.                         StrongName resourceStrongName;
  2152.                        
  2153.                         MakeResourceAssemblyEvidence(loadedAssemblies[i].Evidence, out resourceEvidence, out resourceStrongName);
  2154.                        
  2155.                         #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  2156.                         if (!IsFullTrustAssembly(currentLevel.FullTrustAssemblies, resourceEvidence)) {
  2157.                             if (resourceStrongName == null) {
  2158.                                 Error(manager.GetString("OptionTable_CheckFullTrust"), manager.GetString("Dialog_AssemblyNotStrongNamed"), -1);
  2159.                             }
  2160.                             else {
  2161.                                 currentLevel.AddFullTrustAssembly(resourceStrongName);
  2162.                                 needToSave = true;
  2163.                             }
  2164.                         }
  2165.                         #pragma warning restore 618
  2166.                     }
  2167.                    
  2168.                     if (needToSave)
  2169.                         SecurityManager.SavePolicyLevel(currentLevel);
  2170.                 }
  2171.             }
  2172.             catch (Exception e) {
  2173.                 Error(manager.GetString("OptionTable_CheckFullTrust"), e.Message, -1);
  2174.             }
  2175.         }
  2176.        
  2177.         static internal bool IsFullTrustAssembly(IList fullTrustAssemblies, Evidence evidence)
  2178.         {
  2179.             if (fullTrustAssemblies.Count == 0)
  2180.                 return false;
  2181.            
  2182.             GacMembershipCondition gacMembershipCondition = new GacMembershipCondition();
  2183.            
  2184.             if (evidence != null) {
  2185.                 lock (fullTrustAssemblies) {
  2186.                     IEnumerator enumerator = fullTrustAssemblies.GetEnumerator();
  2187.                    
  2188.                     while (enumerator.MoveNext()) {
  2189.                         StrongNameMembershipCondition snMC = (StrongNameMembershipCondition)enumerator.Current;
  2190.                        
  2191.                         if (snMC.Check(evidence) && gacMembershipCondition.Check(evidence))
  2192.                             return true;
  2193.                     }
  2194.                 }
  2195.             }
  2196.            
  2197.             return false;
  2198.         }
  2199.        
  2200.         static internal void MakeResourceAssemblyEvidence(Evidence input, out Evidence output, out StrongName outputSn)
  2201.         {
  2202.             IEnumerator eviEnumerator = input.GetHostEnumerator();
  2203.            
  2204.             output = new Evidence();
  2205.             outputSn = null;
  2206.            
  2207.             while (eviEnumerator.MoveNext()) {
  2208.                 if (eviEnumerator.Current is StrongName) {
  2209.                     StrongName inputSn = (StrongName)eviEnumerator.Current;
  2210.                    
  2211.                     outputSn = new StrongName(inputSn.PublicKey, inputSn.Name + ".resource", inputSn.Version);
  2212.                    
  2213.                     output.AddHost(outputSn);
  2214.                 }
  2215.                 else {
  2216.                     output.AddHost(eviEnumerator.Current);
  2217.                 }
  2218.             }
  2219.            
  2220.             eviEnumerator = input.GetAssemblyEnumerator();
  2221.            
  2222.             while (eviEnumerator.MoveNext()) {
  2223.                 output.AddAssembly(eviEnumerator.Current);
  2224.             }
  2225.         }
  2226.        
  2227.         static void AddPermHandler(string[] args, int index, out int numArgsUsed)
  2228.         {
  2229.             if (args[index].Equals("__internal_usage__")) {
  2230.                 numArgsUsed = 1;
  2231.                 PauseCapableWriteLine(manager.GetString("Help_Option_AddPSet"));
  2232.                 return;
  2233.             }
  2234.            
  2235.             numArgsUsed = 2;
  2236.            
  2237.             if (args.Length - index < 2) {
  2238.                 Error(manager.GetString("OptionTable_AddPset"), manager.GetString("Error_NotEnoughArgs"), -1);
  2239.                 return;
  2240.             }
  2241.            
  2242.             PolicyLevel level = GetLevel();
  2243.            
  2244.             if (level == null) {
  2245.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2246.                     Error(manager.GetString("OptionTable_AddPset"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2247.                 else
  2248.                     Error(manager.GetString("OptionTable_AddPset"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2249.             }
  2250.            
  2251.             NamedPermissionSet permSet = null;
  2252.            
  2253.             try {
  2254.                 permSet = GetPermissionSet(args, index + 1);
  2255.             }
  2256.             catch (Exception e) {
  2257.                 if (e is TargetInvocationException)
  2258.                     e = e.InnerException;
  2259.                
  2260.                 string message = e.Message;
  2261.                
  2262.                 if (message == null || message.Equals("")) {
  2263.                     message = e.GetType().AssemblyQualifiedName;
  2264.                 }
  2265.                
  2266.                 Error(manager.GetString("OptionTable_AddPset"), message, -1);
  2267.             }
  2268.            
  2269.             IEnumerator enumerator = permSet.GetEnumerator();
  2270.            
  2271.             while (enumerator.MoveNext()) {
  2272.                 m_levelAssemblyList.Add(enumerator.Current.GetType().Module.Assembly);
  2273.             }
  2274.            
  2275.             // Detect whether there is a provided name.
  2276.            
  2277.             if (args.Length - index > 2) {
  2278.                 // Check to make sure it's not just someone putting another option on the command line.
  2279.                
  2280.                 bool isOption = false;
  2281.                
  2282.                 for (int i = 0; i < OptionTable.Length; ++i) {
  2283.                     if (String.Compare(OptionTable[i].option, args[index + 2], StringComparison.OrdinalIgnoreCase) == 0) {
  2284.                         isOption = true;
  2285.                         break;
  2286.                     }
  2287.                 }
  2288.                
  2289.                 if (!isOption) {
  2290.                     permSet.Name = args[index + 2];
  2291.                     numArgsUsed = 3;
  2292.                 }
  2293.             }
  2294.            
  2295.             if (permSet.Name == null || permSet.Name.Equals("")) {
  2296.                 Error(manager.GetString("OptionTable_AddPset"), manager.GetString("Error_PermSet_NoName"), -1);
  2297.             }
  2298.            
  2299.             try {
  2300.                 level.AddNamedPermissionSet(permSet);
  2301.             }
  2302.             catch (Exception) {
  2303.                 Error(manager.GetString("OptionTable_AddPset"), manager.GetString("Error_PermSet_AlreadyExist"), -1);
  2304.                 return;
  2305.             }
  2306.            
  2307.             SafeSavePolicy();
  2308.         }
  2309.        
  2310.         static void AddFullTrustHandler(string[] args, int index, out int numArgsUsed)
  2311.         {
  2312.             if (args[index].Equals("__internal_usage__")) {
  2313.                 numArgsUsed = 1;
  2314.                 PauseCapableWriteLine(manager.GetString("Help_Option_AddFullTrust"));
  2315.                 return;
  2316.             }
  2317.            
  2318.             numArgsUsed = 2;
  2319.            
  2320.             if (args.Length - index < 2) {
  2321.                 Error(manager.GetString("OptionTable_AddFullTrust"), manager.GetString("Error_NotEnoughArgs"), -1);
  2322.                 return;
  2323.             }
  2324.            
  2325.             PolicyLevel level = GetLevel();
  2326.            
  2327.             if (level == null) {
  2328.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2329.                     Error(manager.GetString("OptionTable_AddFullTrust"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2330.                 else
  2331.                     Error(manager.GetString("OptionTable_AddFullTrust"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2332.             }
  2333.            
  2334.             CaspolAssembly assembly = LoadAssembly(args[index + 1], manager.GetString("OptionTable_AddFullTrust"));
  2335.            
  2336.             if (assembly == null) {
  2337.                 Error(manager.GetString("OptionTable_AddFullTrust"), manager.GetString("Error_UnableToLoadAssembly"), -1);
  2338.             }
  2339.            
  2340.             StrongName sn = FindStrongName(assembly.Evidence);
  2341.            
  2342.             if (sn == null) {
  2343.                 Error(manager.GetString("OptionTable_AddFullTrust"), manager.GetString("Error_NotStrongNamed"), -1);
  2344.             }
  2345.            
  2346.             try {
  2347.                 PauseCapableWriteLine(manager.GetString("Warning_DeprecatedFullTrustList"));
  2348.                 #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  2349.                 level.AddFullTrustAssembly(sn);
  2350.                 #pragma warning restore 618
  2351.             }
  2352.             catch (Exception) {
  2353.                 Error(manager.GetString("OptionTable_AddFullTrust"), manager.GetString("Error_FullTrust_AlreadyFullTrust"), -1);
  2354.             }
  2355.            
  2356.             SafeSavePolicy();
  2357.         }
  2358.        
  2359.         static void ChgPermHandler(string[] args, int index, out int numArgsUsed)
  2360.         {
  2361.             if (args[index].Equals("__internal_usage__")) {
  2362.                 numArgsUsed = 1;
  2363.                 PauseCapableWriteLine(manager.GetString("Help_Option_ChgPSet"));
  2364.                 return;
  2365.             }
  2366.            
  2367.             numArgsUsed = 3;
  2368.            
  2369.             if (args.Length - index < 3) {
  2370.                 Error(manager.GetString("OptionTable_ChgPSet"), manager.GetString("Error_NotEnoughArgs"), -1);
  2371.                 return;
  2372.             }
  2373.            
  2374.             PolicyLevel level = GetLevel();
  2375.            
  2376.             if (level == null) {
  2377.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2378.                     Error(manager.GetString("OptionTable_ChgPSet"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2379.                 else
  2380.                     Error(manager.GetString("OptionTable_ChgPSet"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2381.             }
  2382.            
  2383.             NamedPermissionSet permSet = null;
  2384.            
  2385.             try {
  2386.                 permSet = GetPermissionSet(args, index + 1);
  2387.             }
  2388.             catch (Exception e) {
  2389.                 string message = e.Message;
  2390.                
  2391.                 if (message == null || message.Equals("")) {
  2392.                     message = e.GetType().AssemblyQualifiedName;
  2393.                 }
  2394.                
  2395.                 Error(manager.GetString("OptionTable_ChgPSet"), message, -1);
  2396.             }
  2397.            
  2398.             try {
  2399.                 level.ChangeNamedPermissionSet(args[index + 2], permSet);
  2400.             }
  2401.             catch (Exception e) {
  2402.                 string message = e.Message;
  2403.                
  2404.                 if (message == null || message.Equals("")) {
  2405.                     message = e.GetType().AssemblyQualifiedName;
  2406.                 }
  2407.                
  2408.                 Error(manager.GetString("OptionTable_ChgPSet"), message, -1);
  2409.             }
  2410.            
  2411.             SafeSavePolicy();
  2412.         }
  2413.        
  2414.         static void RemPermHandler(string[] args, int index, out int numArgsUsed)
  2415.         {
  2416.             if (args[index].Equals("__internal_usage__")) {
  2417.                 numArgsUsed = 1;
  2418.                 PauseCapableWriteLine(manager.GetString("Help_Option_RemPSet"));
  2419.                 return;
  2420.             }
  2421.            
  2422.             numArgsUsed = 2;
  2423.            
  2424.             if (args.Length - index < 2) {
  2425.                 Error(manager.GetString("OptionTable_RemPSet"), manager.GetString("Error_NotEnoughArgs"), -1);
  2426.                 return;
  2427.             }
  2428.            
  2429.             PolicyLevel level = GetLevel();
  2430.            
  2431.             if (level == null) {
  2432.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2433.                     Error(manager.GetString("OptionTable_RemPSet"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2434.                 else
  2435.                     Error(manager.GetString("OptionTable_RemPSet"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2436.             }
  2437.            
  2438.             PermissionSet removedSet = null;
  2439.            
  2440.             try {
  2441.                 removedSet = level.RemoveNamedPermissionSet(args[index + 1]);
  2442.             }
  2443.             catch (Exception e) {
  2444.                 string message = e.Message;
  2445.                
  2446.                 if (message == null || message.Equals("")) {
  2447.                     message = e.GetType().AssemblyQualifiedName;
  2448.                 }
  2449.                
  2450.                 Error(manager.GetString("OptionTable_RemPSet"), message, -1);
  2451.             }
  2452.            
  2453.             if (removedSet != null) {
  2454.                 SafeSavePolicy();
  2455.             }
  2456.             else {
  2457.                 Error(manager.GetString("OptionTable_RemPSet"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_PermSet_DoesNotExist"), args[index + 1]), -1);
  2458.             }
  2459.         }
  2460.        
  2461.         static void RemFullTrustHandler(string[] args, int index, out int numArgsUsed)
  2462.         {
  2463.             if (args[index].Equals("__internal_usage__")) {
  2464.                 numArgsUsed = 1;
  2465.                 PauseCapableWriteLine(manager.GetString("Help_Option_RemFullTrust"));
  2466.                 return;
  2467.             }
  2468.            
  2469.             numArgsUsed = 2;
  2470.            
  2471.             if (args.Length - index < 2) {
  2472.                 Error(manager.GetString("OptionTable_RemFullTrust"), manager.GetString("Error_NotEnoughArgs"), -1);
  2473.                 return;
  2474.             }
  2475.            
  2476.             PolicyLevel level = GetLevel();
  2477.            
  2478.             if (level == null) {
  2479.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2480.                     Error(manager.GetString("OptionTable_RemFullTrust"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2481.                 else
  2482.                     Error(manager.GetString("OptionTable_RemFullTrust"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2483.             }
  2484.            
  2485.             CaspolAssembly assembly = LoadAssembly(args[index + 1], manager.GetString("OptionTable_RemFullTrust"));
  2486.            
  2487.             if (assembly == null) {
  2488.                 Error(manager.GetString("OptionTable_RemFullTrust"), manager.GetString("Error_UnableToLoadAssembly"), -1);
  2489.             }
  2490.            
  2491.             StrongName sn = FindStrongName(assembly.Evidence);
  2492.            
  2493.             if (sn == null) {
  2494.                 Error(manager.GetString("OptionTable_RemFullTrust"), manager.GetString("Error_NotStrongNamed"), -1);
  2495.             }
  2496.            
  2497.             try {
  2498.                 PauseCapableWriteLine(manager.GetString("Warning_DeprecatedFullTrustList"));
  2499.                 #pragma warning disable 618 // for obsolete FullTrustAssemblies property.
  2500.                 level.RemoveFullTrustAssembly(sn);
  2501.                 #pragma warning restore 618
  2502.             }
  2503.             catch (Exception e) {
  2504.                 string message = e.Message;
  2505.                
  2506.                 if (message == null || message.Equals("")) {
  2507.                     message = e.GetType().AssemblyQualifiedName;
  2508.                 }
  2509.                
  2510.                 Error(manager.GetString("OptionTable_RemFullTrust"), message, -1);
  2511.             }
  2512.            
  2513.             SafeSavePolicy();
  2514.         }
  2515.        
  2516.         static void RemGroupHandler(string[] args, int index, out int numArgsUsed)
  2517.         {
  2518.             if (args[index].Equals("__internal_usage__")) {
  2519.                 numArgsUsed = 1;
  2520.                 PauseCapableWriteLine(manager.GetString("Help_Option_RemGroup"));
  2521.                 return;
  2522.             }
  2523.            
  2524.             numArgsUsed = 2;
  2525.            
  2526.             if (args.Length - index < 2) {
  2527.                 Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_NotEnoughArgs"), -1);
  2528.                 return;
  2529.             }
  2530.            
  2531.             object removeValue = null;
  2532.             object parentValue = null;
  2533.            
  2534.             try {
  2535.                 removeValue = GetLabel(args[index + 1]);
  2536.             }
  2537.             catch (Exception e) {
  2538.                 if (e is SecurityException)
  2539.                     Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_PolicyPermissionDenied"), -1);
  2540.                 else
  2541.                     Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2542.                 return;
  2543.             }
  2544.            
  2545.             if (removeValue == null) {
  2546.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2547.                     Error(manager.GetString("OptionTable_RemGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2548.                 else
  2549.                     Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2550.                 return;
  2551.             }
  2552.            
  2553.             if (!(removeValue is CodeGroup)) {
  2554.                 Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_CodeGroup_MustBeCodeGroup"), -1);
  2555.                 return;
  2556.             }
  2557.            
  2558.             string parentLabel = ParentLabel(args[index + 1]);
  2559.            
  2560.             try {
  2561.                 parentValue = GetLabel(parentLabel);
  2562.             }
  2563.             catch (Exception) {
  2564.                 Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2565.                 return;
  2566.             }
  2567.            
  2568.             if (parentValue == null) {
  2569.                 Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2570.                 return;
  2571.             }
  2572.            
  2573.             if (!(parentValue is CodeGroup)) {
  2574.                 Error(manager.GetString("OptionTable_RemGroup"), manager.GetString("Error_CodeGroup_MustBeCodeGroup"), -1);
  2575.                 return;
  2576.             }
  2577.            
  2578.             PolicyLevel level = GetLevel();
  2579.             string numericLabel = null;
  2580.             object group = GetLabelByName(args[index + 1], level.RootCodeGroup, ref numericLabel);
  2581.            
  2582.             if (group == null || numericLabel == null) {
  2583.                 numericLabel = args[index + 1];
  2584.             }
  2585.            
  2586.             string[] splitLabel = numericLabel.Split('.');
  2587.             int indexToSkip;
  2588.            
  2589.             if (splitLabel[splitLabel.Length - 1] != null && splitLabel[splitLabel.Length - 1].Length != 0)
  2590.                 indexToSkip = Int32.Parse(splitLabel[splitLabel.Length - 1], CultureInfo.InvariantCulture);
  2591.             else
  2592.                 indexToSkip = Int32.Parse(splitLabel[splitLabel.Length - 2], CultureInfo.InvariantCulture);
  2593.            
  2594.             IEnumerator enumerator = ((CodeGroup)parentValue).Children.GetEnumerator();
  2595.            
  2596.             ((CodeGroup)parentValue).Children = new ArrayList();
  2597.             int count = 1;
  2598.            
  2599.             while (enumerator.MoveNext()) {
  2600.                 if (count != indexToSkip)
  2601.                     ((CodeGroup)parentValue).AddChild((CodeGroup)enumerator.Current);
  2602.                 count++;
  2603.             }
  2604.            
  2605.             ReplaceLabel(parentLabel, (CodeGroup)parentValue);
  2606.            
  2607.             SafeSavePolicy();
  2608.            
  2609.             PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_RemovedCodeGroup"), GetLevel().Label));
  2610.         }
  2611.        
  2612.         static void AddGroupHandler(string[] args, int index, out int numArgsUsed)
  2613.         {
  2614.             if (args[index].Equals("__internal_usage__")) {
  2615.                 numArgsUsed = 1;
  2616.                 PauseCapableWriteLine(manager.GetString("Help_Option_AddGroup"));
  2617.                 return;
  2618.             }
  2619.            
  2620.             numArgsUsed = 2;
  2621.            
  2622.             if (args.Length - index < 4) {
  2623.                 Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_NotEnoughArgs"), -1);
  2624.                 return;
  2625.             }
  2626.            
  2627.             object parentValue = null;
  2628.            
  2629.             PolicyLevel level = GetLevel();
  2630.            
  2631.             if (level == null) {
  2632.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2633.                     Error(manager.GetString("OptionTable_AddGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2634.                 else
  2635.                     Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2636.             }
  2637.            
  2638.             try {
  2639.                 parentValue = GetLabel(args[index + 1]);
  2640.             }
  2641.             catch (Exception e) {
  2642.                 if (e is SecurityException)
  2643.                     Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_PolicyPermissionDenied"), -1);
  2644.                 else
  2645.                     Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2646.                 return;
  2647.             }
  2648.            
  2649.             if (parentValue == null) {
  2650.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2651.                     Error(manager.GetString("OptionTable_AddGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2652.                 else
  2653.                     Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2654.                 return;
  2655.             }
  2656.            
  2657.             if (!(parentValue is CodeGroup)) {
  2658.                 Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_CodeGroup_MustBeCodeGroup"), -1);
  2659.                 return;
  2660.             }
  2661.            
  2662.             int offset = 0;
  2663.             int exlOffset = 0;
  2664.            
  2665.             IMembershipCondition mship = CreateMembershipCondition(level, args, index + 2, out offset);
  2666.            
  2667.             if (args.Length <= index + 2 + offset) {
  2668.                 Error(manager.GetString("OptionTable_AddGroup"), manager.GetString("Error_CodeGroup_NoPermissionSet"), -1);
  2669.                 return;
  2670.             }
  2671.            
  2672.             CodeGroup newGroup = null;
  2673.            
  2674.             try {
  2675.                 newGroup = new UnionCodeGroup(new AllMembershipCondition(), null);
  2676.                 newGroup.MembershipCondition = mship;
  2677.                
  2678.                 PolicyStatement statement = new PolicyStatement(GetPermissionSet(level, args[index + 2 + offset]), PolicyStatementAttribute.Nothing);
  2679.                 statement.Attributes = IsExclusive(newGroup, args, index + 3 + offset, out exlOffset);
  2680.                
  2681.                 newGroup.PolicyStatement = statement;
  2682.             }
  2683.             catch (Exception e) {
  2684.                 string message = e.Message;
  2685.                 if (message == null || message.Equals(""))
  2686.                     message = e.GetType().AssemblyQualifiedName;
  2687.                 Error(manager.GetString("OptionTable_AddGroup"), message, -1);
  2688.             }
  2689.            
  2690.             ((CodeGroup)parentValue).AddChild(newGroup);
  2691.             ReplaceLabel(args[index + 1], (CodeGroup)parentValue);
  2692.            
  2693.             SafeSavePolicy();
  2694.            
  2695.             PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_AddedCodeGroup"), args[index + 2], level.Label));
  2696.            
  2697.             numArgsUsed = offset + exlOffset + 3;
  2698.         }
  2699.        
  2700.         static void ChgGroupHandler(string[] args, int index, out int numArgsUsed)
  2701.         {
  2702.             if (args[index].Equals("__internal_usage__")) {
  2703.                 numArgsUsed = 1;
  2704.                 PauseCapableWriteLine(manager.GetString("Help_Option_ChgGroup"));
  2705.                 return;
  2706.             }
  2707.            
  2708.             numArgsUsed = 2;
  2709.            
  2710.             if (args.Length - index < 3) {
  2711.                 Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_NotEnoughArgs"), -1);
  2712.                 return;
  2713.             }
  2714.            
  2715.             object group = null;
  2716.            
  2717.             PolicyLevel level = GetLevel();
  2718.            
  2719.             if (level == null) {
  2720.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2721.                     Error(manager.GetString("OptionTable_ChgGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2722.                 else
  2723.                     Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2724.             }
  2725.             try {
  2726.                 group = GetLabel(args[index + 1]);
  2727.             }
  2728.             catch (Exception e) {
  2729.                 if (e is SecurityException)
  2730.                     Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_PolicyPermissionDenied"), -1);
  2731.                 else
  2732.                     Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2733.                 return;
  2734.             }
  2735.            
  2736.             if (group == null) {
  2737.                 if (m_levelType == LevelType.All || m_levelType == LevelType.AllCustom)
  2738.                     Error(manager.GetString("OptionTable_ChgGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_NotValidWithAll"), manager.GetString("OptionTable_All")), -1);
  2739.                 else
  2740.                     Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_InvalidLabel"), -1);
  2741.                 return;
  2742.             }
  2743.            
  2744.             if (!(group is CodeGroup)) {
  2745.                 Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_CodeGroup_MustBeCodeGroup"), -1);
  2746.                 return;
  2747.             }
  2748.            
  2749.             CodeGroup codeGroup = (CodeGroup)group;
  2750.            
  2751.             bool foundAtLeastOneMatch = false;
  2752.            
  2753.             StringBuilder sb = new StringBuilder();
  2754.            
  2755.             // chggroup can take an arbitrary number of arguments. To do this,
  2756.             // we just iterate through the argument array until we find the
  2757.             // end of the array or another option.
  2758.            
  2759.             while (true) {
  2760.                 int offset = 0;
  2761.                
  2762.                 // If we are at the end of argument array, break
  2763.                
  2764.                 if (args.Length - index <= numArgsUsed)
  2765.                     break;
  2766.                
  2767.                 // If we have found another option, break
  2768.                
  2769.                 int i;
  2770.                
  2771.                 for (i = 0; i < OptionTable.Length; ++i) {
  2772.                     if (String.Compare(args[index + numArgsUsed], OptionTable[i].option, StringComparison.OrdinalIgnoreCase) == 0)
  2773.                         break;
  2774.                 }
  2775.                
  2776.                 if (i != OptionTable.Length)
  2777.                     break;
  2778.                
  2779.                 // Check to see if we've found a membership condition arg.
  2780.                
  2781.                 IMembershipCondition condition = CreateMembershipConditionNoThrow(level, args, index + numArgsUsed, out offset);
  2782.                
  2783.                 if (condition != null && offset != 0) {
  2784.                     codeGroup.MembershipCondition = condition;
  2785.                     if (foundAtLeastOneMatch)
  2786.                         sb.Append(Environment.NewLine);
  2787.                     sb.Append(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ChangedCodeGroupMembershipCondition"), args[index + numArgsUsed], level.Label));
  2788.                     numArgsUsed += offset;
  2789.                     foundAtLeastOneMatch = true;
  2790.                    
  2791.                     continue;
  2792.                 }
  2793.                
  2794.                 // Check to see if we've found an attribute arg.
  2795.                
  2796.                 PolicyStatementAttribute attr = PolicyStatementAttribute.Nothing;
  2797.                
  2798.                 attr = IsExclusive((CodeGroup)group, args, index + numArgsUsed, out offset);
  2799.                
  2800.                 if (offset != 0) {
  2801.                     PolicyStatement ps = ((CodeGroup)codeGroup).PolicyStatement;
  2802.                     ps.Attributes = attr;
  2803.                     ((CodeGroup)codeGroup).PolicyStatement = ps;
  2804.                    
  2805.                     if (foundAtLeastOneMatch)
  2806.                         sb.Append(Environment.NewLine);
  2807.                     if (codeGroup.AttributeString == null || codeGroup.AttributeString.Equals(""))
  2808.                         sb.Append(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ChangedCodeGroupAttributes1"), level.Label));
  2809.                     else
  2810.                         sb.Append(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ChangedCodeGroupAttributes2"), ((CodeGroup)codeGroup).AttributeString, level.Label));
  2811.                     numArgsUsed += offset;
  2812.                     foundAtLeastOneMatch = true;
  2813.                     continue;
  2814.                 }
  2815.                
  2816.                 // Check to see if we've found a permission set arg.
  2817.                
  2818.                 PermissionSet permSet = null;
  2819.                
  2820.                 try {
  2821.                     permSet = GetPermissionSet(level, args[index + numArgsUsed]);
  2822.                 }
  2823.                 catch (Exception e) {
  2824.                     string message = e.Message;
  2825.                    
  2826.                     if (message == null || message.Equals("")) {
  2827.                         message = e.GetType().AssemblyQualifiedName;
  2828.                     }
  2829.                    
  2830.                     Error(manager.GetString("OptionTable_ChgGroup"), message, -1);
  2831.                 }
  2832.                
  2833.                 if (permSet != null) {
  2834.                     if (codeGroup is UnionCodeGroup) {
  2835.                         PolicyStatement ps = ((UnionCodeGroup)codeGroup).PolicyStatement;
  2836.                         ps.PermissionSet = permSet;
  2837.                         ((UnionCodeGroup)codeGroup).PolicyStatement = ps;
  2838.                     }
  2839.                     else if (codeGroup is FirstMatchCodeGroup) {
  2840.                         PolicyStatement ps = ((FirstMatchCodeGroup)codeGroup).PolicyStatement;
  2841.                         ps.PermissionSet = permSet;
  2842.                         ((FirstMatchCodeGroup)codeGroup).PolicyStatement = ps;
  2843.                     }
  2844.                     else if (codeGroup is FileCodeGroup)
  2845.                         Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_CodeGroup_FileNoEffect"), -1);
  2846.                     else if (codeGroup is NetCodeGroup)
  2847.                         Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Error_CodeGroup_NetNoEffect"), -1);
  2848.                     else
  2849.                         Error(manager.GetString("OptionTable_ChgGroup"), manager.GetString("Dialog_BuiltInOnly"), -1);
  2850.                    
  2851.                     if (foundAtLeastOneMatch)
  2852.                         sb.Append(Environment.NewLine);
  2853.                     sb.Append(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_ChangedCodeGroupPermissionSet"), args[index + numArgsUsed], level.Label));
  2854.                    
  2855.                     numArgsUsed++;
  2856.                     foundAtLeastOneMatch = true;
  2857.                     continue;
  2858.                 }
  2859.                
  2860.                 if (!foundAtLeastOneMatch)
  2861.                     Error(manager.GetString("OptionTable_ChgGroup"), String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_CodeGroup_UnrecognizedOption"), args[index + 2]), -1);
  2862.                 else
  2863.                     break;
  2864.             }
  2865.            
  2866.             ReplaceLabel(args[index + 1], codeGroup);
  2867.            
  2868.             SafeSavePolicy();
  2869.            
  2870.             PauseCapableWriteLine(sb.ToString());
  2871.         }
  2872.        
  2873.         static CaspolAssembly LoadAssembly(string fileName, string option)
  2874.         {
  2875.             return LoadAssembly(fileName, option, true);
  2876.         }
  2877.        
  2878.         static CaspolAssembly LoadAssembly(string fileName, string option, bool errorOnFail)
  2879.         {
  2880.             AppDomain domain = AppDomain.CreateDomain("Caspol Domain", null, Environment.CurrentDirectory, Thread.GetDomain().BaseDirectory, false);
  2881.            
  2882.             if (domain == null)
  2883.                 Error(option, manager.GetString("Error_UnableToLoadAssembly"), -1);
  2884.            
  2885.             CaspolAssembly asm = (CaspolAssembly)domain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, "Microsoft.Tools.Caspol.CaspolAssembly", false, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, null, new object[] {fileName}, null, null, null);
  2886.            
  2887.             if (asm.Error && errorOnFail)
  2888.                 Error(option, manager.GetString("Error_UnableToLoadAssembly"), -1);
  2889.            
  2890.             return asm;
  2891.         }
  2892.        
  2893.         static Evidence GenerateShellEvidence(string fileName, string option)
  2894.         {
  2895.             CaspolAssembly asm = LoadAssembly(fileName, option, false);
  2896.             Evidence ev = (asm == null ? null : asm.Evidence);
  2897.            
  2898.             if (ev != null) {
  2899.                 return ev;
  2900.             }
  2901.             else {
  2902.                 string fullPath = null;
  2903.                 try {
  2904.                     // Path.GetFullPath can throw an "Argument_PathUriFormatNotSupported"
  2905.                     // Caspol *DOES* support Path URI formats. If fileName is in URI format,
  2906.                     // it will only get to here if the file does not exist. (Hence this try/catch block)
  2907.                     fullPath = Path.GetFullPath(fileName);
  2908.                 }
  2909.                 catch (Exception) {
  2910.                     Error(option, manager.GetString("Error_UnableToLoadAssembly"), -1);
  2911.                 }
  2912.                
  2913.                 if (fullPath == null || !File.Exists(fullPath))
  2914.                     Error(option, manager.GetString("Error_UnableToLoadAssembly"), -1);
  2915.                
  2916.                 if (PolicyPrompt) {
  2917.                     PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_UseFakeEvidenceQuestion"), fileName));
  2918.                    
  2919.                     if (!GetAnswer()) {
  2920.                         PauseCapableWriteLine(manager.GetString("Dialog_OperationAborted"));
  2921.                         throw new ExitException();
  2922.                     }
  2923.                 }
  2924.                 else {
  2925.                     PauseCapableWriteLine(String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_UseFakeEvidence"), fileName));
  2926.                 }
  2927.                
  2928.                 #if !PLATFORM_UNIX
  2929.                 string fileUrl = "file:///" + fullPath;
  2930.                 #else // !PLATFORM_UNIX
  2931.                 string fileUrl = "file://" + fullPath;
  2932.                 #endif // !PLATFORM_UNIX
  2933.                
  2934.                 Evidence evidence = new Evidence();
  2935.                 evidence.AddHost(Zone.CreateFromUrl(fileUrl));
  2936.                 evidence.AddHost(new Url(fileUrl));
  2937.                
  2938.                 return evidence;
  2939.             }
  2940.         }
  2941.        
  2942.         static void ResolveGroupHandler(string[] args, int index, out int numArgsUsed)
  2943.         {
  2944.             if (args[index].Equals("__internal_usage__")) {
  2945.                 numArgsUsed = 1;
  2946.                 PauseCapableWriteLine(manager.GetString("Help_Option_ResolveGroup"));
  2947.                 return;
  2948.             }
  2949.            
  2950.             numArgsUsed = 2;
  2951.            
  2952.             if (args.Length - index < 2) {
  2953.                 Error(manager.GetString("OptionTable_ResolveGroup"), manager.GetString("Error_NotEnoughArgs"), -1);
  2954.             }
  2955.            
  2956.             IEnumerator levelEnumerator = null;
  2957.            
  2958.             PolicyLevel level = m_levelType == LevelType.None ? null : GetLevel(m_levelType);
  2959.            
  2960.             if (level == null && (m_levelType == LevelType.All || m_levelType == LevelType.None)) {
  2961.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  2962.             }
  2963.             else if (level == null && m_levelType == LevelType.AllCustom) {
  2964.                 ArrayList list = new ArrayList();
  2965.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  2966.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  2967.                 list.Add(m_currentCustomLevel);
  2968.                 levelEnumerator = list.GetEnumerator();
  2969.             }
  2970.             else if (level != null) {
  2971.                 ArrayList list = new ArrayList();
  2972.                 list.Add(level);
  2973.                 levelEnumerator = list.GetEnumerator();
  2974.             }
  2975.            
  2976.             if (levelEnumerator == null) {
  2977.                 Error(manager.GetString("OptionTable_ResolveGroup"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  2978.             }
  2979.            
  2980.             Evidence evidence = GenerateShellEvidence(args[index + 1], manager.GetString("OptionTable_ResolveGroup"));
  2981.            
  2982.             while (levelEnumerator.MoveNext()) {
  2983.                 PauseCapableWriteLine(Environment.NewLine + String.Format(CultureInfo.CurrentCulture, manager.GetString("Dialog_Level"), ((PolicyLevel)levelEnumerator.Current).Label));
  2984.                 PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_CodeGroups") + Environment.NewLine);
  2985.                 CodeGroup displayGroup = ((PolicyLevel)levelEnumerator.Current).ResolveMatchingCodeGroups(evidence);
  2986.                 CodeGroup rootGroup = ((PolicyLevel)levelEnumerator.Current).RootCodeGroup;
  2987.                 DisplayCodeGroups(displayGroup, rootGroup);
  2988.                
  2989.                 PauseCapableWriteLine("");
  2990.             }
  2991.         }
  2992.        
  2993.         static void ResolvePermHandler(string[] args, int index, out int numArgsUsed)
  2994.         {
  2995.             if (args[index].Equals("__internal_usage__")) {
  2996.                 numArgsUsed = 1;
  2997.                 PauseCapableWriteLine(manager.GetString("Help_Option_ResolvePerm"));
  2998.                 return;
  2999.             }
  3000.            
  3001.             numArgsUsed = 2;
  3002.            
  3003.             if (args.Length - index < 2) {
  3004.                 Error(manager.GetString("OptionTable_ResolvePerm"), manager.GetString("Error_NotEnoughArgs"), -1);
  3005.             }
  3006.            
  3007.             IEnumerator levelEnumerator = null;
  3008.            
  3009.             PolicyLevel level = m_levelType == LevelType.None ? null : GetLevel(m_levelType);
  3010.            
  3011.             if (level == null && (m_levelType == LevelType.All || m_levelType == LevelType.None)) {
  3012.                 levelEnumerator = SecurityManager.PolicyHierarchy();
  3013.             }
  3014.             else if (level == null && m_levelType == LevelType.AllCustom) {
  3015.                 ArrayList list = new ArrayList();
  3016.                 list.Add(GetLevel(System.Security.PolicyLevelType.Enterprise));
  3017.                 list.Add(GetLevel(System.Security.PolicyLevelType.Machine));
  3018.                 list.Add(m_currentCustomLevel);
  3019.                 levelEnumerator = list.GetEnumerator();
  3020.             }
  3021.             else if (level != null) {
  3022.                 ArrayList list = new ArrayList();
  3023.                 list.Add(level);
  3024.                 levelEnumerator = list.GetEnumerator();
  3025.             }
  3026.            
  3027.             if (levelEnumerator == null) {
  3028.                 Error(manager.GetString("OptionTable_ResolvePerm"), manager.GetString("Error_UnableToRetrieveLevel"), -1);
  3029.             }
  3030.            
  3031.             Evidence evidence = GenerateShellEvidence(args[index + 1], manager.GetString("OptionTable_ResolvePerm"));
  3032.            
  3033.             PermissionSet grant = null;
  3034.            
  3035.             while (levelEnumerator.MoveNext()) {
  3036.                 PauseCapableWriteLine("Resolving permissions for level = " + ((PolicyLevel)levelEnumerator.Current).Label);
  3037.                
  3038.                 PolicyStatement policy = ((PolicyLevel)levelEnumerator.Current).Resolve(evidence);
  3039.                
  3040.                 if (policy != null) {
  3041.                     if (grant == null)
  3042.                         grant = policy.PermissionSet;
  3043.                     else
  3044.                         grant = grant.Intersect(policy.PermissionSet);
  3045.                    
  3046.                     if (grant == null)
  3047.                         grant = new PermissionSet(PermissionState.None);
  3048.                    
  3049.                     if (policy.Attributes == PolicyStatementAttribute.LevelFinal)
  3050.                         break;
  3051.                 }
  3052.                 else
  3053.                     grant = new PermissionSet(PermissionState.None);
  3054.             }
  3055.            
  3056.             IEnumerator evidenceEnumerator = evidence.GetEnumerator();
  3057.             while (evidenceEnumerator.MoveNext()) {
  3058.                 try {
  3059.                     object obj = evidenceEnumerator.Current;
  3060.                     IIdentityPermissionFactory factory = obj as IIdentityPermissionFactory;
  3061.                     if (factory != null) {
  3062.                         IPermission perm = factory.CreateIdentityPermission(evidence);
  3063.                        
  3064.                         if (perm != null) {
  3065.                             grant.AddPermission(perm);
  3066.                         }
  3067.                     }
  3068.                 }
  3069.                 catch (Exception) {
  3070.                 }
  3071.             }
  3072.            
  3073.            
  3074.             PauseCapableWriteLine(Environment.NewLine + manager.GetString("Dialog_Grant") + Environment.NewLine + grant.ToString());
  3075.         }
  3076.        
  3077.         static SecurityElement ReadXmlFile(string[] args, int index)
  3078.         {
  3079.             FileStream f;
  3080.            
  3081.             try {
  3082.                 f = new FileStream(args[index], FileMode.Open, FileAccess.Read);
  3083.             }
  3084.             catch (Exception) {
  3085.                 throw new Exception(manager.GetString("Error_File_UnableToOpenFile"));
  3086.             }
  3087.            
  3088.             // Do the actual decode.
  3089.             Encoding[] encodings = new Encoding[] {Encoding.UTF8, Encoding.ASCII, Encoding.Unicode};
  3090.            
  3091.             bool success = false;
  3092.             Exception exception = null;
  3093.             SecurityElement se = null;
  3094.            
  3095.             for (int i = 0; !success && i < encodings.Length; ++i) {
  3096.                 try {
  3097.                     f.Position = 0;
  3098.                    
  3099.                     StreamReader reader = new StreamReader(f, encodings[i], true);
  3100.                     se = SecurityElement.FromString(reader.ReadToEnd());
  3101.                     success = true;
  3102.                 }
  3103.                 catch (Exception e1) {
  3104.                     if (exception == null)
  3105.                         exception = e1;
  3106.                 }
  3107.             }
  3108.            
  3109.             f.Close();
  3110.            
  3111.             if (!success) {
  3112.                 throw exception;
  3113.             }
  3114.            
  3115.             return se;
  3116.         }
  3117.        
  3118.         static NamedPermissionSet GetPermissionSet(string[] args, int index)
  3119.         {
  3120.             // Create named permission set with "no name" since you have to give it a name.
  3121.             NamedPermissionSet p = new NamedPermissionSet("@@no name@@");
  3122.            
  3123.             p.FromXml(ReadXmlFile(args, index));
  3124.            
  3125.             return p;
  3126.         }
  3127.        
  3128.         static NamedPermissionSet GetPermissionSet(PolicyLevel level, string name)
  3129.         {
  3130.             NamedPermissionSet permSet = level.GetNamedPermissionSet(name);
  3131.             if (permSet == null) {
  3132.                 throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, manager.GetString("Error_UnknownPermissionSet"), name));
  3133.             }
  3134.             return permSet;
  3135.         }
  3136.        
  3137.         static string FormatXmlString(string inputXml)
  3138.         {
  3139.             return inputXml;
  3140.         }
  3141.     }
  3142.    
  3143.     internal class OptionTableEntry
  3144.     {
  3145.         public OptionTableEntry(string option, OptionHandler handler, string sameAs, bool list)
  3146.         {
  3147.             this.option = option;
  3148.             this.handler = handler;
  3149.             this.sameAs = sameAs;
  3150.             this.list = list;
  3151.             this.displayMShip = false;
  3152.         }
  3153.        
  3154.         public OptionTableEntry(string option, OptionHandler handler, string sameAs, bool list, bool displayMShip)
  3155.         {
  3156.             this.option = option;
  3157.             this.handler = handler;
  3158.             this.sameAs = sameAs;
  3159.             this.list = list;
  3160.             this.displayMShip = displayMShip;
  3161.         }
  3162.        
  3163.         internal string option;
  3164.         internal OptionHandler handler;
  3165.         internal string sameAs;
  3166.         internal bool list;
  3167.         internal bool displayMShip;
  3168.     }
  3169.    
  3170.     internal class MembershipConditionTableEntry
  3171.     {
  3172.         public MembershipConditionTableEntry(string option, MembershipConditionHandler handler)
  3173.         {
  3174.             this.option = option;
  3175.             this.handler = handler;
  3176.         }
  3177.        
  3178.         internal string option;
  3179.         internal MembershipConditionHandler handler;
  3180.     }
  3181.    
  3182.     internal class CodeGroupAttributeTableEntry
  3183.     {
  3184.         public CodeGroupAttributeTableEntry(string label, PolicyStatementAttribute value, string description)
  3185.         {
  3186.             this.label = label;
  3187.             this.value = value;
  3188.             this.description = description;
  3189.             this.display = true;
  3190.             this.handler = null;
  3191.         }
  3192.        
  3193.         public CodeGroupAttributeTableEntry(string label, CodeGroupAttributeHandler handler, bool display)
  3194.         {
  3195.             this.label = label;
  3196.             this.handler = handler;
  3197.             this.display = display;
  3198.             this.description = null;
  3199.         }
  3200.        
  3201.         internal string label;
  3202.         internal bool display;
  3203.         internal PolicyStatementAttribute value;
  3204.         internal string description;
  3205.         internal CodeGroupAttributeHandler handler;
  3206.     }
  3207.    
  3208.     class ExitException : Exception
  3209.     {
  3210.     }
  3211.    
  3212.     class CaspolAssembly : MarshalByRefObject
  3213.     {
  3214.         bool error;
  3215.         Assembly asm;
  3216.        
  3217.         public CaspolAssembly(string fileName)
  3218.         {
  3219.             try {
  3220.                 asm = Assembly.Load(fileName);
  3221.             }
  3222.             catch (Exception) {
  3223.             }
  3224.            
  3225.             if (asm != null)
  3226.                 return;
  3227.            
  3228.             try {
  3229.                 asm = Assembly.LoadFrom(fileName);
  3230.             }
  3231.             catch (Exception) {
  3232.             }
  3233.            
  3234.             if (asm != null)
  3235.                 return;
  3236.            
  3237.             try {
  3238.                 asm = Assembly.LoadFrom(Environment.CurrentDirectory + "\\" + fileName);
  3239.             }
  3240.             catch (Exception) {
  3241.             }
  3242.            
  3243.             if (asm != null)
  3244.                 return;
  3245.            
  3246.             error = true;
  3247.         }
  3248.         public bool Error {
  3249.             get { return error; }
  3250.         }
  3251.        
  3252.        
  3253.         public Evidence Evidence {
  3254.             get {
  3255.                 if (asm == null)
  3256.                     return null;
  3257.                 return asm.Evidence;
  3258.             }
  3259.         }
  3260.     }
  3261. }

Developer Fusion