137 lines
4.2 KiB
C#

//----------------------------------------------------------------------------
//
// Copyright (C) 2023 Intel Corporation
//
// File: ProgramInput.cs
//
// Contents: Program input getting functions.
//
//----------------------------------------------------------------------------
using Newtonsoft.Json;
using System.IO;
using Intel.Manageability;
using System.Security;
using System;
namespace Common.Utils
{
public static class ProgramInput
{
#region Consts
private const string sampleArgsFileName = "SampleArgs.json";
private const string defaultSampleArgsPath = @"..\..\..\..\Common\";
private const string fallBackSampleArgsPath = @"..\..\..\..\..\..\Common\Utils\C#\";
#endregion
#region Enum
public enum PASSWORD_TYPE
{
AMT_USER,
PROXY,
REDIRECTION_PROXY
}
#endregion
#region Public Static Functions
public static ConnectionInfoEX DeserializeJsonToStruct(string jsonPath = null)
{
// config location = input;
if (jsonPath == null)
{
// config location = working directory;
jsonPath = Path.Combine(Directory.GetCurrentDirectory(), sampleArgsFileName);
if (!File.Exists(jsonPath))
{
// location = ..\..\..\..\Common\
jsonPath = Path.GetFullPath(Path.Combine(defaultSampleArgsPath, sampleArgsFileName));
if (!File.Exists(jsonPath))
{
// location = ..\..\..\..\..\..\Common\Utils\C#\
jsonPath = Path.GetFullPath(Path.Combine(fallBackSampleArgsPath, sampleArgsFileName));
}
}
}
if (!File.Exists(jsonPath))
{
throw new IOException($"The file {jsonPath} does not exist.");
}
Console.WriteLine($"Loading config file from: {jsonPath}");
string json = File.ReadAllText(jsonPath);
ConnectionInfoEX connection;
try
{
connection = JsonConvert.DeserializeObject<ConnectionInfoEX>(json);
}
catch (JsonReaderException e)
{
throw new IOException(e.Message);
}
//check if Json has UserName
if (connection?.UserName != null)
{
connection.Password = PasswordPrompt(PASSWORD_TYPE.AMT_USER.ToString());
}
//check if Proxy param was provided
if (connection?.Proxy != null)
{
connection.Proxy.Password = PasswordPrompt(PASSWORD_TYPE.PROXY.ToString());
}
//check if RedirectionProxy param was provided
if (connection?.RedirectionProxy != null)
{
connection.RedirectionProxy.Password = PasswordPrompt(PASSWORD_TYPE.REDIRECTION_PROXY.ToString());
}
return connection;
}
/// <summary>
/// Prompts for Password, does not display the password on the console, and returns a Secure String password
/// </summary>
/// <returns></returns>
public static SecureString PasswordPrompt(string passwordType)
{
SecureString secPass = new SecureString();
Console.WriteLine($"Please enter {passwordType} password:");
ConsoleKeyInfo nextPassKey = Console.ReadKey(true);
while (nextPassKey.Key != ConsoleKey.Enter)
{
if (nextPassKey.Key == ConsoleKey.Backspace)
{
if (secPass.Length > 0)
{
secPass.RemoveAt(secPass.Length - 1);
Console.Write("\b \b");
}
}
else
{
secPass.AppendChar(nextPassKey.KeyChar);
Console.Write('*');
}
nextPassKey = Console.ReadKey(true);
}
secPass.MakeReadOnly();
Console.Write('\n');
return secPass;
}
#endregion
}
}