diff --git a/Pepperdash Core/Pepperdash Core/PasswordManager/Config.cs b/Pepperdash Core/Pepperdash Core/PasswordManagement/Config.cs similarity index 66% rename from Pepperdash Core/Pepperdash Core/PasswordManager/Config.cs rename to Pepperdash Core/Pepperdash Core/PasswordManagement/Config.cs index c783113..82f1714 100644 --- a/Pepperdash Core/Pepperdash Core/PasswordManager/Config.cs +++ b/Pepperdash Core/Pepperdash Core/PasswordManagement/Config.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using Crestron.SimplSharp; -namespace PepperDash.Core.PasswordManager +namespace PepperDash.Core.PasswordManagement { // Example JSON password configuration object //{ @@ -13,7 +13,7 @@ namespace PepperDash.Core.PasswordManager // { // "key": "Password01", // "name": "Technician Password", - // "enable": true, + // "enabled": true, // "password": "1988" // } // ] @@ -36,18 +36,38 @@ namespace PepperDash.Core.PasswordManager /// /// Password object enabled /// - public bool enable { get; set; } + public bool enabled { get; set; } + /// + /// + /// + public ushort simplEnabled + { + get { return (ushort)(enabled ? 1 : 0); } + set { enabled = Convert.ToBoolean(value); } + } /// /// Password object configured password /// public string password { get; set; } - + /// + /// Password type + /// + private int type { get; set; } + /// + /// Password Type for S+ + /// + public ushort simplType + { + get { return Convert.ToUInt16(type); } + set { type = value; } + } /// /// Constructor /// public PasswordConfig() { - + simplEnabled = 0; + simplType = 0; } } @@ -63,7 +83,7 @@ namespace PepperDash.Core.PasswordManager /// public GlobalConfig() { - + } } diff --git a/Pepperdash Core/Pepperdash Core/PasswordManagement/Constants.cs b/Pepperdash Core/Pepperdash Core/PasswordManagement/Constants.cs new file mode 100644 index 0000000..9319b7b --- /dev/null +++ b/Pepperdash Core/Pepperdash Core/PasswordManagement/Constants.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; + +namespace PepperDash.Core.PasswordManagement +{ + /// + /// Constants + /// + public class PasswordManagementConstants + { + /// + /// Generic boolean value change constant + /// + public const ushort BoolValueChange = 1; + /// + /// Evaluated boolean change constant + /// + public const ushort BoolEvaluatedChange = 2; + /// + /// Password is valid change constant + /// + public const ushort PasswordIsValid = 3; + /// + /// Password is invalid change constant + /// + public const ushort PasswordIsInvalid = 4; + /// + /// Password LED change constant + /// + public const ushort PasswordLedChange = 5; + + /// + /// Generic ushort value change constant + /// + public const ushort UshrtValueChange = 101; + /// + /// Password count + /// + public const ushort PasswordListCount = 102; + /// + /// Password length + /// + public const ushort SelectedPasswordLength = 103; + /// + /// Password to validate length + /// + public const ushort UserEnteredPasswordLength = 104; + + /// + /// Generic string value change constant + /// + public const ushort StringValueChange = 201; + /// + /// Password key change constant + /// + public const ushort PasswordKey = 202; + /// + /// Password selected key change constant + /// + public const ushort PasswordKeySelected = 203; + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordClient.cs b/Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordClient.cs new file mode 100644 index 0000000..7d3d254 --- /dev/null +++ b/Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordClient.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; + +namespace PepperDash.Core.PasswordManagement +{ + public class PasswordClient + { + /// + /// Password Client + /// + public PasswordConfig Client { get; set; } + /// + /// Used to build the password entered by the user + /// + public string PasswordToValidate { get; set; } + + /// + /// Boolean event + /// + public event EventHandler BoolChange; + /// + /// Ushort event + /// + public event EventHandler UshrtChange; + /// + /// String event + /// + public event EventHandler StringChange; + + /// + /// Constructor + /// + public PasswordClient() + { + + } + + /// + /// Initialize method + /// + /// + public void Initialize(string key) + { + OnBoolChange(false, 0, PasswordManagementConstants.BoolEvaluatedChange); + + Client = new PasswordConfig(); + PasswordToValidate = ""; + + // there has to be a better way to get the index of the current index of password + ushort i = 0; + foreach (var password in PasswordManager.Passwords) + { + i++; + OnStringChange(password.key, i, PasswordManagementConstants.PasswordKey); + } + + OnBoolChange(true, 0, PasswordManagementConstants.BoolEvaluatedChange); + } + + /// + /// Retrieves password by key + /// + /// + public void GetPasswordByKey(string key) + { + if (string.IsNullOrEmpty(key)) + { + Debug.Console(1, "PassowrdClient.GetPasswordByKey failed:\rKey {0} is null or empty", key); + return; + } + + PasswordConfig password = PasswordManager.Passwords.FirstOrDefault(p => p.key.Equals(key)); + if (password == null) + { + OnUshrtChange(0, 0, PasswordManagementConstants.SelectedPasswordLength); + return; + } + + Client = password; + OnUshrtChange((ushort)Client.password.Length, 0, PasswordManagementConstants.SelectedPasswordLength); + OnStringChange(Client.key, 0, PasswordManagementConstants.PasswordKeySelected); + } + + /// + /// Password validation method + /// + /// + public void ValidatePassword(string password) + { + if (string.IsNullOrEmpty(password)) + return; + + if (string.Equals(Client.password, password)) + { + OnBoolChange(true, 0, PasswordManagementConstants.PasswordIsValid); + } + else + { + OnBoolChange(true, 0, PasswordManagementConstants.PasswordIsInvalid); + } + + + OnBoolChange(false, 0, PasswordManagementConstants.PasswordIsValid); + OnBoolChange(false, 0, PasswordManagementConstants.PasswordIsInvalid); + + ClearPassword(); + } + + /// + /// Builds the user entered passwrod string, will attempt to validate the user entered + /// password against the selected password when the length of the 2 are equal + /// + /// + public void BuildPassword(string data) + { + PasswordToValidate = String.Concat(PasswordToValidate, data); + OnBoolChange(true, (ushort)PasswordToValidate.Length, PasswordManagementConstants.PasswordLedChange); + + if (PasswordToValidate.Length == Client.password.Length) + ValidatePassword(PasswordToValidate); + } + + /// + /// Clears the user entered password and resets the LEDs + /// + public void ClearPassword() + { + PasswordToValidate = ""; + OnBoolChange(true, (ushort)PasswordToValidate.Length, PasswordManagementConstants.PasswordLedChange); + + for(var i = 1; i <= Client.password.Length; i++) + OnBoolChange(false, (ushort)i, PasswordManagementConstants.PasswordLedChange); + } + + /// + /// Protected boolean change event handler + /// + /// + /// + /// + protected void OnBoolChange(bool state, ushort index, ushort type) + { + var handler = BoolChange; + if (handler != null) + { + var args = new BoolChangeEventArgs(state, type); + args.Index = index; + BoolChange(this, args); + } + } + + /// + /// Protected ushort change event handler + /// + /// + /// + /// + protected void OnUshrtChange(ushort value, ushort index, ushort type) + { + var handler = UshrtChange; + if (handler != null) + { + var args = new UshrtChangeEventArgs(value, type); + args.Index = index; + UshrtChange(this, args); + } + } + + /// + /// Protected string change event handler + /// + /// + /// + /// + protected void OnStringChange(string value, ushort index, ushort type) + { + var handler = StringChange; + if (handler != null) + { + var args = new StringChangeEventArgs(value, type); + args.Index = index; + StringChange(this, args); + } + } + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/PasswordManager/PasswordManager.cs b/Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordManager.cs similarity index 75% rename from Pepperdash Core/Pepperdash Core/PasswordManager/PasswordManager.cs rename to Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordManager.cs index e31ba00..15d0d5f 100644 --- a/Pepperdash Core/Pepperdash Core/PasswordManager/PasswordManager.cs +++ b/Pepperdash Core/Pepperdash Core/PasswordManagement/PasswordManager.cs @@ -7,14 +7,14 @@ using Newtonsoft.Json.Linq; using Crestron.SimplSharp; using PepperDash.Core.JsonToSimpl; -namespace PepperDash.Core.PasswordManager +namespace PepperDash.Core.PasswordManagement { - public class PasswordManager : IKeyed + public class PasswordManager { - public string Key { get; set; } - - public List Passwords { get; set; } - + /// + /// List of passwords configured + /// + public static List Passwords = new List(); /// /// Boolean event /// @@ -33,7 +33,7 @@ namespace PepperDash.Core.PasswordManager /// public PasswordManager() { - + Passwords.Clear(); } /// @@ -43,7 +43,7 @@ namespace PepperDash.Core.PasswordManager /// public void Initialize(string uniqueId, string key) { - OnBoolChange(false, 0, PasswordManagerConstants.BoolEvaluatedChange); + OnBoolChange(false, 0, PasswordManagementConstants.BoolEvaluatedChange); try { @@ -53,8 +53,6 @@ namespace PepperDash.Core.PasswordManager return; } - Key = key; - JsonToSimplMaster master = J2SGlobal.GetMasterByFile(uniqueId); if(master == null) { @@ -64,25 +62,31 @@ namespace PepperDash.Core.PasswordManager var passwords = master.JsonObject.ToObject().global.passwords; if(passwords == null) - { + { Debug.Console(1, "PasswordManager.Initialize failed:\rCould not find password object"); return; } foreach(var password in passwords) { - AddPassword(password); + if (password != null) + { + Debug.Console(1, "PasswordManager.Initialize: {0}, {1}, {2}, {3}, {4}", password.key, password.name, password.simplEnabled, password.simplType, password.password); + AddPassword(password); + } } + + OnUshrtChange(Convert.ToUInt16(Passwords.Count), 0, PasswordManagementConstants.PasswordListCount); } catch(Exception e) { - var msg = string.Format("PasswordManager.Initialize({0}, {1}) failed:\r{2}", uniqueId, Key, e.Message); + var msg = string.Format("PasswordManager.Initialize({0}, {1}) failed:\r{2}", uniqueId, key, e.Message); CrestronConsole.PrintLine(msg); ErrorLog.Error(msg); } finally { - OnBoolChange(true, 0, PasswordManagerConstants.BoolEvaluatedChange); + OnBoolChange(true, 0, PasswordManagementConstants.BoolEvaluatedChange); } } @@ -95,7 +99,9 @@ namespace PepperDash.Core.PasswordManager if (password == null) return; - RemovePassword(password); + var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key)); + if (item != null) + Passwords.Remove(item); Passwords.Add(password); } @@ -108,7 +114,7 @@ namespace PepperDash.Core.PasswordManager if (password == null) return; - var item = Passwords.FirstOrDefault(p => p.key.Equals(password.key)); + var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key)); if (item != null) Passwords.Remove(item); } diff --git a/Pepperdash Core/Pepperdash Core/PasswordManager/Constants.cs b/Pepperdash Core/Pepperdash Core/PasswordManager/Constants.cs deleted file mode 100644 index a85349e..0000000 --- a/Pepperdash Core/Pepperdash Core/PasswordManager/Constants.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; - -namespace PepperDash.Core.PasswordManager -{ - /// - /// Constants - /// - public class PasswordManagerConstants - { - /// - /// Generic boolean value change constant - /// - public const ushort BoolValueChange = 1; - /// - /// Evaluated boolean change constant - /// - public const ushort BoolEvaluatedChange = 2; - - /// - /// Generic ushort value change constant - /// - public const ushort UshrtValueChange = 101; - - /// - /// Generic string value change constant - /// - public const ushort StringValueChange = 201; - } -} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj index 4e6bc43..1d98c97 100644 --- a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj +++ b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj @@ -110,9 +110,10 @@ - - - + + + +