mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 20:54:55 +00:00
@@ -85,96 +85,79 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
var wrapper = new DeviceFactoryWrapper() { CType = cType, Description = description, FactoryMethod = method };
|
var wrapper = new DeviceFactoryWrapper() { CType = cType, Description = description, FactoryMethod = method };
|
||||||
DeviceFactory.FactoryMethods.Add(typeName, wrapper);
|
DeviceFactory.FactoryMethods.Add(typeName, wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private static void CheckForSecrets(IEnumerable<JProperty> obj)
|
||||||
/// The factory method for Core "things". Also iterates the Factory methods that have
|
{
|
||||||
/// been loaded from plugins
|
foreach (var prop in obj.Where(prop => prop.Value as JObject != null))
|
||||||
/// </summary>
|
{
|
||||||
/// <param name="dc"></param>
|
if (prop.Name.ToLower() == "secret")
|
||||||
/// <returns></returns>
|
{
|
||||||
public static IKeyed GetDevice(DeviceConfig dc)
|
var secret = GetSecret(JsonConvert.DeserializeObject<SecretsPropertiesConfig>(prop.Children().First().ToString()));
|
||||||
{
|
prop.Parent.Replace(secret);
|
||||||
try
|
}
|
||||||
{
|
var recurseProp = prop.Value as JObject;
|
||||||
|
if (recurseProp == null) return;
|
||||||
|
CheckForSecrets(recurseProp.Properties());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetSecret(SecretsPropertiesConfig data)
|
||||||
|
{
|
||||||
|
var secretProvider = SecretsManager.GetSecretProviderByKey(data.Provider);
|
||||||
|
if (secretProvider == null) return null;
|
||||||
|
var secret = secretProvider.GetSecret(data.Key);
|
||||||
|
if (secret != null) return (string) secret.Value;
|
||||||
|
Debug.Console(1,
|
||||||
|
"Unable to retrieve secret {0}{1} - Make sure you've added it to the secrets provider",
|
||||||
|
data.Provider, data.Key);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The factory method for Core "things". Also iterates the Factory methods that have
|
||||||
|
/// been loaded from plugins
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dc"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static
|
||||||
|
IKeyed GetDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading '{0}' from Essentials Core", dc.Type);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading '{0}' from Essentials Core", dc.Type);
|
||||||
|
|
||||||
var localDc = new DeviceConfig(dc);
|
var localDc = new DeviceConfig(dc);
|
||||||
|
|
||||||
var key = localDc.Key;
|
var key = localDc.Key;
|
||||||
var name = localDc.Name;
|
var name = localDc.Name;
|
||||||
var type = localDc.Type;
|
var type = localDc.Type;
|
||||||
var properties = localDc.Properties;
|
var properties = localDc.Properties;
|
||||||
//var propRecurse = properties;
|
//var propRecurse = properties;
|
||||||
|
|
||||||
var typeName = localDc.Type.ToLower();
|
var typeName = localDc.Type.ToLower();
|
||||||
|
|
||||||
|
|
||||||
|
var jObject = properties as JObject;
|
||||||
|
if (jObject != null)
|
||||||
|
{
|
||||||
|
var jProp = jObject.Properties();
|
||||||
|
|
||||||
|
CheckForSecrets(jProp);
|
||||||
|
}
|
||||||
|
|
||||||
Debug.Console(2, "typeName = {0}", typeName);
|
Debug.Console(2, "typeName = {0}", typeName);
|
||||||
// Check for types that have been added by plugin dlls.
|
// Check for types that have been added by plugin dlls.
|
||||||
if (!FactoryMethods.ContainsKey(typeName)) return null;
|
return !FactoryMethods.ContainsKey(typeName) ? null : FactoryMethods[typeName].FactoryMethod(localDc);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Issue with getting device - {0}", ex.Message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*foreach (var obj in (propRecurse as JObject).FindTokens("secret").OfType<JObject>())
|
|
||||||
{
|
|
||||||
Debug.Console(2, obj.ToString());
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
//look for secret in username
|
|
||||||
var userSecretToken = properties["control"]["tcpSshProperties"]["username"]["secret"];
|
|
||||||
|
|
||||||
if (userSecretToken != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Found a secret for {0} - attempting to retrieve it!", name);
|
|
||||||
var userSecretResult =
|
|
||||||
JsonConvert.DeserializeObject<SecretsPropertiesConfig>(userSecretToken.ToString());
|
|
||||||
var userProvider = SecretsManager.GetSecretProviderByKey(userSecretResult.Provider);
|
|
||||||
if (userProvider != null)
|
|
||||||
{
|
|
||||||
var user = userProvider.GetSecret(userSecretResult.Key);
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1,
|
|
||||||
"Unable to retrieve secret for {0} - Make sure you've added it to the secrets provider");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
properties["control"]["tcpSshProperties"]["username"] = (string) user.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//look for secret in password
|
|
||||||
var passwordSecretToken = properties["control"]["tcpSshProperties"]["password"]["secret"];
|
|
||||||
|
|
||||||
if (passwordSecretToken != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Found a secret for {0} - attempting to retrieve it!", name);
|
|
||||||
|
|
||||||
var passwordSecretResult =
|
|
||||||
JsonConvert.DeserializeObject<SecretsPropertiesConfig>(passwordSecretToken.ToString());
|
|
||||||
var passwordProvider = SecretsManager.GetSecretProviderByKey(passwordSecretResult.Provider);
|
|
||||||
if (passwordProvider != null)
|
|
||||||
{
|
|
||||||
var password = passwordProvider.GetSecret(passwordSecretResult.Key);
|
|
||||||
if (password == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1,
|
|
||||||
"Unable to retrieve secret for {0} - Make sure you've added it to the secrets provider");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
properties["control"]["tcpSshProperties"]["password"] = (string)password.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, "{0}", localDc.Properties.ToString());
|
|
||||||
|
|
||||||
return FactoryMethods[typeName].FactoryMethod(localDc);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Issue with getting device - {0}", ex.Message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prints the type names and associated metadata from the FactoryMethods collection.
|
/// Prints the type names and associated metadata from the FactoryMethods collection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -25,7 +25,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set secret for item in the CrestronSecretsProvider
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">Secret Key</param>
|
||||||
|
/// <param name="value">Secret Value</param>
|
||||||
public void SetSecret(string key, object value)
|
public void SetSecret(string key, object value)
|
||||||
{
|
{
|
||||||
var secret = value as string;
|
var secret = value as string;
|
||||||
@@ -34,7 +38,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(2, this, "Unable to set secret for {0}:{1} - value is empty.", Key, key);
|
Debug.Console(2, this, "Unable to set secret for {0}:{1} - value is empty.", Key, key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Debug.Console(2, this, "Attempting to set Secret to {0}", secret);
|
|
||||||
var setErrorCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
|
var setErrorCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
|
||||||
switch (setErrorCode)
|
switch (setErrorCode)
|
||||||
{
|
{
|
||||||
@@ -47,6 +50,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve secret for item in the CrestronSecretsProvider
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">Secret Key</param>
|
||||||
|
/// <returns>ISecret Object containing key, provider, and value</returns>
|
||||||
public ISecret GetSecret(string key)
|
public ISecret GetSecret(string key)
|
||||||
{
|
{
|
||||||
string mySecret;
|
string mySecret;
|
||||||
@@ -56,7 +64,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
||||||
Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
|
Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
|
||||||
Debug.Console(2, this, "Retreived Secret = {0}", mySecret);
|
|
||||||
return new CrestronSecret(key, mySecret, this);
|
return new CrestronSecret(key, mySecret, this);
|
||||||
default:
|
default:
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
|
Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
|
||||||
@@ -66,6 +73,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Special container class for CrestronSecret provider
|
||||||
|
/// </summary>
|
||||||
public class CrestronSecret : ISecret
|
public class CrestronSecret : ISecret
|
||||||
{
|
{
|
||||||
public ISecretProvider Provider { get; private set; }
|
public ISecretProvider Provider { get; private set; }
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// All ISecrecretProvider classes must implement this interface.
|
||||||
|
/// </summary>
|
||||||
public interface ISecretProvider : IKeyed
|
public interface ISecretProvider : IKeyed
|
||||||
{
|
{
|
||||||
void SetSecret(string key, object value);
|
void SetSecret(string key, object value);
|
||||||
@@ -9,6 +12,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
ISecret GetSecret(string key);
|
ISecret GetSecret(string key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// interface for delivering secrets in Essentials.
|
||||||
|
/// </summary>
|
||||||
public interface ISecret
|
public interface ISecret
|
||||||
{
|
{
|
||||||
ISecretProvider Provider { get; }
|
ISecretProvider Provider { get; }
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
public static List<ISecretProvider> Secrets { get; set; }
|
public static List<ISecretProvider> Secrets { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize the SecretsManager
|
||||||
|
/// </summary>
|
||||||
public static void Initialize()
|
public static void Initialize()
|
||||||
{
|
{
|
||||||
Secrets = new List<ISecretProvider> {new CrestronSecretsProvider("default")};
|
Secrets = new List<ISecretProvider> {new CrestronSecretsProvider("default")};
|
||||||
@@ -30,6 +33,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method to return a ISecretProvider to Set, Get, and Delete Secrets
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">Secret Provider Key</param>
|
||||||
|
/// <returns></returns>
|
||||||
public static ISecretProvider GetSecretProviderByKey(string key)
|
public static ISecretProvider GetSecretProviderByKey(string key)
|
||||||
{
|
{
|
||||||
var secret = Secrets.FirstOrDefault(o => o.Key == key);
|
var secret = Secrets.FirstOrDefault(o => o.Key == key);
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ using Newtonsoft.Json;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provide a way to easily deserialize into a secret object from config
|
||||||
|
/// </summary>
|
||||||
public class SecretsPropertiesConfig
|
public class SecretsPropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("provider")]
|
[JsonProperty("provider")]
|
||||||
|
|||||||
Reference in New Issue
Block a user