in dotNet/PsEdge/PsHostUI.cs [117:195]
public override Dictionary<string, PSObject> Prompt(string caption, string message, Collection<FieldDescription> descriptions)
{
// Maintain the list of all secure strings. These will have to be converted later.
var secureStrings = new HashSet<string>();
var promptInput = new EdgePromptInput()
{
Caption = caption,
Message = message,
FieldDescriptions = new List<EdgeFieldDescription>()
};
var result = new Dictionary<string, PSObject>();
for(int i = 0; i < descriptions.Count; i++)
{
// Handle credential types. Add a dummy result for these fields without prompting the user in this call.
// The PS engine will later call one of the PromptForCredentials callbacks.
if (descriptions[i].ParameterTypeFullName.Equals("System.Management.Automation.PSCredential", StringComparison.OrdinalIgnoreCase))
{
result[descriptions[i].Name] = "";
continue;
}
var isSecureString = descriptions[i].ParameterTypeFullName.Contains("System.Security.SecureString");
promptInput.FieldDescriptions.Add(new EdgeFieldDescription()
{
Name = descriptions[i].Name,
Type = descriptions[i].ParameterTypeName,
IsArray = descriptions[i].ParameterTypeName.EndsWith("[]"), // TODO: This approach is fast, but may not work for arrays containing generics.
IsSecureString = isSecureString
});
if (isSecureString)
{
secureStrings.Add((descriptions[i].Name));
}
}
if (promptInput.FieldDescriptions.Count > 0)
{
var output = this.promptHandler(promptInput).Result;
var outputDict = (IDictionary<string, object>) output;
foreach (var entry in (object[]) outputDict["Results"])
{
var entryDict = (IDictionary<string, object>) entry;
var fieldName = (string) entryDict["Name"];
var fieldValue = entryDict["Value"];
if (secureStrings.Contains(fieldName))
{
var singleStr = fieldValue as string;
if (singleStr != null)
{
fieldValue = ToSecureString(singleStr);
}
var arrayStr = fieldValue as object[];
if (arrayStr != null)
{
fieldValue = new SecureString[arrayStr.Length];
for (int i = 0; i < arrayStr.Length; i++)
{
((SecureString[])fieldValue)[i] = ToSecureString((string)arrayStr[i]);
}
}
}
result[fieldName] = PSObject.AsPSObject(fieldValue);
}
}
return result;
}