internal static void InitAssets(TheBaseApplication pApp) { if (IsInitialized) { return; } IsInitialized = true; if (MyServiceHostInfo == null || !(MySecrets?.IsApplicationIDValid() == true)) { MasterSwitch = false; return; } MyApplication = pApp; #region step 1: Moved from StartApplication to here as all the following code is updating TheBaseAssets //The following section are "app.config" only settings required before cdeTPI is loaded. These settings cannot be set via the Provisioning Service int delay = TheCommonUtils.CInt(MySettings.GetSetting("StartupDelay")); if (delay > 0) { TheCommonUtils.SleepOneEye((uint)(delay * 1000), 100); } string temp = MySettings.GetSetting("AllowEnvironmentVarsToOverrideConfig"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.AllowEnvironmentVarsToOverrideConfig = TheCommonUtils.CBool(temp); } temp = MySettings.GetSetting("AllowEnvironmentVars"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.AllowEnvironmentVars = TheCommonUtils.CBool(temp); } temp = MySettings.GetSetting("DEBUGLEVEL"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.DebugLevel = (eDEBUG_LEVELS)TheCommonUtils.CInt(temp); } //Clouds have special behavior and the CDE needs to know this upfront temp = MySettings.GetSetting("IsCloudService"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.IsCloudService = TheCommonUtils.CBool(temp); } temp = MySettings.GetSetting("ISOEN"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.IsIsolated = true; MyServiceHostInfo.IsoEngine = temp; MyServiceHostInfo.cdeNodeType = cdeNodeType.Active; } else { temp = MySettings.GetSetting("UseRandomDeviceID"); if (!string.IsNullOrEmpty(temp)) { MyServiceHostInfo.UseRandomDeviceID = TheCommonUtils.CBool(temp); } } //Step 2: Restore from backup if exists #if CDE_NET45 // Backup/Restore only support on NET45 // To ensure that restored backups are not overwritten during shutdown, we write them to a temp directory and move them into place on start up if (!MyServiceHostInfo.UseRandomDeviceID && !MyServiceHostInfo.IsIsolated) { string cacheParentPath = TheCommonUtils.GetCurrentAppDomainBaseDirWithTrailingSlash() + "ClientBin\\"; if (Directory.Exists(cacheParentPath + "__CacheToRestore")) { // Keep the old Cache around just in case try { // First make space for the old copy, in case there was one already if (Directory.Exists(cacheParentPath + "__CacheOld")) { Directory.Delete(cacheParentPath + "__CacheOld", true); } } catch { //ignored } try { Directory.Move(cacheParentPath + "Cache", cacheParentPath + "__CacheOld"); } catch { //ignored } // Now move the restored cache into place try { Directory.Move(cacheParentPath + "__CacheToRestore", cacheParentPath + "Cache"); } catch { TheSystemMessageLog.ToCo("Failure while restoring backup"); } } } #endif MyServiceHostInfo.EnableTaskKPIs = TheCommonUtils.CBool(MySettings.GetSetting("EnableTaskKPIs")); if (MyServiceHostInfo.EnableTaskKPIs) { var taskKpiThread = new Thread(() => { do { var kpis = TheCommonUtils.GetTaskKpis(null); TheSystemMessageLog.ToCo($"Tasks {DateTime.Now}: {TheCommonUtils.SerializeObjectToJSONString(kpis)}"); Thread.Sleep(1000); // Keeping it simple here, to minimize interference on task scheduler/thread scheduler etc. (Assumption: not used on production systems) // TheCommonUtils.SleepOneEye(1000, 1000); } while (MasterSwitch && !Engines.TheCDEngines.IsHostReady && MyServiceHostInfo.EnableTaskKPIs); TheSystemMessageLog.ToCo($"Tasks {DateTime.Now}: KPIs Handoff to NodeHost"); }); taskKpiThread.Start(); } #endregion if (MyActivationManager == null) { MyActivationManager = new TheDefaultActivationManager(MySecrets, MySYSLOG); } #region step 3: analyse os environment information OperatingSystem os = Environment.OSVersion; var osInfoForLog = $"C-DEngine version: {BuildVersion} OS:{Environment.OSVersion} OS Version:{os.VersionString} OS Version Numbers: {os.Version.Major}.{os.Version.Minor}.{os.Version.Build}.{os.Version.Revision} Platform:{os.Platform} SP:{os.ServicePack} Processor Count: {Environment.ProcessorCount} IsMono:{(Type.GetType("Mono.Runtime") != null)} IsNetCore:{TheCommonUtils.IsNetCore()} Product: {TheCommonUtils.GetAssemblyProduct(typeof(TheBaseAssets))} "; TheSystemMessageLog.ToCo(osInfoForLog); MyServiceHostInfo.OSInfo = osInfoForLog; string dotNetInfoForLog = string.Empty; #if !CDE_NET35 && !CDE_NET4 try { string frameworkDescription = null; string osDescription = null; string processArchitecture = null; string osArchitecture = null; #if CDE_STANDARD frameworkDescription = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; osDescription = System.Runtime.InteropServices.RuntimeInformation.OSDescription; processArchitecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString(); osArchitecture = System.Runtime.InteropServices.RuntimeInformation.OSArchitecture.ToString(); #else var rtInfoType = Type.GetType("System.Runtime.InteropServices.RuntimeInformation, System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); if (rtInfoType != null) { frameworkDescription = rtInfoType.GetProperty("FrameworkDescription").GetValue(null).ToString(); osDescription = rtInfoType.GetProperty("OSDescription").GetValue(null).ToString(); processArchitecture = rtInfoType.GetProperty("ProcessArchitecture").GetValue(null).ToString(); osArchitecture = rtInfoType.GetProperty("OSArchitecture").GetValue(null).ToString(); } #endif if (!string.IsNullOrEmpty(frameworkDescription)) { dotNetInfoForLog = $"NetFrameWork:{frameworkDescription} Processor:{processArchitecture} OS:{osDescription } OS Arch:{osArchitecture}"; TheSystemMessageLog.ToCo(dotNetInfoForLog); MyServiceHostInfo.OSInfo += $" {dotNetInfoForLog}"; } } catch { } #endif if (TheCommonUtils.IsMono()) // CODE REVIEW: Need to clean this up - do we mean Mono or Linux or case-insensitive file systems? CM: No- here we need this to find out if we are running in the MONO Runtime { MyServiceHostInfo.cdePlatform = cdePlatform.MONO_V3; } else { #if CDE_NET35 MyServiceHostInfo.cdePlatform = cdePlatform.X32_V3; #elif CDE_NET4 MyServiceHostInfo.cdePlatform = Environment.Is64BitProcess ? cdePlatform.NETV4_64 : cdePlatform.NETV4_32; #elif CDE_STANDARD MyServiceHostInfo.cdePlatform = cdePlatform.NETSTD_V20; #else MyServiceHostInfo.cdePlatform = TheCommonUtils.GetAssemblyPlatform(Assembly.GetEntryAssembly(), false, out var empty);// old: Environment.Is64BitProcess ? cdePlatform.X64_V3 : cdePlatform.X32_V4; #endif } TheSystemMessageLog.ToCo("BaseDir: " + MyServiceHostInfo.BaseDirectory); #endregion #region step 4: Prepare essential Subsystems (Syslog, ScopeManager, Diagnostics, Caches, AppInfo) MySYSLOG = new TheSystemMessageLog(500); // No more ToCo after this point (will be ignored) TheCDEKPIs.Reset(); MyServiceHostInfo.MiniHostInfo.MySYSLOG = MySYSLOG; MyServiceHostInfo.MiniHostInfo.MyKPIs = new TheKPIs(); if (MyScopeManager == null) { MyScopeManager = new TheDefaultScopeManager(); } MyScopeManager.SetMiniHSI(MyServiceHostInfo.MiniHostInfo); MyScopeManager.RegisterScopeChanged(localEventScopeChanged); TheDiagnostics.InitDiagnostics(); TheDiagnostics.SetThreadName("MAIN THREAD"); TheQueuedSenderRegistry.Startup(); MyBlobCache = new TheMirrorCache <TheBlobData>(MyServiceHostInfo.TO.StorageCleanCycle); MyReceivedParts = new TheMirrorCache <TheReceivedParts>(MyServiceHostInfo.TO.StorageCleanCycle); //TODO: I hope there is a better way to do this for Metro! MyServiceTypes.Add(typeof(TheBaseAssets)); MyServiceHostInfo.TO.MakeHeartNormal(); MyAppInfo = new ThePluginInfo { cdeMID = MyServiceHostInfo.cdeMID, CurrentVersion = MyServiceHostInfo.CurrentVersion, Developer = MyServiceHostInfo.VendorName, DeveloperUrl = MyServiceHostInfo.VendorUrl, HomeUrl = MyServiceHostInfo.SiteName, IconUrl = MyServiceHostInfo.UPnPIcon, LongDescription = MyServiceHostInfo.Description, Platform = MyServiceHostInfo.cdePlatform, Copyrights = MyServiceHostInfo.Copyrights, Price = 0, ServiceDescription = MyServiceHostInfo.Title, ServiceName = MyServiceHostInfo.ApplicationName, Capabilities = new List <eThingCaps> { eThingCaps.Host }, Categories = new List <string>(), FilesManifest = new List <string>() }; if (MyServiceHostInfo.ManifestFiles != null) { MyAppInfo.FilesManifest.AddRange(MyServiceHostInfo.ManifestFiles); } #endregion //Now load provisioning and local settings then parse them #pragma warning disable CS0618 // Type or member is obsolete - its allowed here if (!TheCDESettings.ParseSettings(MyCmdArgs, true, false)) #pragma warning restore CS0618 // Type or member is obsolete { MasterSwitch = false; return; } if (MyCodeSigner == null) { MyCodeSigner = new TheDefaultCodeSigning(MySecrets, MySYSLOG); } string tBaseDir = MyServiceHostInfo.BaseDirectory; if (MyServiceHostInfo.cdeHostingType == cdeHostType.IIS) { tBaseDir += "bin\\"; } string uDir = tBaseDir; if (!string.IsNullOrEmpty(MyServiceHostInfo.ISMMainExecutable)) { uDir += MyServiceHostInfo.ISMMainExecutable; if (MyServiceHostInfo.cdeHostingType != cdeHostType.IIS) { var hostPath = uDir + ".exe"; if (!File.Exists(hostPath)) { // We may be running under .Net Core with a .dll-based host hostPath = uDir + ".dll"; } uDir = hostPath; } } else { uDir += "C-DEngine.dll"; } MyServiceHostInfo.CodeSignThumb = MyCodeSigner.GetAppCert(MyServiceHostInfo.DontVerifyTrust, uDir, MyServiceHostInfo.VerifyTrustPath, MyServiceHostInfo.DontVerifyIntegrity); //Must be loaded here to set trust level in HSI if (MyLoc as TheDefaultLocalizationUtils != null) { (MyLoc as TheDefaultLocalizationUtils).DoPseudoLoc = TheCommonUtils.CBool(MySettings.GetSetting("DoPseudoLoc")); } #region step 5: output some system information if (MyServiceHostInfo.IsMemoryOptimized) { MySYSLOG.SetMaxLogEntries(10); } MySYSLOG.WriteToLog(4151, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", osInfoForLog, eMsgLevel.l4_Message)); if (!string.IsNullOrEmpty(dotNetInfoForLog)) { MySYSLOG.WriteToLog(4152, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", dotNetInfoForLog, eMsgLevel.l4_Message)); } MySYSLOG.WriteToLog(4153, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("TheBaseAssets", "BaseDir: " + MyServiceHostInfo.BaseDirectory, eMsgLevel.l4_Message)); #endregion #region step 6: determine WebSocket8 vs. WebSocketsSharp var ws8FlagTemp = MySettings.GetSetting("DisallowWebSocket8"); if (!string.IsNullOrEmpty(ws8FlagTemp)) { MyServiceHostInfo.IsWebSocket8Active = !TheCommonUtils.CBool(ws8FlagTemp); MySYSLOG.WriteToLog(4154, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", $"Setting IsWebSocket8Active to {MyServiceHostInfo.IsWebSocket8Active} due to config", eMsgLevel.l4_Message)); } else { MyServiceHostInfo.IsWebSocket8Active = true; } if ((os.Platform != PlatformID.Win32NT && !TheCommonUtils.IsNetCore()) || (os.Platform == PlatformID.Win32NT && (os.Version.Major < 6 || (os.Version.Major == 6 && os.Version.Minor < 2)))) { MyServiceHostInfo.IsWebSocket8Active = false; string tWSMsg = "Older Windows or non-Windows OS Detected - No OS Support for WebSockets Found: "; #if !CDE_USECSWS //OK TheBaseAssets.MyServiceHostInfo.DisableWebSockets = true; tWSMsg += "WebSockets are turned Off"; #else tWSMsg += "Switching to WebSockets-Sharp"; #endif MySYSLOG.WriteToLog(4155, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", tWSMsg, eMsgLevel.l4_Message)); } #endregion #region step 7: Initialize Localization subsystem (ILocalizationHooks) bool bLocInitialized = false; try { var entryAssembly = Assembly.GetEntryAssembly(); //This does not work in IIS! if (entryAssembly != null) { var CDEPlugins = from t in entryAssembly.GetTypes() let ifs = t.GetInterfaces() where ifs != null && ifs.Length > 0 && (ifs.Contains(typeof(ILocalizationHooks))) select new { Type = t, t.Namespace, t.Name, t.FullName }; if (CDEPlugins != null && CDEPlugins.Any()) { MyLoc = Activator.CreateInstance(CDEPlugins.First().Type) as ILocalizationHooks; } bLocInitialized = true; } } catch { } if (!bLocInitialized) { MySYSLOG.WriteToLog(4156, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", "3rd Party ILocalization Hooks not found - using built-in", eMsgLevel.l4_Message)); } #endregion #region step 8: Set MyStationUrl switch (MyServiceHostInfo.cdeHostingType) { case cdeHostType.Phone: case cdeHostType.Metro: MyServiceHostInfo.MyDeviceMoniker = "CDEV://"; break; case cdeHostType.Silverlight: MyServiceHostInfo.MyDeviceMoniker = "CDES://"; break; case cdeHostType.Device: MyServiceHostInfo.MyDeviceMoniker = "CDEC://"; break; case cdeHostType.Mini: MyServiceHostInfo.MyDeviceMoniker = "CDEM://"; break; default: //Services MyServiceHostInfo.MyDeviceMoniker = "CDEB://"; break; } if (TheCommonUtils.IsHostADevice()) { MyServiceHostInfo.MyStationURL = MyServiceHostInfo.MyDeviceMoniker + "{" + MyServiceHostInfo.MyDeviceInfo.DeviceID + "}".ToUpper(); //MSU-OK } else { if (MyServiceHostInfo.MyAltStationURLs.Count(s => s.StartsWith("CDEB")) == 0) { MyServiceHostInfo.MyAltStationURLs.Add("CDEB://{" + MyServiceHostInfo.MyDeviceInfo.DeviceID + "}"); //TODO: Backchannel Possibly save to Config File } } #endregion #region step 9: Start Localhost QSender and SessionStateManager MySession = new TheSessionStateManager(MyServiceHostInfo); LocalHostQSender = new TheQueuedSender(); //NO connected or Error Event necessary LocalHostQSender.StartSender(new TheChannelInfo(MyServiceHostInfo.MyDeviceInfo.DeviceID, MyScopeManager.ScopeID, MyServiceHostInfo.MyDeviceInfo.SenderType, MyServiceHostInfo.GetPrimaryStationURL(false)), null, false); //NEW:2.06 Setting Realscope here ///null correct - no subs on LocalhostQS in beginning //RScope-OK if ((MyServiceHostInfo.DisableWebSockets || MyServiceHostInfo.MyStationWSPort == 0) && !TheCommonUtils.IsHostADevice()) { MySYSLOG.WriteToLog(4157, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseAssets", $"WebSockets Disabled - no WSPort specified {MyServiceHostInfo.MyStationWSPort} or DisableWebSocket={MyServiceHostInfo.DisableWebSockets}", eMsgLevel.l4_Message)); } #endregion // Post Device ID settings //Step 10: Save all settings to local cdeTPI MySettings.UpdateLocalSettings(); }
/// <summary> /// Override to initalize the app with custom values but still call the base! /// </summary> /// <param name="pPlugInLst">List if ICDEPlugin instances</param> /// <param name="ArgList">Additional Parameters of the Application</param> /// <returns>True if all went well during startup</returns> public virtual bool StartBaseApplication2(List <ICDEPlugin> pPlugInLst, IDictionary <string, string> ArgList) { if (TheBaseAssets.MasterSwitch) { return(false); //SECURITY REVIEW: do not allow to call StartBaseApplication twice } TheBaseAssets.MasterSwitch = true; if (TheBaseAssets.MyServiceHostInfo == null) { TheBaseAssets.MasterSwitch = false; TheSystemMessageLog.ToCo("MyServiceHostInfo is not set! Exiting..."); //Will becalled because if MyServiceHostInfo==null TOCO will be called return(false); } if (TheBaseAssets.CryptoLoadMessage != null) { TheBaseAssets.MasterSwitch = false; TheSystemMessageLog.ToCo($"Security initialization failed with {TheBaseAssets.CryptoLoadMessage}. Exiting..."); return(false); } try { TheBaseAssets.IsStarting = true; //AppDomain.CurrentDomain.UnhandledException += MyUnhandledExceptionHandler; if (ArgList == null) { ArgList = new Dictionary <string, string>(); //DIC-Allowed! } if (!TheBaseAssets.MySettings.ReadAllAppSettings(ref ArgList)) { TheSystemMessageLog.ToCo("Not reading app.config: not supported by platform."); //Will never be called! } if (!TheBaseAssets.MasterSwitch) { return(false); } TheBaseAssets.MyCmdArgs = ArgList; //MyCmdArgs ONLY contains "public" settings coming from app.config or via the host MyUserManager = new TheUserManager(); TheBaseAssets.InitAssets(this); if (!TheBaseAssets.MasterSwitch) { return(false); } TheBaseAssets.MyScopeManager.RegisterScopeChanged(EventScopeChanged); TheBaseAssets.MySYSLOG.WriteToLog(4140, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Assets and SystemLog Initialized", eMsgLevel.l3_ImportantMessage)); int minWorker = -1, minCompletionPort = -1, maxWorker = -1, maxCompletionPort = -1; try { System.Threading.ThreadPool.GetMinThreads(out minWorker, out minCompletionPort); System.Threading.ThreadPool.GetMaxThreads(out maxWorker, out maxCompletionPort); } catch { }; #if CDE_STANDARD var largeObjectHeapCompactionMode = System.Runtime.GCSettings.LargeObjectHeapCompactionMode; #else const string largeObjectHeapCompactionMode = "n/a"; #endif TheBaseAssets.MySYSLOG.WriteToLog(4144, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM(eEngineName.ContentService, $"CLR Info", eMsgLevel.l4_Message, $"Server GC: {System.Runtime.GCSettings.IsServerGC}. GC Latency Mode: {System.Runtime.GCSettings.LatencyMode}. LOHC Mode: {largeObjectHeapCompactionMode}. Bitness: {System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)) * 8}. Threads Min W/CP, Max W/CP: {minWorker}/{minCompletionPort},{maxWorker}/{maxCompletionPort}. GC TotalMemory: {GC.GetTotalMemory(false)}")); if (!TheBaseAssets.MyActivationManager.InitializeLicenses()) { Shutdown(true); TheBaseAssets.MySYSLOG.WriteToLog(4145, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Licensing error", eMsgLevel.l3_ImportantMessage)); return(false); } //4.304: Workitem #2289 - Removed from OSS Release (as CheckLicense is always returning true in the CoreCrypto Lib if (!TheBaseAssets.MyActivationManager.CheckLicense(new Guid("{5737240C-AA66-417C-9B66-3919E18F9F4A}"), "", null, 1, false)) { if (TheBaseAssets.MyServiceHostInfo.ShutdownOnLicenseFailure) { TheBaseAssets.MySYSLOG.WriteToLog(4146, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Licensing error: no activated license for Thing Service. Shutting down immediately as configured.", eMsgLevel.l2_Warning)); return(false); } else { TheBaseAssets.MySYSLOG.WriteToLog(4147, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Licensing error: no activated license for Thing Service. Will shut down in 60 minutes if not activated.", eMsgLevel.l2_Warning)); TheCommonUtils.cdeRunAsync("LicenseCheck", true, (o) => { TheCommonUtils.TaskDelayOneEye(60 * 60 * 1000, 100).ContinueWith((t) => { if (TheBaseAssets.MasterSwitch) { if (!TheBaseAssets.MyActivationManager.CheckLicense(new Guid("{5737240C-AA66-417C-9B66-3919E18F9F4A}"), "", null, 1, false)) { TheBaseAssets.MySYSLOG.WriteToLog(4148, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Licensing error: no activated license for Thing Service. Shutting down.", eMsgLevel.l1_Error)); if (TheBaseAssets.IsInAgentStartup) { MyISMRoot?.Restart(true); } else { Shutdown(true); } } } }); }); } } TheCommCore.MyHttpService = new TheHttpService(); TheBaseAssets.MySYSLOG.WriteToLog(4141, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "HttpService created", eMsgLevel.l3_ImportantMessage)); if (TheBaseAssets.MyServiceHostInfo.StartISM && MyISMRoot == null && !string.IsNullOrEmpty(TheBaseAssets.MyServiceHostInfo.BaseDirectory)) { MyISMRoot = new TheISMManager { eventShutdownRequired = sinkAppShutdown }; MyISMRoot.InitISM("", "", "", TheBaseAssets.MyServiceHostInfo.CurrentVersion, TheBaseAssets.MyServiceHostInfo.ISMScanForUpdatesOnUSB, TheBaseAssets.MyServiceHostInfo.ISMScanOnStartup); TheBaseAssets.MySYSLOG.WriteToLog(4142, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "ISM Started", eMsgLevel.l3_ImportantMessage)); } else { TheBaseAssets.MyServiceHostInfo.StartISM = false; } if (!TheBaseAssets.MasterSwitch) { return(false); } if (MyCommonDisco == null) { if (!TheBaseAssets.MyServiceHostInfo.IsIsolated && (TheCommonUtils.IsHostADevice() || TheBaseAssets.MyServiceHostInfo.cdeNodeType == cdeNodeType.Active)) { TheBaseAssets.MySettings.SetSetting("DISCO_IsClientOnly", "True"); } MyCommonDisco = new TheCommonDisco(); // Initialized the Discovery Service } TheCDEngines.eventAllEnginesStarted += sinkEnginesStarted; if (!TheCDEngines.StartEngines(pPlugInLst, null)) //Starts all SubEngines and Plugins. MyCmdArgs is a copy of the tParas sent to the Init Assets Function and can be used to set parameters for each engine during startup { Shutdown(true); TheBaseAssets.MySYSLOG.WriteToLog(4149, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("TheBaseApplication", "Failed to start engines", eMsgLevel.l3_ImportantMessage)); return(false); } return(true); } finally { TheBaseAssets.IsStarting = false; } }
//////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> Loads a crypto library for all Security related methods. </summary> /// /// <remarks> Chris, 3/27/2020. </remarks> /// /// <param name="pDLLName"> Name of the crypto DLL. </param> /// <param name="bDontVerifyTrust"></param> /// <param name="pFromFile"></param> /// <param name="bVerifyTrustPath"></param> /// <param name="bDontVerifyIntegrity"></param> /// <param name="pMySYSLOG"></param> /// /// <returns> Error string if load failed - then the default security in the CDE is used. Null if succeeded </returns> //////////////////////////////////////////////////////////////////////////////////////////////////// public static string LoadCrypto(string pDLLName, ICDESystemLog pMySYSLOG = null, bool bDontVerifyTrust = false, string pFromFile = null, bool bVerifyTrustPath = true, bool bDontVerifyIntegrity = false) { if (MasterSwitch) { return(CryptoLoadMessage = "LoadCrypto is not allowed after the Node has been started"); } try { var inDLLName = pDLLName; if (string.IsNullOrEmpty(pDLLName)) { pDLLName = "cdeCryptoLib.dll"; } Dictionary <string, string> tL = new Dictionary <string, string>(); Assembly tCryptoAssembly = null; string codeSignThumb; if (AppDomain.CurrentDomain?.FriendlyName != "RootDomain" && AppDomain.CurrentDomain?.FriendlyName != "MonoTouch") //Android and IOS { if (MyCodeSigner == null) { MyCodeSigner = new TheDefaultCodeSigning(MySecrets, pMySYSLOG); } codeSignThumb = MyCodeSigner.GetAppCert(bDontVerifyTrust, pFromFile, bVerifyTrustPath, bDontVerifyIntegrity); if (!bDontVerifyTrust && string.IsNullOrEmpty(codeSignThumb)) { return(CryptoLoadMessage = $"No code-signing certificate found but required"); } if (!pDLLName.Contains(Path.DirectorySeparatorChar)) { pDLLName = Path.Combine(AppDomain.CurrentDomain.RelativeSearchPath != null ? AppDomain.CurrentDomain.RelativeSearchPath : AppDomain.CurrentDomain.BaseDirectory, pDLLName); } AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); var pLoader = new CryptoReferenceLoader(); tL = pLoader.ScanLibrary(pDLLName, out TSM tTSM, out tCryptoAssembly); if (tTSM != null) { TheSystemMessageLog.ToCo($"Domain:{AppDomain.CurrentDomain?.FriendlyName} DLL:{pFromFile} Cert Found:{codeSignThumb} {tTSM.TXT} {tTSM.PLS}"); } } else { var types = AppDomain.CurrentDomain.GetAssemblies(); tCryptoAssembly = types.FirstOrDefault(g => g.Location.Contains(pDLLName)); if (tCryptoAssembly != null) { var CDEPlugins = from t in tCryptoAssembly.GetTypes() let ifs = t.GetInterfaces() where ifs != null && ifs.Length > 0 && (ifs.Any(s => _KnownInterfaces.Contains(s.Name))) select new { Type = t, t.Namespace, t.Name, t.FullName }; foreach (var Plugin in CDEPlugins) { if (!(Plugin?.Type?.IsAbstract == true)) { var ints = Plugin.Type.GetInterfaces(); foreach (var tI in ints) { if (_KnownInterfaces.Contains(tI.Name)) { tL[tI.Name] = Plugin.FullName; } } } } } } if ((bDontVerifyTrust || MyCodeSigner?.IsTrusted(pDLLName) == true) && tL?.Count > 0) { if (tCryptoAssembly == null) { tCryptoAssembly = Assembly.LoadFrom(pDLLName); } if (tL.ContainsKey("ICDESecrets")) { var tSecType = tCryptoAssembly.GetTypes().First(s => s.FullName == tL["ICDESecrets"]); MySecrets = Activator.CreateInstance(tSecType) as ICDESecrets; } else { MySecrets = new TheDefaultSecrets(); } foreach (string tInter in _KnownInterfaces) { if (tL?.ContainsKey(tInter) == true) { var tNType = tCryptoAssembly.GetTypes().First(s => s.FullName == tL[tInter]); try { switch (tInter) { case "ICDEScopeManager": MyScopeManager = Activator.CreateInstance(tNType, new object[] { MySecrets, pMySYSLOG }) as ICDEScopeManager; break; case "ICDECodeSigning": MyCodeSigner = Activator.CreateInstance(tNType, new object[] { MySecrets, pMySYSLOG }) as ICDECodeSigning; break; case "ICDEActivation": MyActivationManager = Activator.CreateInstance(tNType, new object[] { MySecrets, pMySYSLOG }) as ICDEActivation; break; case "ICDECrypto": MyCrypto = Activator.CreateInstance(tNType, new object[] { MySecrets, pMySYSLOG }) as ICDECrypto; break; } } catch (Exception e) { pMySYSLOG?.WriteToLog(0, 1, "LoadCrypto", $"Failed to create implementation of {tInter}. Most likely constructor not implemented correctly (must take ICDESecrets as first parameter): {e}", eMsgLevel.l1_Error); } } } } else { return(CryptoLoadMessage = $"The {pDLLName} is not trusted"); } } catch (Exception e) { return(CryptoLoadMessage = $"Errors During Load: {e}"); } return(null); }