using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Crestron.SimplSharp; using PepperDash.Core.JsonToSimpl; using PepperDash.Core.JsonStandardObjects; namespace PepperDash.Core.PasswordManagement { public class PasswordManager { /// /// List of passwords configured /// public static Dictionary Passwords = new Dictionary(); private Dictionary TempPasswords = new Dictionary(); CTimer UpdateTimer; public long UpdateTimerElapsedMs = 5000; /// /// Boolean event /// public event EventHandler BoolChange; /// /// Ushort event /// public event EventHandler UshrtChange; /// /// String event /// public event EventHandler StringChange; /// /// Constructor /// public PasswordManager() { Passwords.Clear(); } /// /// Initialize method /// /// /// //public void Initialize(string uniqueId, string key) //{ // OnBoolChange(false, 0, PasswordManagementConstants.BoolEvaluatedChange); // try // { // if(string.IsNullOrEmpty(uniqueId) || string.IsNullOrEmpty(key)) // { // Debug.Console(1, "PasswordManager.Initialize({0}, {1}) null or empty parameters", uniqueId, key); // return; // } // JsonToSimplMaster master = J2SGlobal.GetMasterByFile(uniqueId); // if(master == null) // { // Debug.Console(1, "PassowrdManager.Initialize failed:\rCould not find JSON file with uniqueID {0}", uniqueId); // return; // } // var global = master.JsonObject.ToObject().global; // var passwords = global.passwords; // if(passwords == null) // { // Debug.Console(1, "PasswordManager.Initialize failed:\rCould not find password object"); // return; // } // foreach(var password in passwords) // { // if (password != null) // { // var index = passwords.IndexOf(password); // password.path = string.Format("global.passwords[{0}]", index); // Debug.Console(1, "PasswordManager.Initialize: {0}, {1}, {2}, {3}, {4}, {5}", password.key, password.name, password.simplEnabled, password.simplType, password.password, password.path); // //AddPassword(password); // OnStringChange(password.path, (ushort)index, PasswordManagementConstants.FullPathToPassword); // OnStringChange(password.key, (ushort)index, PasswordManagementConstants.PasswordKey); // } // } // 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); // CrestronConsole.PrintLine(msg); // ErrorLog.Error(msg); // } // finally // { // OnBoolChange(true, 0, PasswordManagementConstants.BoolEvaluatedChange); // } //} /// /// Adds password to the list /// /// //private void AddPassword(PasswordConfig password) //{ // if (password == null) // return; // var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key)); // if (item != null) // Passwords.Remove(item); // Passwords.Add(password); // Passwords.Sort((x, y) => string.Compare(x.key, y.key)); //} /// /// Removes password from the list /// /// //private void RemovePassword(PasswordConfig password) //{ // if (password == null) // return; // var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key)); // if (item != null) // Passwords.Remove(item); //} /// /// Updates password stored in the dictonary /// /// /// /// public void UpdatePassword(ushort key, string password) { if (string.IsNullOrEmpty(password)) return; var pw = TempPasswords[key]; if (pw == null) { pw = new PasswordConfig(); } pw.password = password; if (UpdateTimer == null) { // (o) => SavePasswords removes the need to create a callback method that takes in an object UpdateTimer = new CTimer((o) => StorePassword(), UpdateTimerElapsedMs); } else { UpdateTimer.Reset(); } } /// /// Stores the updated passwords in TempPassword in the Passwords dictionary /// private void StorePassword() { UpdateTimer.Stop(); foreach (var tempPw in TempPasswords) { Passwords[tempPw.Key] = tempPw.Value; } TempPasswords.Clear(); } /// /// 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); } } } }