PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs

https://gitlab.com/unofficial-mirrors/PowerShell
C# | 237 lines | 171 code | 32 blank | 34 comment | 17 complexity | 6f8aa832ac1ec2f36120c53ac799e66e MD5 | raw file
  1. // Copyright (c) Microsoft Corporation. All rights reserved.
  2. // Licensed under the MIT License.
  3. using System.IO;
  4. using System.Xml;
  5. using Microsoft.PowerShell.Commands;
  6. using Dbg = System.Management.Automation.Diagnostics;
  7. using System.Collections.Generic;
  8. using System.Text;
  9. namespace System.Management.Automation.Remoting
  10. {
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. public sealed class PSSessionConfigurationData
  15. {
  16. /// <summary>
  17. /// </summary>
  18. public static bool IsServerManager;
  19. #region Public Properties
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. public List<string> ModulesToImport
  24. {
  25. get
  26. {
  27. return _modulesToImport;
  28. }
  29. }
  30. internal List<object> ModulesToImportInternal
  31. {
  32. get
  33. {
  34. return _modulesToImportInternal;
  35. }
  36. }
  37. /// <summary>
  38. ///
  39. /// </summary>
  40. public String PrivateData
  41. {
  42. get
  43. {
  44. return _privateData;
  45. }
  46. internal set
  47. {
  48. _privateData = value;
  49. }
  50. }
  51. #endregion Public Properties
  52. #region Internal Methods
  53. private PSSessionConfigurationData()
  54. {
  55. }
  56. internal static string Unescape(string s)
  57. {
  58. StringBuilder sb = new StringBuilder(s);
  59. sb.Replace("&lt;", "<");
  60. sb.Replace("&gt;", ">");
  61. sb.Replace("&quot;", "\"");
  62. sb.Replace("&apos;", "'");
  63. sb.Replace("&amp;", "&");
  64. return sb.ToString();
  65. }
  66. internal static PSSessionConfigurationData Create(string configurationData)
  67. {
  68. PSSessionConfigurationData configuration = new PSSessionConfigurationData();
  69. if (String.IsNullOrEmpty(configurationData)) return configuration;
  70. configurationData = Unescape(configurationData);
  71. XmlReaderSettings readerSettings = new XmlReaderSettings
  72. {
  73. CheckCharacters = false,
  74. IgnoreComments = true,
  75. IgnoreProcessingInstructions = true,
  76. MaxCharactersInDocument = 10000,
  77. XmlResolver = null,
  78. ConformanceLevel = ConformanceLevel.Fragment
  79. };
  80. using (XmlReader reader = XmlReader.Create(new StringReader(configurationData), readerSettings))
  81. {
  82. // read the header <SessionConfigurationData>
  83. if (reader.ReadToFollowing(SessionConfigToken))
  84. {
  85. bool isParamFound = reader.ReadToDescendant(ParamToken);
  86. while (isParamFound)
  87. {
  88. if (!reader.MoveToAttribute(NameToken))
  89. {
  90. throw PSTraceSource.NewArgumentException(configurationData,
  91. RemotingErrorIdStrings.NoAttributesFoundForParamElement,
  92. NameToken, ValueToken, ParamToken);
  93. }
  94. string optionName = reader.Value;
  95. if (String.Equals(optionName, PrivateDataToken, StringComparison.OrdinalIgnoreCase))
  96. {
  97. // this is a PrivateData element which we
  98. // need to process
  99. if (reader.ReadToFollowing(PrivateDataToken))
  100. {
  101. string privateData = reader.ReadOuterXml();
  102. AssertValueNotAssigned(PrivateDataToken, configuration._privateData);
  103. configuration._privateData = privateData;
  104. }
  105. }
  106. else
  107. {
  108. if (!reader.MoveToAttribute(ValueToken))
  109. {
  110. throw PSTraceSource.NewArgumentException(configurationData,
  111. RemotingErrorIdStrings.NoAttributesFoundForParamElement,
  112. NameToken, ValueToken, ParamToken);
  113. }
  114. string optionValue = reader.Value;
  115. configuration.Update(optionName, optionValue);
  116. }
  117. // move to next Param token.
  118. isParamFound = reader.ReadToFollowing(ParamToken);
  119. }
  120. }
  121. }
  122. configuration.CreateCollectionIfNecessary();
  123. return configuration;
  124. }
  125. #endregion Internal Methods
  126. #region Private Members
  127. private List<string> _modulesToImport;
  128. private List<object> _modulesToImportInternal;
  129. private string _privateData;
  130. /// <summary>
  131. /// Checks if the originalValue is empty. If not throws an exception
  132. /// </summary>
  133. /// <param name="optionName"></param>
  134. /// <param name="originalValue"></param>
  135. /// <exception cref="ArgumentException">
  136. /// 1. "optionName" is already defined
  137. /// </exception>
  138. private static void AssertValueNotAssigned(string optionName, object originalValue)
  139. {
  140. if (originalValue != null)
  141. {
  142. throw PSTraceSource.NewArgumentException(optionName,
  143. RemotingErrorIdStrings.DuplicateInitializationParameterFound, optionName, SessionConfigToken);
  144. }
  145. }
  146. /// <summary>
  147. /// Using optionName and optionValue updates the current object
  148. /// </summary>
  149. /// <param name="optionName"></param>
  150. /// <param name="optionValue"></param>
  151. /// <exception cref="ArgumentException">
  152. /// 1. "optionName" is not valid in "InitializationParameters" section.
  153. /// 2. "startupscript" must specify a PowerShell script file that ends with extension ".ps1".
  154. /// </exception>
  155. private void Update(string optionName, string optionValue)
  156. {
  157. switch (optionName.ToLowerInvariant())
  158. {
  159. case ModulesToImportToken:
  160. {
  161. AssertValueNotAssigned(ModulesToImportToken, _modulesToImport);
  162. _modulesToImport = new List<string>();
  163. _modulesToImportInternal = new List<object>();
  164. object[] modulesToImport = optionValue.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
  165. foreach (var module in modulesToImport)
  166. {
  167. var s = module as string;
  168. if (s != null)
  169. {
  170. _modulesToImport.Add(s.Trim());
  171. ModuleSpecification moduleSpec = null;
  172. if (ModuleSpecification.TryParse(s, out moduleSpec))
  173. {
  174. _modulesToImportInternal.Add(moduleSpec);
  175. }
  176. else
  177. {
  178. _modulesToImportInternal.Add(s.Trim());
  179. }
  180. }
  181. }
  182. }
  183. break;
  184. default:
  185. {
  186. Dbg.Assert(false, "Unknown option specified");
  187. }
  188. break;
  189. }
  190. }
  191. private void CreateCollectionIfNecessary()
  192. {
  193. if (_modulesToImport == null) _modulesToImport = new List<string>();
  194. if (_modulesToImportInternal == null) _modulesToImportInternal = new List<object>();
  195. }
  196. private const string SessionConfigToken = "SessionConfigurationData";
  197. internal const string ModulesToImportToken = "modulestoimport";
  198. internal const string PrivateDataToken = "PrivateData";
  199. internal const string InProcActivityToken = "InProcActivity";
  200. private const string ParamToken = "Param";
  201. private const string NameToken = "Name";
  202. private const string ValueToken = "Value";
  203. #endregion Private Members
  204. }
  205. }