using System; using System.Collections.Generic; using System.Linq; using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Core.Util; using Microsoft.Win32; namespace Aitex.Core.RT.Key { public class KeyManager : Singleton { public const string KeyTag = "Jet"; public const string RegistryKey = "SOFTWARE\\Jet\\Keys"; private PeriodicJob _thread; private Dictionary _historyKeys = new Dictionary(); private object _locker = new object(); private DeviceTimer _timer0Days = new DeviceTimer(); private R_TRIG _trig0Days = new R_TRIG(); private DeviceTimer _timer3Days = new DeviceTimer(); private R_TRIG _trig3Days = new R_TRIG(); private DeviceTimer _timer7Days = new DeviceTimer(); private R_TRIG _trig7Days = new R_TRIG(); private DeviceTimer _timer15Days = new DeviceTimer(); private R_TRIG _trig15Days = new R_TRIG(); public string LocalMachineCode { get; private set; } public bool IsExpired => false; public int LeftDays { get { if (IsExpired) { return 0; } return (ExpireDateTime - CurrentDateTime).Days; } } public DateTime CurrentDateTime => DateTime.Now; public DateTime ExpireDateTime => LastRegisterDateTime + new TimeSpan(LastRegisterDays, 0, 0, 0); public DateTime LastRegisterDateTime { get; set; } public int LastRegisterDays { get; set; } public void Initialize() { LocalMachineCode = new MachineCoder().CreateCode(); UpdateLicenseInformation(); _thread = new PeriodicJob(1000, OnTimer, "Register Key Thread", isStartNow: true); } private void UpdateLicenseInformation() { try { RegistryKey currentUser = Registry.CurrentUser; RegistryKey registryKey = currentUser.OpenSubKey("SOFTWARE\\Jet\\Keys", writable: true); if (registryKey == null) { registryKey = currentUser.CreateSubKey("SOFTWARE\\Jet\\Keys"); } if (registryKey == null) { throw new ApplicationException("注册表操作失败,无法进行软件授权操作.\r\n请确保用管理员权限运行程序."); } string[] subKeyNames = registryKey.GetSubKeyNames(); foreach (string text in subKeyNames) { RegistryKey registryKey2 = registryKey.OpenSubKey(text); _historyKeys.Add(text, (string)registryKey2.GetValue("Key")); } if (_historyKeys.Count == 0) { if (!Register(7, "---", out var reason)) { throw new ApplicationException(reason); } return; } List list = _historyKeys.Keys.ToList(); list.Sort(); string text2 = list.Last(); RegistryKey registryKey3 = registryKey.OpenSubKey(text2); LastRegisterDateTime = new DateTime(int.Parse(text2.Substring(0, 4)), int.Parse(text2.Substring(4, 2)), int.Parse(text2.Substring(6, 2)), int.Parse(text2.Substring(8, 2)), int.Parse(text2.Substring(10, 2)), int.Parse(text2.Substring(12, 2))); LastRegisterDays = int.Parse(registryKey3.GetValue("Days").ToString()); } catch (Exception ex) { throw new ApplicationException(ex.Message); } } private bool OnTimer() { try { _trig0Days.CLK = IsExpired; _trig3Days.CLK = LeftDays <= 3 && !IsExpired; _trig7Days.CLK = LeftDays <= 7 && LeftDays > 3; _trig15Days.CLK = LeftDays <= 15 && LeftDays > 7; if (_trig0Days.M) { if (_trig0Days.Q) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software expired at {ExpireDateTime.ToString()} "); _timer0Days.Start(3600000.0); } if (_timer0Days.IsTimeout()) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software expired at {ExpireDateTime.ToString()} "); _timer0Days.Start(3600000.0); } } if (_trig3Days.M) { if (_trig3Days.Q) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()} "); _timer3Days.Start(10800000.0); } if (_timer3Days.IsTimeout()) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()}"); _timer3Days.Start(10800000.0); } } if (_trig7Days.M) { if (_trig7Days.Q) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()} "); _timer7Days.Start(28800000.0); } if (_timer7Days.IsTimeout()) { EV.PostMessage("System", EventEnum.DefaultWarning, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()}"); _timer7Days.Start(28800000.0); } } if (_trig15Days.M) { if (_trig15Days.Q) { EV.PostMessage("System", EventEnum.GeneralInfo, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()} "); _timer15Days.Start(28800000.0); } if (_timer15Days.IsTimeout()) { EV.PostMessage("System", EventEnum.GeneralInfo, $"Software will be expired in {LeftDays} days, at {ExpireDateTime.ToString()}"); _timer15Days.Start(28800000.0); } } } catch (Exception ex) { LOG.Write(ex); } return true; } private bool Register(int days, string key, out string reason) { try { if (_historyKeys.ContainsValue(key)) { reason = "注册码已经使用," + key; LOG.Write(reason); return false; } if (days < 0) { reason = "授权天数无效," + days; LOG.Write(reason); return false; } RegistryKey currentUser = Registry.CurrentUser; RegistryKey registryKey = currentUser.OpenSubKey("SOFTWARE\\Jet\\Keys", writable: true); if (registryKey == null) { registryKey = currentUser.CreateSubKey("SOFTWARE\\Jet\\Keys"); } if (registryKey == null) { reason = "注册表操作失败,无法进行软件授权操作.\r\n请确保用管理员权限运行程序."; LOG.Write(reason); return false; } DateTime currentDateTime = CurrentDateTime; string text = currentDateTime.ToString("yyyyMMddHHmmss"); RegistryKey registryKey2 = registryKey.CreateSubKey(text); registryKey2.SetValue("Date", text); registryKey2.SetValue("Key", key); registryKey2.SetValue("Days", days.ToString()); registryKey.Close(); _historyKeys.Add(text, key); LastRegisterDateTime = currentDateTime; LastRegisterDays = days; } catch (Exception ex) { reason = "注册码无效," + ex; LOG.Write(reason); return false; } reason = "注册成功"; return true; } public bool Register(string key, out string reason) { reason = string.Empty; RsaCryption rsaCryption = new RsaCryption(); string empty = string.Empty; try { empty = rsaCryption.RSADecrypt("1grdIZdLFrqRjlFbuk+wXWQeJaKOXsAlKOyFJYNo8wFUHDtOJMaKpdeYtmwtn/ZhvEP+dDWgKGYx+oIAFhF0A8BMrtTkhSeJXJvYbrWa1ObYayvjNTx49bC7xX/c+woWOJvwsllb1s04m2dvTpZUsC6aI3hDvRWPjT8GJglMJjU=AQAB

+5fBfLc7nfej2BoQH/sKMBxfu6K+dtTdIB1vBo8OTtxfqKoxNgzv0KtcZBoWZzBlG1yv8/Z+sAMV0Xh94O4Qow==

2cq3iRRkJEnxE9NdZ+FyUXuFdbBAj8CTdy+xETRq3YrJBxm4SY7JRwbADyxXJ3zTzH+0wC+apaji9SbuTrfjRw==ARkScRbjnbbc8i5674jK7JbTHCCDsEURifhW6bJqH5H6oOPNPy0jRsfYqV8rxduCNXJcGjZzKxV4XOentPmU/Q==d1ozaIjnNEfdOJstZf9TkbnacptrVhwX9EoLhD0wj0Y+UojSyGTagvT9DZOkE3zB6SDXIjc0TbKW5fg2wqbdgw==k/kPJ2Yo5nItIDvCjOIK2q0XulYDYqJmCHO/PopslpQ2nMBhO7f5SL9j9FAEpotvpmXH3RVQ1txk1SO3EncDkg==OYsUJhq5ijPAPAWtZmpUHNd0r2ODaP+5PcZQiWRJy8LYrPpYqNRjo/BRUwHERlQDtIyHFRDxrMrEtvdKNKSejoFsU+kIZWuUH6AwytFUcglOjnZtXNWiBD9xGrDg4qQJk3tIEvtPhe0uamUTtGPNZuiyzF2HJmXJNjokS+SypKU=
", key); } catch (Exception ex) { reason = "注册码无效"; LOG.Write(ex); return false; } string[] array = empty.Split(','); int result = 0; if (array.Length == 3 && array[0] == "Jet" && array[1] == LocalMachineCode && int.TryParse(array[2], out result)) { return Register(result, key, out reason); } LOG.Error("注册码无效," + empty); reason = "注册码无效"; return false; } } }