public FactoryResult TryCreate(WhitelistApplication settings, out IApplication application)
        {
            var name = $"'{settings.DisplayName}' ({ settings.ExecutableName})";

            application = default(IApplication);

            try
            {
                var success = TryFindApplication(settings, out var executablePath);

                if (success)
                {
                    application = BuildApplication(executablePath, settings);
                    application.Initialize();

                    logger.Debug($"Successfully initialized application {name}.");

                    return(FactoryResult.Success);
                }

                logger.Error($"Could not find application {name}!");

                return(FactoryResult.NotFound);
            }
            catch (Exception e)
            {
                logger.Error($"Unexpected error while trying to initialize application {name}!", e);
            }

            return(FactoryResult.Error);
        }
        private IApplication BuildApplication(string executablePath, WhitelistApplication settings)
        {
            var applicationLogger = logger.CloneFor(settings.DisplayName);
            var application       = new ExternalApplication(applicationMonitor, executablePath, applicationLogger, nativeMethods, processFactory, settings);

            return(application);
        }
        public void Perform_MustAbortIfUserCancelsApplicationLocationSelection()
        {
            var application         = new Mock <IApplication>().Object;
            var applicationSettings = new WhitelistApplication {
                AllowCustomPath = true
            };
            var args = default(ActionRequiredEventArgs);

            context.Settings.Applications.Whitelist.Add(applicationSettings);
            factory.Setup(f => f.TryCreate(It.IsAny <WhitelistApplication>(), out application)).Returns(FactoryResult.NotFound);
            monitor.Setup(m => m.Initialize(It.IsAny <ApplicationSettings>())).Returns(new InitializationResult());
            sut.ActionRequired += (a) =>
            {
                args = a;

                if (a is ApplicationNotFoundEventArgs n)
                {
                    n.Success = false;
                }
            };

            var result = sut.Perform();

            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == applicationSettings), out application), Times.Once);

            Assert.AreEqual(OperationResult.Success, result);
            Assert.IsInstanceOfType(args, typeof(ApplicationInitializationFailedEventArgs));
        }
        public void Perform_MustInitializeApplications()
        {
            var application1         = new Mock <IApplication>().Object;
            var application2         = new Mock <IApplication>().Object;
            var application3         = new Mock <IApplication>().Object;
            var application1Settings = new WhitelistApplication();
            var application2Settings = new WhitelistApplication();
            var application3Settings = new WhitelistApplication();

            context.Settings.Applications.Whitelist.Add(application1Settings);
            context.Settings.Applications.Whitelist.Add(application2Settings);
            context.Settings.Applications.Whitelist.Add(application3Settings);
            factory.Setup(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application1Settings), out application1)).Returns(FactoryResult.Success);
            factory.Setup(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application2Settings), out application2)).Returns(FactoryResult.Success);
            factory.Setup(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application3Settings), out application3)).Returns(FactoryResult.Success);
            monitor.Setup(m => m.Initialize(It.IsAny <ApplicationSettings>())).Returns(new InitializationResult());

            var result = sut.Perform();

            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application1Settings), out application1), Times.Once);
            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application1Settings), out application2), Times.Once);
            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == application1Settings), out application3), Times.Once);
            monitor.Verify(m => m.Initialize(It.Is <ApplicationSettings>(s => s == context.Settings.Applications)), Times.Once);
            monitor.Verify(m => m.TryTerminate(It.IsAny <RunningApplication>()), Times.Never);

            Assert.AreEqual(OperationResult.Success, result);
        }
        public void Perform_MustAllowUserToChooseApplicationLocation()
        {
            var application         = new Mock <IApplication>().Object;
            var applicationSettings = new WhitelistApplication {
                AllowCustomPath = true
            };
            var args          = default(ActionRequiredEventArgs);
            var attempt       = 0;
            var correct       = new Random().Next(2, 50);
            var factoryResult = new Func <FactoryResult>(() => ++ attempt == correct ? FactoryResult.Success : FactoryResult.NotFound);

            context.Settings.Applications.Whitelist.Add(applicationSettings);
            factory.Setup(f => f.TryCreate(It.IsAny <WhitelistApplication>(), out application)).Returns(factoryResult);
            monitor.Setup(m => m.Initialize(It.IsAny <ApplicationSettings>())).Returns(new InitializationResult());
            sut.ActionRequired += (a) =>
            {
                args = a;

                if (a is ApplicationNotFoundEventArgs n)
                {
                    n.Success = true;
                }
            };

            var result = sut.Perform();

            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == applicationSettings), out application), Times.Exactly(correct));

            Assert.AreEqual(OperationResult.Success, result);
            Assert.IsInstanceOfType(args, typeof(ApplicationNotFoundEventArgs));
        }
Пример #6
0
        private void Initialize(WhitelistApplication settings)
        {
            var result = factory.TryCreate(settings, out var application);

            while (result == FactoryResult.NotFound && settings.AllowCustomPath)
            {
                var args = new ApplicationNotFoundEventArgs(settings.DisplayName, settings.ExecutableName);

                ActionRequired?.Invoke(args);

                if (args.Success)
                {
                    settings.ExecutablePath = args.CustomPath;
                    result = factory.TryCreate(settings, out application);
                }
                else
                {
                    break;
                }
            }

            if (result == FactoryResult.Success)
            {
                Context.Applications.Add(application);
            }
            else
            {
                logger.Error($"Failed to initialize application '{settings.DisplayName}' ({settings.ExecutableName}). Reason: {result}.");
                ActionRequired?.Invoke(new ApplicationInitializationFailedEventArgs(settings.DisplayName, settings.ExecutableName, result));
            }
        }
Пример #7
0
        private bool BelongsToApplication(IProcess process, WhitelistApplication application)
        {
            var ignoreOriginalName = string.IsNullOrWhiteSpace(application.OriginalName);
            var sameName           = process.Name.Equals(application.ExecutableName, StringComparison.OrdinalIgnoreCase);
            var sameOriginalName   = process.OriginalName?.Equals(application.OriginalName, StringComparison.OrdinalIgnoreCase) == true;

            return(sameName && (ignoreOriginalName || sameOriginalName));
        }
        private bool TryFindApplication(WhitelistApplication settings, out string mainExecutable)
        {
            var paths        = new List <string[]>();
            var registryPath = QueryPathFromRegistry(settings);

            mainExecutable = default(string);

            paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), settings.ExecutableName });
            paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), settings.ExecutableName });
            paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.System), settings.ExecutableName });
            paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), settings.ExecutableName });
            paths.Add(new[] { Environment.GetEnvironmentVariable("MonitoPath"), settings.ExecutableName });

            if (settings.ExecutablePath != default(string))
            {
                paths.Add(new[] { settings.ExecutablePath, settings.ExecutableName });
                paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), settings.ExecutablePath, settings.ExecutableName });
                paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), settings.ExecutablePath, settings.ExecutableName });
                paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.System), settings.ExecutablePath, settings.ExecutableName });
                paths.Add(new[] { Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), settings.ExecutablePath, settings.ExecutableName });
                paths.Add(new[] { Environment.GetEnvironmentVariable("MonitoPath"), settings.ExecutablePath, settings.ExecutableName });
            }

            if (registryPath != default(string))
            {
                paths.Add(new[] { registryPath, settings.ExecutableName });

                if (settings.ExecutablePath != default(string))
                {
                    paths.Add(new[] { registryPath, settings.ExecutablePath, settings.ExecutableName });
                }
            }

            foreach (var path in paths)
            {
                try
                {
                    mainExecutable = Path.Combine(path);
                    mainExecutable = Environment.ExpandEnvironmentVariables(mainExecutable);

                    if (File.Exists(mainExecutable))
                    {
                        return(true);
                    }
                }
                catch (Exception e)
                {
                    logger.Error($"Failed to test path {string.Join(@"\", path)}!", e);
                }
            }

            return(false);
        }
 internal ExternalApplication(
     IApplicationMonitor applicationMonitor,
     string executablePath,
     IModuleLogger logger,
     INativeMethods nativeMethods,
     IProcessFactory processFactory,
     WhitelistApplication settings)
 {
     this.applicationMonitor = applicationMonitor;
     this.executablePath     = executablePath;
     this.logger             = logger;
     this.nativeMethods      = nativeMethods;
     this.instances          = new List <ExternalApplicationInstance>();
     this.processFactory     = processFactory;
     this.settings           = settings;
 }
        public void Perform_MustIndicateApplicationInitializationFailure()
        {
            var application         = new Mock <IApplication>().Object;
            var applicationSettings = new WhitelistApplication();
            var args = default(ActionRequiredEventArgs);

            context.Settings.Applications.Whitelist.Add(applicationSettings);
            factory.Setup(f => f.TryCreate(It.IsAny <WhitelistApplication>(), out application)).Returns(FactoryResult.Error);
            monitor.Setup(m => m.Initialize(It.IsAny <ApplicationSettings>())).Returns(new InitializationResult());
            sut.ActionRequired += (a) => args = a;

            var result = sut.Perform();

            factory.Verify(f => f.TryCreate(It.Is <WhitelistApplication>(a => a == applicationSettings), out application), Times.Once);

            Assert.AreEqual(OperationResult.Success, result);
            Assert.IsInstanceOfType(args, typeof(ApplicationInitializationFailedEventArgs));
        }
        private string QueryPathFromRegistry(WhitelistApplication settings)
        {
            try
            {
                using (var key = Registry.LocalMachine.OpenSubKey($@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{settings.ExecutableName}"))
                {
                    if (key != null)
                    {
                        return(key.GetValue("Path") as string);
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error($"Failed to query path in registry for '{settings.ExecutableName}'!", e);
            }

            return(default(string));
        }
Пример #12
0
        public void Perform_MustNotAddApplicationsToShellIfNotEnabled()
        {
            var application1         = new Mock <IApplication>();
            var application1Settings = new WhitelistApplication {
                ShowInShell = true
            };
            var application2         = new Mock <IApplication>();
            var application2Settings = new WhitelistApplication {
                ShowInShell = true
            };
            var application3         = new Mock <IApplication>();
            var application3Settings = new WhitelistApplication {
                ShowInShell = true
            };

            application1.SetupGet(a => a.Id).Returns(application1Settings.Id);
            application2.SetupGet(a => a.Id).Returns(application2Settings.Id);
            application3.SetupGet(a => a.Id).Returns(application3Settings.Id);

            context.Applications.Add(application1.Object);
            context.Applications.Add(application2.Object);
            context.Applications.Add(application3.Object);
            context.Settings.ActionCenter.EnableActionCenter = false;
            context.Settings.Taskbar.EnableTaskbar           = false;
            context.Settings.Applications.Whitelist.Add(application1Settings);
            context.Settings.Applications.Whitelist.Add(application2Settings);
            context.Settings.Applications.Whitelist.Add(application3Settings);

            sut.Perform();

            actionCenter.Verify(a => a.AddApplicationControl(It.IsAny <IApplicationControl>(), false), Times.Never);
            taskbar.Verify(t => t.AddApplicationControl(It.IsAny <IApplicationControl>(), false), Times.Never);
            taskview.Verify(t => t.Add(It.Is <IApplication>(a => a == application1.Object)), Times.Once);
            taskview.Verify(t => t.Add(It.Is <IApplication>(a => a == application2.Object)), Times.Once);
            taskview.Verify(t => t.Add(It.Is <IApplication>(a => a == application3.Object)), Times.Once);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application1.Object), Location.ActionCenter), Times.Never);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application1.Object), Location.Taskbar), Times.Never);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application2.Object), Location.ActionCenter), Times.Never);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application2.Object), Location.Taskbar), Times.Never);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application3.Object), Location.ActionCenter), Times.Never);
            uiFactory.Verify(f => f.CreateApplicationControl(It.Is <IApplication>(a => a == application3.Object), Location.Taskbar), Times.Never);
        }
Пример #13
0
        public void MustRemoveLegacyBrowserEngines()
        {
            var settings = new AppSettings();
            var firefox  = new WhitelistApplication {
                ExecutablePath = @"C:\Program Files (x86)\Mozilla Firefox", ExecutableName = "firefox.exe"
            };

            settings.Applications.Whitelist.Add(new WhitelistApplication {
                ExecutablePath = @"C:\some\path\xulrunner\etc", ExecutableName = "firefox.exe"
            });
            settings.Applications.Whitelist.Add(new WhitelistApplication {
                ExecutablePath = @"C:\some\path\xulrunner\etc", ExecutableName = "xulrunner.exe"
            });
            settings.Applications.Whitelist.Add(firefox);

            sut.Process(Mock.Of <IDictionary <string, object> >(), settings);

            Assert.AreEqual(1, settings.Applications.Whitelist.Count);
            Assert.AreSame(firefox, settings.Applications.Whitelist[0]);
        }
        private void MapApplicationWhitelist(AppSettings settings, object value)
        {
            if (value is IList <object> applications)
            {
                foreach (var item in applications)
                {
                    if (item is IDictionary <string, object> applicationData)
                    {
                        var isActive         = applicationData.TryGetValue(Keys.Applications.Active, out var v) && v is bool active && active;
                        var isWindowsProcess = applicationData.TryGetValue(Keys.Applications.OperatingSystem, out v) && v is int os && os == Keys.WINDOWS;

                        if (isActive && isWindowsProcess)
                        {
                            var application = new WhitelistApplication();

                            if (applicationData.TryGetValue(Keys.Applications.AllowCustomPath, out v) && v is bool allowCustomPath)
                            {
                                application.AllowCustomPath = allowCustomPath;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.AllowRunning, out v) && v is bool allowRunning)
                            {
                                application.AllowRunning = allowRunning;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.Arguments, out v) && v is IList <object> arguments)
                            {
                                foreach (var argumentItem in arguments)
                                {
                                    if (argumentItem is IDictionary <string, object> argumentData)
                                    {
                                        var argActive = argumentData.TryGetValue(Keys.Applications.Active, out v) && v is bool a && a;

                                        if (argActive && argumentData.TryGetValue(Keys.Applications.Argument, out v) && v is string argument)
                                        {
                                            application.Arguments.Add(argument);
                                        }
                                    }
                                }
                            }

                            if (applicationData.TryGetValue(Keys.Applications.AutoStart, out v) && v is bool autoStart)
                            {
                                application.AutoStart = autoStart;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.AutoTerminate, out v) && v is bool autoTerminate)
                            {
                                application.AutoTerminate = autoTerminate;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.Description, out v) && v is string description)
                            {
                                application.Description = description;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.DisplayName, out v) && v is string displayName)
                            {
                                application.DisplayName = displayName;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.ExecutableName, out v) && v is string executableName)
                            {
                                application.ExecutableName = executableName;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.ExecutablePath, out v) && v is string executablePath)
                            {
                                application.ExecutablePath = executablePath;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.OriginalName, out v) && v is string originalName)
                            {
                                application.OriginalName = originalName;
                            }

                            if (applicationData.TryGetValue(Keys.Applications.ShowInShell, out v) && v is bool showInShell)
                            {
                                application.ShowInShell = showInShell;
                            }

                            settings.Applications.Whitelist.Add(application);
                        }
                    }
                }
            }
        }