Exemple #1
0
        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;
            }
        }
Exemple #4
0
        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;
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
 /// <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();
 }
Exemple #8
0
        //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));
 }
Exemple #11
0
        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));
        }
Exemple #12
0
        /// <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);
            }
        }
Exemple #13
0
        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;
            }
        }
Exemple #15
0
        /// <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);
            }
        }
Exemple #16
0
 /// <summary>
 /// Force delay loading
 /// </summary>
 public override void Refresh()
 {
     base.Refresh();
     this.m_securityApplication = null;
 }
Exemple #17
0
        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);
        }
Exemple #18
0
 public SecurityApplication CreateApplication(SecurityApplication application)
 {
     throw new NotSupportedException();
 }
Exemple #19
0
        /// <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);
            }
        }
Exemple #20
0
 /// <summary>
 /// SanteDB Service
 /// </summary>
 public SanteDbService(string instanceName, SecurityApplication applicationIdentity)
 {
     InitializeComponent();
     this.m_applicationIdentity = applicationIdentity;
     this.ServiceName           = instanceName;
 }
Exemple #21
0
        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();
            }
        }
Exemple #22
0
 /// <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();
 }
Exemple #24
0
        /// <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);
            }
        }
Exemple #25
0
        /// <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);
            }
        }