public void TestInsertApplicationEntity() { SecurityApplication securityApp = new SecurityApplication() { ApplicationSecret = "I AM A SECRET!", Name = "Test Application" }; var iapps = ApplicationContext.Current.GetService <IDataPersistenceService <SecurityApplication> >(); var securityApplication = iapps.Insert(securityApp); // Create the application entity var appEntity = new ApplicationEntity() { SoftwareName = "Test Software v1", VersionName = "Bluenose", VendorName = "Some Software Company Inc.", SecurityApplication = securityApp }; var afterInsert = base.DoTestInsert(appEntity); Assert.AreEqual("Test Software v1", afterInsert.SoftwareName); Assert.AreEqual("Bluenose", afterInsert.VersionName); Assert.AreEqual("Some Software Company Inc.", afterInsert.VendorName); Assert.IsNotNull(afterInsert.SecurityApplication); Assert.AreEqual("Test Application", afterInsert.SecurityApplication.Name); }
// // GET: /Application/Create public ActionResult Create() { SecurityApplication oNew = new SecurityApplication(); oNew.ActiveFlag2 = true; return(View(oNew)); }
//delete SecurityApplication object by id public bool DeleteByID(long pSecurityApplicationID) { try { if (pSecurityApplicationID > 0) { SecurityApplication vSecurityApplication = rep.Find(pSecurityApplicationID); if (vSecurityApplication != null) { ////Update DelFlag To "Y" For Soft Delete //vSecurityApplication.ID = pSecurityApplication.ID; //vSecurityApplication.ApplicationCode = pSecurityApplication.ApplicationCode; //vSecurityApplication.ApplicationName = pSecurityApplication.ApplicationName; //vSecurityApplication.Remarks = pSecurityApplication.Remarks; //vSecurityApplication.ActiveFlag = pSecurityApplication.ActiveFlag; rep.Edit(vSecurityApplication); rep.SaveChanges(); return(true); } } return(false); } catch (Exception ex) { throw ex; } }
public SecurityApplication CreateApplication(SecurityApplication application) { this.m_traceSource.TraceEvent(TraceEventType.Information, 0, "Creating application {0}", application); var persistenceService = ApplicationContext.Current.GetService <IDataPersistenceService <SecurityApplication> >(); if (persistenceService == null) { throw new InvalidOperationException($"{nameof(IDataPersistenceService<SecurityApplication>)} not found"); } application.ApplicationSecret = ApplicationContext.Current.GetService <IPasswordHashingService>().EncodePassword(application.ApplicationSecret); var createdApplication = persistenceService.Insert(application, AuthenticationContext.Current.Principal, TransactionMode.Commit); this.SecurityResourceCreated?.Invoke(this, new SecurityAuditDataEventArgs(createdApplication)); base.Insert(new ApplicationEntity { SecurityApplication = createdApplication, SoftwareName = application.Name, StatusConceptKey = StatusKeys.Active }); return(createdApplication); }
public bool Update(SecurityApplication pSecurityApplication) { try { if (pSecurityApplication.ID > 0) { SecurityApplication vSecurityApplication = rep.Find(pSecurityApplication.ID); if (vSecurityApplication != null) { vSecurityApplication.ApplicationName = pSecurityApplication.ApplicationName.ToUpper(); vSecurityApplication.FullName = pSecurityApplication.FullName; vSecurityApplication.Remarks = pSecurityApplication.Remarks; vSecurityApplication.ActiveFlag = pSecurityApplication.ActiveFlag; rep.Edit(vSecurityApplication); rep.SaveChanges(); return(true); } } return(false); } catch (Exception ex) { throw ex; } }
public static void Initialize(TestContext context) { // Force load of the DLL var p = FirebirdSql.Data.FirebirdClient.FbCharset.Ascii; TestApplicationContext.TestAssembly = typeof(TestMessageParsing).Assembly; TestApplicationContext.Initialize(context.DeploymentDirectory); // Create the test harness device / application var securityDevService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityDevice> >(); var securityAppService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityApplication> >(); var metadataService = ApplicationServiceContext.Current.GetService <IAssigningAuthorityRepositoryService>(); AuthenticationContext.Current = new AuthenticationContext(AuthenticationContext.SystemPrincipal); // Create device var dev = new SecurityDevice() { DeviceSecret = "DEVICESECRET", Name = "TEST_HARNESS|TEST" }; dev.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); dev = securityDevService.Insert(dev); var app = new SecurityApplication() { Name = "TEST_HARNESS", ApplicationSecret = "APPLICATIONSECRET" }; app.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); app.AddPolicy(PermissionPolicyIdentifiers.UnrestrictedClinicalData); app.AddPolicy(PermissionPolicyIdentifiers.ReadMetadata); app = securityAppService.Insert(app); metadataService.Insert(new Core.Model.DataTypes.AssigningAuthority("TEST", "TEST", "1.2.3.4.5.6.7") { IsUnique = true, AssigningApplicationKey = app.Key }); // Add another application for security checks dev = new SecurityDevice() { DeviceSecret = "DEVICESECRET2", Name = "TEST_HARNESS2|TEST" }; dev.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); dev = securityDevService.Insert(dev); app = new SecurityApplication() { Name = "TEST_HARNESS2", ApplicationSecret = "APPLICATIONSECRET2" }; app.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); app.AddPolicy(PermissionPolicyIdentifiers.UnrestrictedClinicalData); app.AddPolicy(PermissionPolicyIdentifiers.ReadMetadata); app = securityAppService.Insert(app); }
/// <summary> /// Initializes a new instance of the <see cref="SecurityApplicationInfo"/> class /// with a specific <see cref="SecurityApplication"/> instance. /// </summary> /// <param name="application">The security application.</param> public SecurityApplicationInfo(SecurityApplication application) { this.Application = application; this.ApplicationSecret = application.ApplicationSecret; this.Id = application.Key; this.Name = application.Name; this.Policies = application.Policies.Select(p => new SecurityPolicyInfo(p)).ToList(); }
//POST: /User/Create public ActionResult Create(string pApplicationCode) { SecurityForm vForm = new SecurityForm(); SecurityApplication vApplication = oApplicationBLL.GetByCode(pApplicationCode); vForm.ApplicationCode = vApplication.ApplicationCode; vForm.ApplicationName = vApplication.ApplicationName; vForm.ActiveFlag2 = true; return(View(vForm)); }
// // GET: /Application/Edit/5 public ActionResult Edit(string pApplicationCode) { SecurityApplication vApplication = oApplicationBLL.GetByCode(pApplicationCode); if (vApplication == null) { return(HttpNotFound()); } return(View(vApplication)); }
public ActionResult Edit(SecurityApplication pApplication) { if (ModelState.IsValid) { if (oApplicationBLL.Update(pApplication)) { return(RedirectToAction("Index")); } } return(View(pApplication)); }
public SecurityApplication SaveApplication(SecurityApplication application) { var persistenceService = ApplicationContext.Current.GetService <IDataPersistenceService <SecurityApplication> >(); if (persistenceService == null) { throw new InvalidOperationException($"{nameof(IDataPersistenceService<SecurityApplication>)} not found"); } this.SecurityAttributesChanged?.Invoke(this, new SecurityAuditDataEventArgs(application)); return(persistenceService.Update(application, AuthenticationContext.Current.Principal, TransactionMode.Commit)); }
/// <summary> /// Create the specified authority /// </summary> public static void CreateAuthority(string nsid, string oid, string applicationName, byte[] deviceSecret) { // Create the test harness device / application var securityDevService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityDevice> >(); var securityAppService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityApplication> >(); var metadataService = ApplicationServiceContext.Current.GetService <IAssigningAuthorityRepositoryService>(); AuthenticationContext.Current = new AuthenticationContext(AuthenticationContext.SystemPrincipal); string pubId = $"{applicationName}|TEST"; var device = securityDevService.Find(o => o.Name == pubId).FirstOrDefault(); if (device == null) { device = new SecurityDevice() { DeviceSecret = BitConverter.ToString(deviceSecret).Replace("-", ""), Name = $"{applicationName}|TEST" }; device.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); device = securityDevService.Insert(device); } // Application var app = securityAppService.Find(o => o.Name == applicationName).FirstOrDefault(); if (app == null) { app = new SecurityApplication() { Name = applicationName, ApplicationSecret = BitConverter.ToString(deviceSecret).Replace("-", "") }; app.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); app.AddPolicy(PermissionPolicyIdentifiers.UnrestrictedClinicalData); app.AddPolicy(PermissionPolicyIdentifiers.ReadMetadata); app = securityAppService.Insert(app); } // Create AA var aa = metadataService.Get(nsid); if (aa == null) { aa = new SanteDB.Core.Model.DataTypes.AssigningAuthority(nsid, nsid, oid) { AssigningApplicationKey = app.Key, IsUnique = true }; metadataService.Insert(aa); } }
private async void SecurityAppListView_ItemSelected(object sender, SelectedItemChangedEventArgs e) { if (e.SelectedItem == null) { // don't do anything if we just de-selected the row return; } else { SecurityApplication application = e.SelectedItem as SecurityApplication; ((ListView)sender).SelectedItem = null; SecurityApplicationReviewPage reviewpage = new SecurityApplicationReviewPage(application.applicationid); reviewpage.BindingContext = application; await Navigation.PushAsync(reviewpage); } }
public bool Insert(SecurityApplication pSecurityApplication) { try { //pSecurityApplication.ID = GetMaxID(); pSecurityApplication.ApplicationCode = GetMaxCode(); pSecurityApplication.ApplicationName = pSecurityApplication.ApplicationName.ToUpper(); pSecurityApplication.Remarks = pSecurityApplication.Remarks; pSecurityApplication.ActiveFlag = pSecurityApplication.ActiveFlag; rep.Add(pSecurityApplication); rep.SaveChanges(); return(true); } catch (Exception ex) { throw ex; } }
/// <summary> /// The main entry point for the application. /// </summary> private static void Main(String[] args) { // Output main header var parser = new ParameterParser <ConsoleParameters>(); var parms = parser.Parse(args); parms.InstanceName = String.IsNullOrEmpty(parms.InstanceName) ? "default" : parms.InstanceName; // Output copyright info var entryAsm = Assembly.GetEntryAssembly(); Console.WriteLine("SanteDB Disconnected Server (SanteDB) {0} ({1})", entryAsm.GetName().Version, entryAsm.GetCustomAttribute <AssemblyInformationalVersionAttribute>().InformationalVersion); Console.WriteLine("{0}", entryAsm.GetCustomAttribute <AssemblyCopyrightAttribute>().Copyright); Console.WriteLine("Complete Copyright information available at http://github.com/santedb/santedb-www"); // Parameters to force load? if (parms.Force) { foreach (var itm in Directory.GetFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "*.dll")) { try { var asm = Assembly.LoadFile(itm); Console.WriteLine("Force Loaded {0}", asm.FullName); } catch (Exception e) { Console.WriteLine("ERR: Cannot load {0} due to {1}", itm, e.Message); } } } AppDomain.CurrentDomain.AssemblyResolve += (o, e) => { string pAsmName = e.Name; if (pAsmName.Contains(",")) { pAsmName = pAsmName.Substring(0, pAsmName.IndexOf(",")); } var asm = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => e.Name == a.FullName) ?? AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => pAsmName == a.GetName().Name); return(asm); }; try { // Detect platform if (System.Environment.OSVersion.Platform != PlatformID.Win32NT) { Trace.TraceWarning("Not running on WindowsNT, some features may not function correctly"); } else if (!EventLog.SourceExists("SanteDB")) { EventLog.CreateEventSource("SanteDB", "santedb-www"); } // Security Application Information var applicationIdentity = new SecurityApplication() { Key = Guid.Parse("a0d2e3c5-a2d3-11ea-ad9f-00155d4f0905"), ApplicationSecret = parms.ApplicationSecret ?? "SDB$$DEFAULT$$APPSECRET", Name = parms.ApplicationName ?? "org.santedb.disconnected_client" }; // Setup basic parameters String[] directory = { Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SanteDBWWW", parms.InstanceName), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SanteDBWWW", parms.InstanceName) }; foreach (var dir in directory) { if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } } // Token validator TokenValidationManager.SymmetricKeyValidationCallback += (o, k, i) => { Trace.TraceError("Trust issuer {0} failed", i); return(false); }; ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, error) => { if (certificate == null || chain == null) { return(false); } else { if (chain.ChainStatus.Length > 0 || error != SslPolicyErrors.None) { Trace.TraceWarning("The remote certificate is not trusted. The error was {0}. The certificate is: \r\n{1}", error, certificate.Subject); return(false); } return(true); } }; if (parms.ShowHelp) { parser.WriteHelp(Console.Out); } else if (parms.Reset) { var appData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SanteDB", parms.InstanceName); var cData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SanteDB", parms.InstanceName); if (Directory.Exists(appData)) { Directory.Delete(cData, true); } if (Directory.Exists(appData)) { Directory.Delete(appData, true); } Console.WriteLine("Environment Reset Successful"); return; } else if (parms.ConsoleMode) { #if DEBUG Tracer.AddWriter(new LogTraceWriter(System.Diagnostics.Tracing.EventLevel.LogAlways, "SanteDB.data", new Dictionary <String, EventLevel>()), System.Diagnostics.Tracing.EventLevel.LogAlways); #else Tracer.AddWriter(new LogTraceWriter(System.Diagnostics.Tracing.EventLevel.Informational, "SanteDB.data", new Dictionary <String, EventLevel>()), System.Diagnostics.Tracing.EventLevel.LogAlways); #endif Trace.Listeners.Add(new ConsoleTraceListener()); ApplicationContext.ProgressChanged += (o, e) => { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(">>> PROGRESS >>> {0} : {1:#0%}", e.ProgressText, e.Progress); Console.ResetColor(); }; if (!DcApplicationContext.StartContext(new ConsoleDialogProvider(), $"www-{parms.InstanceName}", applicationIdentity, SanteDB.Core.SanteDBHostType.Other)) { DcApplicationContext.StartTemporary(new ConsoleDialogProvider(), $"www-{parms.InstanceName}", applicationIdentity, SanteDB.Core.SanteDBHostType.Configuration); } DcApplicationContext.Current.Configuration.GetSection <ApplicationServiceContextConfigurationSection>()?.AppSettings?.RemoveAll(o => o.Key == "http.bypassMagic"); DcApplicationContext.Current.Configuration.GetSection <ApplicationServiceContextConfigurationSection>()?.AppSettings?.Add(new AppSettingKeyValuePair() { Key = "http.bypassMagic", Value = DcApplicationContext.Current.ExecutionUuid.ToString() }); bool restartService = false; if (!parms.Forever) { Console.WriteLine("Press [Enter] key to close..."); Console.ReadLine(); } else { Console.WriteLine("Will run in nohup daemon mode..."); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { // Wait until cancel key is pressed var mre = new ManualResetEventSlim(false); Console.CancelKeyPress += (o, e) => mre.Set(); DcApplicationContext.Current.Stopped += (o, e) => mre.Set(); mre.Wait(); } else { // running on unix // Now wait until the service is exiting va SIGTERM or SIGSTOP UnixSignal[] signals = new UnixSignal[] { new UnixSignal(Mono.Unix.Native.Signum.SIGINT), new UnixSignal(Mono.Unix.Native.Signum.SIGTERM), new UnixSignal(Mono.Unix.Native.Signum.SIGQUIT), new UnixSignal(Mono.Unix.Native.Signum.SIGHUP) }; DcApplicationContext.Current.Stopped += (o, e) => { Console.WriteLine("Service has stopped, will send SIGHUP to self for restart"); restartService = true; Syscall.kill(Syscall.getpid(), Signum.SIGHUP); }; Console.WriteLine("Started - Send SIGINT, SIGTERM, SIGQUIT or SIGHUP to PID {0} to terminate", Process.GetCurrentProcess().Id); int signal = UnixSignal.WaitAny(signals); } } Console.WriteLine($"Received termination signal... {DcApplicationContext.Current?.IsRunning}"); if (DcApplicationContext.Current?.IsRunning == true && !restartService) { DcApplicationContext.Current.Stop(); } else { // Service stopped the context so we want to restart Console.WriteLine("Will restart context, waiting for main teardown in 5 seconds..."); var pi = new ProcessStartInfo(typeof(Program).Assembly.Location, string.Join(" ", args)); pi.UseShellExecute = true; Process.Start(pi); Environment.Exit(0); } } else if (parms.Install) { string serviceName = $"sdb-www-{parms.InstanceName}"; if (!ServiceTools.ServiceInstaller.ServiceIsInstalled(serviceName)) { String argList = String.Empty; if (!String.IsNullOrEmpty(parms.ApplicationName)) { argList += $" --appname=\"{parms.ApplicationName}\""; } if (!String.IsNullOrEmpty(parms.ApplicationSecret)) { argList += $" --appsecret=\"{parms.ApplicationSecret}\""; } ServiceTools.ServiceInstaller.Install( serviceName, $"SanteDB WWW ({parms.InstanceName})", $"{entryAsm.Location} --name=\"{parms.InstanceName}\" {argList}", null, null, ServiceTools.ServiceBootFlag.AutoStart); } else { throw new InvalidOperationException("Service instance already installed"); } } else if (parms.Uninstall) { string serviceName = $"sdb-www-{parms.InstanceName}"; if (ServiceTools.ServiceInstaller.ServiceIsInstalled(serviceName)) { ServiceTools.ServiceInstaller.Uninstall(serviceName); } else { throw new InvalidOperationException("Service instance not installed"); } } else if (parms.Restart) { string serviceName = $"sdb-www-{parms.InstanceName}"; if (ServiceTools.ServiceInstaller.ServiceIsInstalled(serviceName)) { Console.Write("Stopping {0}...", serviceName); var niter = 0; ServiceTools.ServiceInstaller.StopService(serviceName); while (ServiceTools.ServiceInstaller.GetServiceStatus(serviceName) != ServiceTools.ServiceState.Stop && niter < 10) { Thread.Sleep(1000); Console.Write("."); niter++; } Console.Write("\r\nStarting {0}...", serviceName); ServiceTools.ServiceInstaller.StartService(serviceName); while (ServiceTools.ServiceInstaller.GetServiceStatus(serviceName) != ServiceTools.ServiceState.Run && niter < 20) { Thread.Sleep(1000); Console.Write("."); niter++; } Console.WriteLine("Restart Complete"); } } else { Trace.TraceInformation("Starting as Windows Service"); ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new SanteDbService(parms.InstanceName, applicationIdentity) }; ServiceBase.Run(ServicesToRun); Trace.TraceInformation("Started As Windows Service..."); } } catch (Exception e) { #if DEBUG Trace.TraceError("011 899 981 199 911 9725 3!!! {0}", e.ToString()); Console.WriteLine("011 899 981 199 911 9725 3!!! {0}", e.ToString()); #else Trace.TraceError("Error encountered: {0}. Will terminate", e); EventLog.WriteEntry("SanteDB", $"Fatal service error: {e}", EventLogEntryType.Error, 911); Console.WriteLine("FATAL ERROR: {0}", e); #endif Environment.Exit(911); } }
/// <summary> /// Force delay loading /// </summary> public override void Refresh() { base.Refresh(); this.m_securityApplication = null; }
public void Initialize() { // Force load of the DLL var p = FirebirdSql.Data.FirebirdClient.FbCharset.Ascii; TestApplicationContext.TestAssembly = typeof(TestMessageParsing).Assembly; TestApplicationContext.Initialize(TestContext.CurrentContext.TestDirectory); // Create the test harness device / application var securityDevService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityDevice> >(); var securityAppService = ApplicationServiceContext.Current.GetService <IRepositoryService <SecurityApplication> >(); var metadataService = ApplicationServiceContext.Current.GetService <IAssigningAuthorityRepositoryService>(); this.m_serviceManager = ApplicationServiceContext.Current.GetService <IServiceManager>(); AuthenticationContext.EnterSystemContext(); // Create device var dev = new SecurityDevice() { DeviceSecret = "DEVICESECRET", Name = "TEST_HARNESS|TEST" }; dev.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); securityDevService.Insert(dev); // Create device dev = new SecurityDevice() { DeviceSecret = "DEVICESECRET", Name = "TEST_HARNESS|MASTER" }; dev.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); dev.AddPolicy("1.3.6.1.4.1.33349.3.1.5.9.2.6"); securityDevService.Insert(dev); var app = new SecurityApplication() { Name = "TEST_HARNESS", ApplicationSecret = "APPLICATIONSECRET" }; app.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); app.AddPolicy(PermissionPolicyIdentifiers.UnrestrictedClinicalData); app.AddPolicy(PermissionPolicyIdentifiers.ReadMetadata); app = securityAppService.Insert(app); metadataService.Insert(new Core.Model.DataTypes.AssigningAuthority("TEST", "TEST", "1.2.3.4.5.6.7") { IsUnique = true, AssigningApplicationKey = app.Key }); metadataService.Insert(new Core.Model.DataTypes.AssigningAuthority("SSN", "US Social Security Number", "2.16.840.1.113883.4.1") { IsUnique = false, Url = "http://hl7.org/fhir/sid/us-ssn", AssigningApplicationKey = app.Key }); // Add another application for security checks dev = new SecurityDevice() { DeviceSecret = "DEVICESECRET2", Name = "TEST_HARNESS2|TEST" }; dev.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); securityDevService.Insert(dev); app = new SecurityApplication() { Name = "TEST_HARNESS2", ApplicationSecret = "APPLICATIONSECRET2" }; app.AddPolicy(PermissionPolicyIdentifiers.LoginAsService); app.AddPolicy(PermissionPolicyIdentifiers.UnrestrictedClinicalData); app.AddPolicy(PermissionPolicyIdentifiers.ReadMetadata); securityAppService.Insert(app); }
public SecurityApplication CreateApplication(SecurityApplication application) { throw new NotSupportedException(); }
/// <summary> /// Start the application context /// </summary> public static bool StartContext(IDialogProvider dialogProvider, String instanceName, SecurityApplication applicationId, SanteDBHostType hostType) { // Not configured if (!new DcConfigurationManager(instanceName).IsConfigured) { return(false); } else { // Set master application context DcApplicationContext retVal = null; try { try { retVal = new DcApplicationContext(dialogProvider, instanceName, applicationId, hostType); ApplicationServiceContext.Current = DcApplicationContext.Current = retVal; //retVal.AddServiceProvider(typeof(ConfigurationManager)); if (retVal.ConfigurationPersister == null) { throw new InvalidOperationException("Missing configuration persistence service"); } retVal.ConfigurationPersister.Backup(retVal.Configuration); } catch (Exception e) { Trace.TraceWarning("Error loading configuration: {0}", e); if (retVal.ConfigurationPersister.HasBackup() && retVal.Confirm(Strings.err_configuration_invalid_restore_prompt)) { retVal.ConfigurationPersister.Restore(); retVal.ConfigurationManager.Reload(); } else { throw new Exception("Could not load or backup configuration", e); } } if (retVal.GetService <IBackupService>() == null) { retVal.GetService <IServiceManager>().AddServiceProvider(typeof(DefaultBackupService)); } // Is there a backup, and if so, does the user want to restore from that backup? var backupSvc = retVal.GetService <IBackupService>(); if (retVal.ConfigurationManager.GetAppSetting("ignore.restore") == null && backupSvc.HasBackup(BackupMedia.Public) && retVal.Confirm(Strings.locale_confirm_restore)) { backupSvc.Restore(BackupMedia.Public); } else { backupSvc.AutoRestore(); } // Ignore restoration if (retVal.ConfigurationManager.GetAppSetting("ignore.restore") == null) { retVal.Configuration.GetSection <ApplicationServiceContextConfigurationSection>().AppSettings.Add(new AppSettingKeyValuePair() { Key = "ignore.restore", Value = "true" }); } // Add tracers retVal.m_tracer = Tracer.GetTracer(typeof(DcApplicationContext)); retVal.m_tracer.TraceInfo("Starting logging infrastructure"); var configuration = retVal.Configuration.GetSection <DiagnosticsConfigurationSection>(); foreach (var tr in configuration.TraceWriter) { Tracer.AddWriter(Activator.CreateInstance(tr.TraceWriter, tr.Filter, tr.InitializationData, configuration.Sources.ToDictionary(o => o.SourceName, o => o.Filter)) as TraceWriter, tr.Filter); } retVal.SetProgress("Loading configuration", 0.2f); // Load all user-downloaded applets in the data directory var configuredApplets = retVal.Configuration.GetSection <AppletConfigurationSection>().Applets; var appletService = retVal.GetService <IAppletManagerService>(); var updateService = retVal.GetService <IUpdateManager>(); foreach (var appletInfo in configuredApplets.ToArray())// Directory.GetFiles(this.m_configuration.GetSection<AppletConfigurationSection>().AppletDirectory)) { { try { retVal.m_tracer.TraceInfo("Loading applet {0}", appletInfo); String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); using (var fs = File.OpenRead(appletPath)) { AppletManifest manifest = AppletManifest.Load(fs); // Is this applet in the allowed applets // public key token match? if (appletInfo.PublicKeyToken != manifest.Info.PublicKeyToken) { retVal.m_tracer.TraceWarning("Applet {0} failed validation", appletInfo); ; // TODO: Raise an error } appletService.LoadApplet(manifest); } } catch (Exception e) { if (retVal.Confirm(String.Format(Strings.err_applet_corrupt_reinstall, appletInfo.Id))) { String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); if (File.Exists(appletPath)) { File.Delete(appletPath); } try { configuredApplets.Remove(appletInfo); updateService.Install(appletInfo.Id); } catch { retVal.Alert(String.Format(Strings.err_updateFailed)); } } else { retVal.m_tracer.TraceError("Loading applet {0} failed: {1}", appletInfo, e.ToString()); throw new Exception($"Could not load applet {appletInfo}", e); } } } // Set the entity source EntitySource.Current = new EntitySource(retVal.GetService <IEntitySourceProvider>()); ApplicationServiceContext.Current = ApplicationContext.Current; // Ensure data migration exists bool hasDatabase = retVal.ConfigurationManager.Configuration.GetSection <DcDataConfigurationSection>().ConnectionString.Count > 0; try { // If the DB File doesn't exist we have to clear the migrations if (hasDatabase && !File.Exists(retVal.ConfigurationManager.GetConnectionString(retVal.Configuration.GetSection <DcDataConfigurationSection>().MainDataSourceConnectionStringName).GetComponent("dbfile"))) { retVal.m_tracer.TraceWarning("Can't find the SanteDB database, will re-install all migrations"); retVal.Configuration.GetSection <DcDataConfigurationSection>().MigrationLog.Entry.Clear(); } retVal.SetProgress("Migrating databases", 0.6f); ConfigurationMigrator migrator = new ConfigurationMigrator(); migrator.Ensure(hasDatabase); // Prepare clinical protocols //retVal.GetService<ICarePlanService>().Repository = retVal.GetService<IClinicalProtocolRepositoryService>(); } catch (Exception e) { retVal.m_tracer.TraceError(e.ToString()); throw new Exception("Error executing migrations", e); } finally { retVal.ConfigurationPersister.Save(retVal.Configuration); } // Update the applets if there are new versions foreach (var appPath in Directory.GetFiles(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "applets"))) { try { using (var fs = File.OpenRead(appPath)) { retVal.m_tracer.TraceInfo("Checking if {0} is upgradable", appPath); AppletPackage package = AppletPackage.Load(fs); var existing = appletService.GetApplet(package.Meta.Id); retVal.m_tracer.TraceInfo("{0} = {1} , existing = {2}", appPath, package.Meta, existing?.Info); if (existing == null || new Version(existing.Info.Version) < new Version(package.Meta.Version)) { if (existing != null) { retVal.m_tracer.TraceInfo("Upgrading applet {0} from {1} to {2}", package.Meta.Id, existing.Info.Version, package.Meta.Version); } appletService.Install(package, true); } } } catch (Exception e) { retVal.m_tracer.TraceError("Checking upgrade for applet {0} failed: {1}", appPath, e.ToString()); } } if (retVal.GetService <IThreadPoolService>() == null) { throw new InvalidOperationException(("Missing thread pool service(s)")); } // Start daemons updateService?.AutoUpdate(); retVal.GetService <IThreadPoolService>().QueueUserWorkItem((o) => retVal.Start()); //retVal.Start(); } catch (Exception e) { //ApplicationContext.Current = null; throw new Exception("Error starting context", e); } return(true); } }
/// <summary> /// SanteDB Service /// </summary> public SanteDbService(string instanceName, SecurityApplication applicationIdentity) { InitializeComponent(); this.m_applicationIdentity = applicationIdentity; this.ServiceName = instanceName; }
static void Main(string[] args) { // Output main header var parser = new ParameterParser <ConsoleParameters>(); Parameters = parser.Parse(args); // Output copyright info var entryAsm = Assembly.GetEntryAssembly(); AppDomain.CurrentDomain.AssemblyResolve += (o, e) => { string pAsmName = e.Name; if (pAsmName.Contains(",")) { pAsmName = pAsmName.Substring(0, pAsmName.IndexOf(",")); } var asm = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => e.Name == a.FullName) ?? AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => pAsmName == a.GetName().Name); return(asm); }; try { // Security Application Information var applicationIdentity = new SecurityApplication() { Key = Guid.Parse("feeca9f3-805e-4be9-a5c7-30e6e495939b"), ApplicationSecret = Parameters.ApplicationSecret ?? "FE78825ADB56401380DBB406411221FD", Name = Parameters.ApplicationName ?? "org.santedb.disconnected_client.win32" }; // Setup basic parameters String[] directory = { Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SanteDB", "dc-win32"), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SanteDB", "dc-win32") }; foreach (var dir in directory) { if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } } ServicePointManager.DefaultConnectionLimit = 2; ServicePointManager.MaxServicePointIdleTime = 100; TokenValidationManager.SymmetricKeyValidationCallback += (o, k, i) => { return(MessageBox.Show(String.Format("Trust issuer {0} with symmetric key?", i), "Token Validation Error", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes); }; ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, error) => { if (certificate == null || chain == null) { return(false); } else { var valid = s_trustedCerts.Contains(certificate.Subject); if (!valid && (chain.ChainStatus.Length > 0 || error != SslPolicyErrors.None)) { if (MessageBox.Show(String.Format("The remote certificate is not trusted. The error was {0}. The certificate is: \r\n{1}\r\nWould you like to temporarily trust this certificate?", error, certificate.Subject), "Certificate Error", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No) { return(false); } else { s_trustedCerts.Add(certificate.Subject); } } return(true); //isValid &= chain.ChainStatus.Length == 0; } }; if (Parameters.ShowHelp) { parser.WriteHelp(Console.Out); } else if (Parameters.Reset && MessageBox.Show("Are you sure you want to wipe all your data and configuration for the Disconnected Client?", "Confirm Reset", MessageBoxButtons.OKCancel) == DialogResult.OK) { var appData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SanteDB", "dc-win32"); var cData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SanteDB", "dc-win32"); if (Directory.Exists(appData)) { Directory.Delete(cData, true); } if (Directory.Exists(appData)) { Directory.Delete(appData, true); } MessageBox.Show("Environment Reset Successful"); return; } else // RUN THE SERVICE { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var settings = new CefSettings() { UserAgent = $"SanteDB-DC", ExternalMessagePump = false, MultiThreadedMessageLoop = true, LogFile = Path.Combine(directory[1], "cef-sdb.log"), CachePath = Path.Combine(directory[1], ".cache"), RootCachePath = Path.Combine(directory[1], ".root-cache") }; CefSharpSettings.WcfEnabled = true; CefSharpSettings.SubprocessExitIfParentProcessClosed = true; CefSharpSettings.ShutdownOnExit = true; Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null); Cef.EnableHighDPISupport(); frmDisconnectedClient frmMain = null; frmSplash splash = new frmSplash(); splash.Show(); if (!DcApplicationContext.StartContext(new WinFormsDialogProvider(), "dc-win32", applicationIdentity, Core.SanteDBHostType.Client)) { if (!DcApplicationContext.StartTemporary(new WinFormsDialogProvider(), "dc-win32", applicationIdentity, Core.SanteDBHostType.Client)) { MessageBox.Show("There was an error starting up the Disconnected Client. Please see logs in %localappdata%\\log for more information"); Cef.Shutdown(); Application.Exit(); Environment.Exit(666); return; } else { while (!DcApplicationContext.Current.IsRunning) { Application.DoEvents(); } frmMain = new frmDisconnectedClient("http://127.0.0.1:9200/#!/config/initialSettings"); } } else { while (!DcApplicationContext.Current.IsRunning) { Application.DoEvents(); } frmMain = new frmDisconnectedClient("http://127.0.0.1:9200/"); } splash.Close(); ApplicationContext.Current.GetService <IConfigurationManager>().SetAppSetting("http.bypassMagic", ""); Application.Run(frmMain); } } catch (Exception e) { MessageBox.Show(String.Format("FATAL ERROR ON STARTUP: {0}", e.ToString()), "Error"); Cef.Shutdown(); Application.Exit(); Environment.Exit(996); } finally { Cef.Shutdown(); } }
/// <summary> /// Initializes a new instance of the <see cref="DcApplicationContext"/> class. /// </summary> /// <param name="dialogProvider">Dialog provider.</param> public DcApplicationContext(IDialogProvider dialogProvider, String instanceName, SecurityApplication applicationId, SanteDBHostType hostType) : base(new DcConfigurationManager(instanceName)) { this.m_dialogProvider = dialogProvider; c_application = applicationId; this.InstanceName = instanceName; this.m_santeDBHostType = hostType; }
public SecurityApplication SaveApplication(SecurityApplication application) { throw new NotImplementedException(); }
/// <summary> /// Start a restore context /// </summary> /// <returns></returns> public static bool StartRestore(IDialogProvider dialogProvider, String instanceName, SecurityApplication applicationId, SanteDBHostType hostType) { try { var retVal = new DcApplicationContext(dialogProvider, instanceName, applicationId, hostType); retVal.SetProgress("Start restore", 0); //retVal.AddServiceProvider(typeof(ConfigurationManager)); ApplicationServiceContext.Current = DcApplicationContext.Current = retVal; retVal.m_tracer = Tracer.GetTracer(typeof(DcApplicationContext)); var configuration = retVal.Configuration.GetSection <DiagnosticsConfigurationSection>(); foreach (var tr in configuration.TraceWriter) { Tracer.AddWriter(Activator.CreateInstance(tr.TraceWriter, tr.Filter, tr.InitializationData, configuration.Sources.ToDictionary(o => o.SourceName, o => o.Filter)) as TraceWriter, tr.Filter); } retVal.GetService <IServiceManager>().AddServiceProvider(typeof(DefaultBackupService)); return(true); } catch (Exception e) { Console.WriteLine("SanteDB FATAL: {0}", e.ToString()); return(false); } }
/// <summary> /// Starts the application context using in-memory default configuration for the purposes of /// configuring the software /// </summary> /// <returns><c>true</c>, if temporary was started, <c>false</c> otherwise.</returns> public static bool StartTemporary(IDialogProvider dialogProvider, String instanceName, SecurityApplication applicationId, SanteDBHostType hostType) { try { var retVal = new DcApplicationContext(dialogProvider, instanceName, applicationId, hostType); retVal.SetProgress("Run setup", 0); //retVal.AddServiceProvider(typeof(ConfigurationManager)); ApplicationServiceContext.Current = DcApplicationContext.Current = retVal; retVal.m_tracer = Tracer.GetTracer(typeof(DcApplicationContext)); var configuration = retVal.Configuration.GetSection <DiagnosticsConfigurationSection>(); foreach (var tr in configuration.TraceWriter) { Tracer.AddWriter(Activator.CreateInstance(tr.TraceWriter, tr.Filter, tr.InitializationData, configuration.Sources.ToDictionary(o => o.SourceName, o => o.Filter)) as TraceWriter, tr.Filter); } retVal.GetService <IServiceManager>().AddServiceProvider(typeof(DefaultBackupService)); var appletService = retVal.GetService <IAppletManagerService>(); retVal.SetProgress("Loading configuration", 0.2f); // Load all user-downloaded applets in the data directory foreach (var appPath in Directory.GetFiles(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "applets"))) { try { retVal.m_tracer.TraceInfo("Installing applet {0}", appPath); using (var fs = File.OpenRead(appPath)) { AppletPackage package = AppletPackage.Load(fs); appletService.Install(package, true); } } catch (Exception e) { retVal.m_tracer.TraceError("Loading applet {0} failed: {1}", appPath, e.ToString()); throw; } } retVal.GetService <IThreadPoolService>().QueueUserWorkItem((o) => retVal.Start()); return(true); } catch (Exception e) { Console.WriteLine("SanteDB FATAL: {0}", e.ToString()); return(false); } }