diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs
index cb7dd0b7..66bf5d2b 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs
@@ -85,96 +85,79 @@ namespace PepperDash.Essentials.Core
var wrapper = new DeviceFactoryWrapper() { CType = cType, Description = description, FactoryMethod = method };
DeviceFactory.FactoryMethods.Add(typeName, wrapper);
- }
-
- ///
- /// The factory method for Core "things". Also iterates the Factory methods that have
- /// been loaded from plugins
- ///
- ///
- ///
- public static IKeyed GetDevice(DeviceConfig dc)
- {
- try
- {
+ }
+
+ private static void CheckForSecrets(IEnumerable obj)
+ {
+ foreach (var prop in obj.Where(prop => prop.Value as JObject != null))
+ {
+ if (prop.Name.ToLower() == "secret")
+ {
+ var secret = GetSecret(JsonConvert.DeserializeObject(prop.Children().First().ToString()));
+ prop.Parent.Replace(secret);
+ }
+ 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;
+ }
+
+
+ ///
+ /// The factory method for Core "things". Also iterates the Factory methods that have
+ /// been loaded from plugins
+ ///
+ ///
+ ///
+ public static
+ IKeyed GetDevice(DeviceConfig dc)
+ {
+ try
+ {
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 name = localDc.Name;
- var type = localDc.Type;
+ var key = localDc.Key;
+ var name = localDc.Name;
+ var type = localDc.Type;
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);
- // Check for types that have been added by plugin dlls.
- if (!FactoryMethods.ContainsKey(typeName)) return null;
+ // Check for types that have been added by plugin dlls.
+ 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())
- {
- 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(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(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;
- }
- }
-
///
/// Prints the type names and associated metadata from the FactoryMethods collection.
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs
index 54a3f3c8..87dddea7 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs
@@ -25,7 +25,11 @@ namespace PepperDash.Essentials.Core
}
-
+ ///
+ /// Set secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// Secret Value
public void SetSecret(string key, object value)
{
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);
return;
}
- Debug.Console(2, this, "Attempting to set Secret to {0}", secret);
var setErrorCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
switch (setErrorCode)
{
@@ -47,6 +50,11 @@ namespace PepperDash.Essentials.Core
}
}
+ ///
+ /// Retrieve secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// ISecret Object containing key, provider, and value
public ISecret GetSecret(string key)
{
string mySecret;
@@ -56,7 +64,6 @@ namespace PepperDash.Essentials.Core
{
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
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);
default:
Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
@@ -66,6 +73,9 @@ namespace PepperDash.Essentials.Core
}
}
+ ///
+ /// Special container class for CrestronSecret provider
+ ///
public class CrestronSecret : ISecret
{
public ISecretProvider Provider { get; private set; }
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
index 51b0b389..86ae65cf 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core
{
+ ///
+ /// All ISecrecretProvider classes must implement this interface.
+ ///
public interface ISecretProvider : IKeyed
{
void SetSecret(string key, object value);
@@ -9,6 +12,9 @@ namespace PepperDash.Essentials.Core
ISecret GetSecret(string key);
}
+ ///
+ /// interface for delivering secrets in Essentials.
+ ///
public interface ISecret
{
ISecretProvider Provider { get; }
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
index c14bfdc6..f50051da 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
@@ -11,6 +11,9 @@ namespace PepperDash.Essentials.Core
{
public static List Secrets { get; set; }
+ ///
+ /// Initialize the SecretsManager
+ ///
public static void Initialize()
{
Secrets = new List {new CrestronSecretsProvider("default")};
@@ -30,6 +33,11 @@ namespace PepperDash.Essentials.Core
}
+ ///
+ /// Method to return a ISecretProvider to Set, Get, and Delete Secrets
+ ///
+ /// Secret Provider Key
+ ///
public static ISecretProvider GetSecretProviderByKey(string key)
{
var secret = Secrets.FirstOrDefault(o => o.Key == key);
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsPropertiesConfig.cs
index b17b9000..68026aa1 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsPropertiesConfig.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsPropertiesConfig.cs
@@ -7,6 +7,9 @@ using Newtonsoft.Json;
namespace PepperDash.Essentials.Core
{
+ ///
+ /// Provide a way to easily deserialize into a secret object from config
+ ///
public class SecretsPropertiesConfig
{
[JsonProperty("provider")]