private static AppInstallerConfig GetConfig(Action <AppInstallerConfig> configurator = null)
        {
            var newConfig = new AppInstallerConfig();

            configurator?.Invoke(newConfig);
            return(newConfig);
        }
Exemple #2
0
        public int GetLowestSupportedWindows10Build(AppInstallerConfig config)
        {
            var windowsBuild = 1709;

            if (config.UpdateSettings != null)
            {
                if (config.UpdateSettings.ForceUpdateFromAnyVersion)
                {
                    windowsBuild = Math.Max(windowsBuild, 1809);
                }

                if (config.UpdateSettings.AutomaticBackgroundTask != null)
                {
                    windowsBuild = Math.Max(windowsBuild, 1803);
                }

                if (config.UpdateSettings.OnLaunch != null)
                {
                    if (config.UpdateSettings.OnLaunch.UpdateBlocksActivation || config.UpdateSettings.OnLaunch.ShowPrompt)
                    {
                        windowsBuild = Math.Max(windowsBuild, 1903);
                    }
                }
            }

            return(windowsBuild);
        }
Exemple #3
0
 private void InstallModule(AppInstallerConfig requestData, IHttpContextProxy httpProxy)
 {
     foreach (var item in requestData.DefaultModules)
     {
         _moduleInstaller.Install(item, httpProxy);
     }
 }
        public void AppConfigInit()
        {
            AppInstallerConfig installConfig = new AppInstallerConfig()
            {
                InstallType = AppInstallType.New
            };

            Assert.IsNotNull(installConfig);
        }
Exemple #5
0
        private void WriteCustomConfig(AppInstallerConfig requestData)
        {
            JObject customConfig = JObject.Parse(@"{
                    'groups': [
                        'user',
                        'sys_admin'
                    ]
                }");

            customConfig[CommonConst.CommonField.USER_TYPE]         = UserIDType.Email.ToString();
            customConfig[CommonConst.CommonField.IS_EMAIL_VALIDATE] = true;
            customConfig[CommonConst.CommonField.IS_ENABLED]        = true;

            customConfig[CommonConst.CommonField.DATA_KEY]            =
                customConfig[CommonConst.CommonField.NAME]            =
                    customConfig[CommonConst.CommonField.EMAIL]       =
                        customConfig[CommonConst.CommonField.USER_ID] = requestData.AdminAccount;
            customConfig[CommonConst.CommonField.PASSWORD]            = _encryptionService.GetHash(requestData.AdminPassword);

            JArray configData = new JArray();

            configData.Add(customConfig);

            var    path       = GetCustomConfigDirectoryPath();
            string configFile = string.Format("{0}\\{1}{2}", path, CommonConst.Collection.USERS, CommonConst.CONFIG_FILE_EXTENSION);

            JObjectHelper.WriteJSONData(configFile, configData);

            customConfig = new JObject();
            customConfig[CommonConst.CommonField.DATA_KEY] = CommonConst.CommonField.NAME;
            customConfig[CommonConst.CommonField.VALUE]    = requestData.Name;
            configData = new JArray();
            configData.Add(customConfig);
            configFile = string.Format("{0}\\{1}{2}", path, CommonConst.Collection.APP_INFO, CommonConst.CONFIG_FILE_EXTENSION);
            JObjectHelper.WriteJSONData(configFile, configData);

            configData = new JArray();
            foreach (var item in requestData.DefaultModules)
            {
                customConfig = new JObject();
                customConfig[CommonConst.CommonField.DATA_KEY] = item;
                customConfig[CommonConst.CommonField.VALUE]    = item;
                configData.Add(customConfig);
            }
            configFile = string.Format("{0}\\{1}{2}", path, CommonConst.Collection.DEFAULT_INSTALL_MODULES, CommonConst.CONFIG_FILE_EXTENSION);
            JObjectHelper.WriteJSONData(configFile, configData);
        }
        public AppInstallerBuilder(AppInstallerConfig appInstaller)
        {
            this.ShowPrompt = appInstaller.UpdateSettings?.OnLaunch?.ShowPrompt == true;
            this.HoursBetweenUpdateChecks = appInstaller.UpdateSettings?.OnLaunch?.HoursBetweenUpdateChecks ?? 0;
            this.Version                = appInstaller.Version;
            this.AllowDowngrades        = appInstaller.UpdateSettings?.ForceUpdateFromAnyVersion == true;
            this.UpdateBlocksActivation = appInstaller.UpdateSettings?.OnLaunch?.UpdateBlocksActivation == true;
            this.RedirectUri            = Uri.TryCreate(appInstaller.Uri ?? string.Empty, UriKind.Absolute, out var parsed) ? parsed  : null;

            var checkOnLaunch   = appInstaller.UpdateSettings?.OnLaunch != null;
            var checkBackground = appInstaller.UpdateSettings?.AutomaticBackgroundTask != null;

            if (checkBackground && checkOnLaunch)
            {
                this.CheckForUpdates = AppInstallerUpdateCheckingMethod.LaunchAndBackground;
            }
            else if (checkBackground)
            {
                this.CheckForUpdates = AppInstallerUpdateCheckingMethod.Background;
            }
            else if (checkOnLaunch)
            {
                this.CheckForUpdates = AppInstallerUpdateCheckingMethod.Launch;
            }
            else
            {
                this.CheckForUpdates = AppInstallerUpdateCheckingMethod.Never;
            }

            this.MainPackageUri = Uri.TryCreate(appInstaller.MainPackage?.Uri ?? appInstaller.MainBundle?.Uri ?? string.Empty, UriKind.Absolute, out var parsedUri) ? parsedUri : null;

            if (appInstaller.MainPackage?.Architecture != null)
            {
                this.MainPackageArchitecture = (AppxPackageArchitecture)Enum.Parse(typeof(AppxPackageArchitecture), appInstaller.MainPackage.Architecture.ToString("G"), true);
            }
            else
            {
                this.MainPackageArchitecture = AppxPackageArchitecture.Neutral;
            }

            this.MainPackageVersion   = appInstaller.MainPackage?.Version ?? appInstaller.MainPackage?.Version;
            this.MainPackageType      = appInstaller.MainPackage == null && appInstaller.MainBundle != null ? PackageType.Bundle : PackageType.Package;
            this.MainPackagePublisher = appInstaller.MainPackage?.Publisher ?? appInstaller.MainBundle?.Publisher;
            this.MainPackageName      = appInstaller.MainPackage?.Name ?? appInstaller.MainBundle?.Name;
        }
        public async Task Create(AppInstallerConfig config, string file, CancellationToken cancellationToken = default, IProgress <ProgressData> progress = default)
        {
            var fileInfo = new FileInfo(file);

            // ReSharper disable once PossibleNullReferenceException
            if (!fileInfo.Directory.Exists)
            {
                fileInfo.Directory.Create();
            }

            using (var textWriter = new Utf8StringWriter())
            {
                var supportHelper   = new AppInstallerFeatureSupportHelper();
                var lowestNamespace = supportHelper.GetLowestCommonNamespace(config);

                var xmlns = new XmlSerializerNamespaces();
                xmlns.Add("", lowestNamespace);

                switch (lowestNamespace)
                {
                case "http://schemas.microsoft.com/appx/appinstaller/2017":
                    new XmlSerializer(typeof(AppInstallerConfig2017)).Serialize(textWriter, new AppInstallerConfig2017(config), xmlns);
                    break;

                case "http://schemas.microsoft.com/appx/appinstaller/2017/2":
                    new XmlSerializer(typeof(AppInstallerConfig20172)).Serialize(textWriter, new AppInstallerConfig20172(config), xmlns);
                    break;

                case "http://schemas.microsoft.com/appx/appinstaller/2018":
                    new XmlSerializer(typeof(AppInstallerConfig2018)).Serialize(textWriter, new AppInstallerConfig2018(config), xmlns);
                    break;

                default:
                    throw new NotSupportedException("This feature set is not supported.");
                }

                if (File.Exists(file))
                {
                    File.Delete(file);
                }

                var enc = new UTF8Encoding(false, false);
                await File.WriteAllTextAsync(file, textWriter.ToString(), enc, cancellationToken).ConfigureAwait(false);
            }
        }
Exemple #8
0
        public string GetLowestCommonNamespace(AppInstallerConfig config)
        {
            var maximumNamespace = 20170;

            if (config.UpdateSettings != null)
            {
                if (config.UpdateSettings.ForceUpdateFromAnyVersion)
                {
                    maximumNamespace = Math.Max(maximumNamespace, 20172);
                }

                if (config.UpdateSettings.AutomaticBackgroundTask != null)
                {
                    maximumNamespace = Math.Max(maximumNamespace, 20172);
                }

                if (config.UpdateSettings.OnLaunch != null)
                {
                    if (config.UpdateSettings.OnLaunch.UpdateBlocksActivation || config.UpdateSettings.OnLaunch.ShowPrompt)
                    {
                        maximumNamespace = Math.Max(maximumNamespace, 20180);
                    }
                }
            }

            var minimumNamespace = "http://schemas.microsoft.com/appx/appinstaller/";

            if (maximumNamespace % 10 == 0)
            {
                minimumNamespace += (maximumNamespace / 10);
            }
            else
            {
                var minor = maximumNamespace % 10;
                var major = (maximumNamespace - minor) / 10;

                minimumNamespace += major;
                if (minor != 0)
                {
                    minimumNamespace += "/" + minor;
                }
            }

            return(minimumNamespace);
        }
        public AppInstallerConfig Build(PackageType packageType = PackageType.Package)
        {
            var appIns = new AppInstallerConfig();

            appIns.UpdateSettings = new UpdateSettings();
            switch (this.CheckForUpdates)
            {
            case AppInstallerUpdateCheckingMethod.Never:
                appIns.UpdateSettings.OnLaunch = null;
                appIns.UpdateSettings.AutomaticBackgroundTask = null;
                break;

            case AppInstallerUpdateCheckingMethod.Launch:
                appIns.UpdateSettings.OnLaunch = new OnLaunchSettings();
                appIns.UpdateSettings.AutomaticBackgroundTask = null;
                break;

            case AppInstallerUpdateCheckingMethod.LaunchAndBackground:
                appIns.UpdateSettings.OnLaunch = new OnLaunchSettings();
                appIns.UpdateSettings.AutomaticBackgroundTask = new AutomaticBackgroundTaskSettings();
                break;

            case AppInstallerUpdateCheckingMethod.Background:
                appIns.UpdateSettings.OnLaunch = null;
                appIns.UpdateSettings.AutomaticBackgroundTask = new AutomaticBackgroundTaskSettings();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (this.AllowDowngrades)
            {
                appIns.UpdateSettings.ForceUpdateFromAnyVersion = true;
            }

            appIns.UpdateSettings.ForceUpdateFromAnyVersion = this.AllowDowngrades;

            if (appIns.UpdateSettings.OnLaunch != null)
            {
                appIns.UpdateSettings.OnLaunch.UpdateBlocksActivation = this.UpdateBlocksActivation;
                appIns.UpdateSettings.OnLaunch.ShowPrompt             = this.ShowPrompt;

                if (this.HoursBetweenUpdateChecks != 24)
                {
                    appIns.UpdateSettings.OnLaunch.HoursBetweenUpdateChecks = this.HoursBetweenUpdateChecks;
                }
            }

            if (this.MainPackageSource != null)
            {
                AppxIdentity identity;
                var          identityReader = new AppxIdentityReader();

                try
                {
                    identity = identityReader.GetIdentity(this.MainPackageSource.FullName).Result;
                }
                catch (AggregateException e)
                {
                    throw e.GetBaseException();
                }

                if (packageType == PackageType.Bundle)
                {
                    appIns.MainBundle = new AppInstallerBundleEntry
                    {
                        Name      = identity.Name,
                        Version   = identity.Version,
                        Publisher = identity.Publisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };
                }
                else
                {
                    appIns.MainPackage = new AppInstallerPackageEntry
                    {
                        Name      = identity.Name,
                        Version   = identity.Version,
                        Publisher = identity.Publisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };

                    if (identity.Architectures?.Any() != true)
                    {
                        appIns.MainPackage.Architecture = AppInstallerPackageArchitecture.neutral;
                    }
                    else
                    {
                        var arch = identity.Architectures.First().ToString("G");
                        if (Enum.TryParse(arch, true, out AppInstallerPackageArchitecture parsed))
                        {
                            appIns.MainPackage.Architecture = parsed;
                        }
                    }
                }
            }
            else
            {
                if (packageType == PackageType.Bundle)
                {
                    appIns.MainBundle = new AppInstallerBundleEntry
                    {
                        Name      = this.MainPackageName,
                        Version   = this.MainPackageVersion,
                        Publisher = MainPackagePublisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };
                }
                else if (packageType == PackageType.Package)
                {
                    appIns.MainPackage = new AppInstallerPackageEntry
                    {
                        Name         = this.MainPackageName,
                        Version      = this.MainPackageVersion,
                        Publisher    = MainPackagePublisher,
                        Uri          = this.MainPackageUri?.ToString(),
                        Architecture = (AppInstallerPackageArchitecture)Enum.Parse(typeof(AppInstallerPackageArchitecture), this.MainPackageArchitecture.ToString("G"), true)
                    };
                }
            }

            if (!appIns.UpdateSettings.ForceUpdateFromAnyVersion && appIns.UpdateSettings.OnLaunch == null && appIns.UpdateSettings.AutomaticBackgroundTask == null)
            {
                appIns.UpdateSettings = null;
            }

            if (this.RedirectUri != null)
            {
                appIns.Uri = this.RedirectUri.ToString();
            }

            appIns.Version = this.Version ?? "1.0.0.0";

            return(appIns);
        }
Exemple #10
0
        public AppInstallerConfig Build(PackageType packageType = PackageType.Package)
        {
            var appIns = new AppInstallerConfig();

            appIns.UpdateSettings = new UpdateSettings();
            switch (this.CheckForUpdates)
            {
            case AppInstallerUpdateCheckingMethod.Never:
                appIns.UpdateSettings.OnLaunch = null;
                appIns.UpdateSettings.AutomaticBackgroundTask = null;
                break;

            case AppInstallerUpdateCheckingMethod.Launch:
                appIns.UpdateSettings.OnLaunch = new OnLaunchSettings();
                appIns.UpdateSettings.AutomaticBackgroundTask = null;
                break;

            case AppInstallerUpdateCheckingMethod.LaunchAndBackground:
                appIns.UpdateSettings.OnLaunch = new OnLaunchSettings();
                appIns.UpdateSettings.AutomaticBackgroundTask = new AutomaticBackgroundTaskSettings();
                break;

            case AppInstallerUpdateCheckingMethod.Background:
                appIns.UpdateSettings.OnLaunch = null;
                appIns.UpdateSettings.AutomaticBackgroundTask = new AutomaticBackgroundTaskSettings();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (this.AllowDowngrades)
            {
                appIns.UpdateSettings.ForceUpdateFromAnyVersion = true;
            }

            appIns.UpdateSettings.ForceUpdateFromAnyVersion = this.AllowDowngrades;

            if (appIns.UpdateSettings.OnLaunch != null)
            {
                appIns.UpdateSettings.OnLaunch.UpdateBlocksActivation = this.UpdateBlocksActivation;
                appIns.UpdateSettings.OnLaunch.ShowPrompt             = this.ShowPrompt;

                if (this.HoursBetweenUpdateChecks != 24)
                {
                    appIns.UpdateSettings.OnLaunch.HoursBetweenUpdateChecks = this.HoursBetweenUpdateChecks;
                }
            }

            if (this.MainPackageSource != null)
            {
                AppxManifestSummary manifest;
                if (string.Equals("appxmanifest.xml", Path.GetFileName(this.MainPackageSource.FullName), StringComparison.OrdinalIgnoreCase))
                {
                    manifest = AppxManifestSummaryBuilder.FromManifest(this.MainPackageSource.FullName, AppxManifestSummaryBuilderMode.Identity).GetAwaiter().GetResult();
                }
                else
                {
                    manifest = AppxManifestSummaryBuilder.FromMsix(this.MainPackageSource.FullName, AppxManifestSummaryBuilderMode.Identity).GetAwaiter().GetResult();
                }

                if (packageType == PackageType.Bundle)
                {
                    appIns.MainBundle = new AppInstallerBundleEntry
                    {
                        Name      = manifest.Name,
                        Version   = manifest.Version,
                        Publisher = manifest.Publisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };
                }
                else
                {
                    appIns.MainPackage = new AppInstallerPackageEntry
                    {
                        Name      = manifest.Name,
                        Version   = manifest.Version,
                        Publisher = manifest.Publisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };

                    if (manifest.ProcessorArchitecture == null)
                    {
                        appIns.MainPackage.Architecture = AppInstallerPackageArchitecture.neutral;
                    }
                    else if (Enum.TryParse(manifest.ProcessorArchitecture, true, out AppInstallerPackageArchitecture parsed))
                    {
                        appIns.MainPackage.Architecture = parsed;
                    }
                }
            }
            else
            {
                if (packageType == PackageType.Bundle)
                {
                    appIns.MainBundle = new AppInstallerBundleEntry
                    {
                        Name      = this.MainPackageName,
                        Version   = this.MainPackageVersion,
                        Publisher = MainPackagePublisher,
                        Uri       = this.MainPackageUri?.ToString()
                    };
                }
                else if (packageType == PackageType.Package)
                {
                    appIns.MainPackage = new AppInstallerPackageEntry
                    {
                        Name         = this.MainPackageName,
                        Version      = this.MainPackageVersion,
                        Publisher    = MainPackagePublisher,
                        Uri          = this.MainPackageUri?.ToString(),
                        Architecture = (AppInstallerPackageArchitecture)Enum.Parse(typeof(AppInstallerPackageArchitecture), this.MainPackageArchitecture.ToString("G"), true)
                    };
                }
            }

            if (!appIns.UpdateSettings.ForceUpdateFromAnyVersion && appIns.UpdateSettings.OnLaunch == null && appIns.UpdateSettings.AutomaticBackgroundTask == null)
            {
                appIns.UpdateSettings = null;
            }

            if (this.RedirectUri != null)
            {
                appIns.Uri = this.RedirectUri.ToString();
            }

            appIns.Version = this.Version ?? "1.0.0.0";

            return(appIns);
        }
Exemple #11
0
        private async void OpenExecuted(string selected)
        {
            if (selected != null)
            {
                if (!File.Exists(selected))
                {
                    selected = null;
                }
                else
                {
                    previousPath = selected;
                }
            }

            if (selected == null)
            {
                if (this.previousPath != null)
                {
                    var settings = new FileDialogSettings(new DialogFilterBuilder("*" + FileConstants.AppInstallerExtension).BuildFilter(), this.previousPath);
                    if (!this.interactionService.SelectFile(settings, out selected))
                    {
                        return;
                    }
                }
                else if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.AppInstallerExtension).BuildFilter()), out selected))
                {
                    return;
                }
            }

            this.previousPath = selected;

            AppInstallerConfig file;

            try
            {
                file = await AppInstallerConfig.FromFile(selected).ConfigureAwait(true);
            }
            catch (Exception e)
            {
                // ReSharper disable once PossibleNullReferenceException
                this.interactionService.ShowError("The selected file is not a valid .appinstaller.", e, InteractionResult.OK);
                return;
            }

            var builder = new AppInstallerBuilder(file);

            this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;
            this.AppInstallerUpdateCheckingMethod.CurrentValue = builder.CheckForUpdates;
            this.AppInstallerUri.CurrentValue = builder.RedirectUri.ToString();

            if (builder.ShowPrompt)
            {
                this.PromptMode.CurrentValue = builder.UpdateBlocksActivation ? ViewModel.PromptMode.Force : ViewModel.PromptMode.Inform;
            }
            else
            {
                this.PromptMode.CurrentValue = ViewModel.PromptMode.Background;
            }

            this.Hours.CurrentValue          = builder.HoursBetweenUpdateChecks.ToString();
            this.MainPackageUri.CurrentValue = builder.MainPackageUri.ToString();
            this.Version.CurrentValue        = builder.Version;

            this.TabPackage.Name.CurrentValue         = builder.MainPackageName;
            this.TabPackage.Version.CurrentValue      = builder.MainPackageVersion;
            this.TabPackage.Publisher.CurrentValue    = builder.MainPackagePublisher;
            this.TabPackage.PackageType.CurrentValue  = builder.MainPackageType;
            this.TabPackage.Architecture.CurrentValue = builder.MainPackageArchitecture;
            this.TabOptionalPackages.SetPackages(file.Optional);
            this.TabRelatedPackages.SetPackages(file.Related);

            this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;

            this.OnPropertyChanged(nameof(ShowLaunchOptions));
            this.OnPropertyChanged(nameof(CompatibleWindows));
        }
Exemple #12
0
        private void OpenExecuted(string selected)
        {
            if (selected != null)
            {
                if (!File.Exists(selected))
                {
                    selected = null;
                }
                else
                {
                    previousPath = selected;
                }
            }

            if (selected == null)
            {
                if (this.previousPath != null)
                {
                    // ReSharper disable once StringLiteralTypo
                    var settings = new FileDialogSettings(new DialogFilterBuilder("*.appinstaller").BuildFilter(), this.previousPath);
                    if (!this.interactionService.SelectFile(settings, out selected))
                    {
                        return;
                    }
                }
                // ReSharper disable once StringLiteralTypo
                else if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*.appinstaller").BuildFilter()), out selected))
                {
                    return;
                }
            }

            this.previousPath = selected;

            AppInstallerConfig.FromFile(selected).ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    // ReSharper disable once PossibleNullReferenceException
                    this.interactionService.ShowError("The selected file is not a valid .appinstaller.", t.Exception.GetBaseException(), InteractionResult.OK);
                    return;
                }

                if (t.IsCanceled)
                {
                    return;
                }

                if (!t.IsCompleted)
                {
                    return;
                }

                var builder = new AppInstallerBuilder(t.Result);

                this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;
                this.AppInstallerUpdateCheckingMethod.CurrentValue = builder.CheckForUpdates;
                this.AppInstallerUri.CurrentValue = builder.RedirectUri.ToString();
                this.BlockLaunching.CurrentValue  = builder.UpdateBlocksActivation;
                this.Hours.CurrentValue           = builder.HoursBetweenUpdateChecks.ToString();
                this.MainPackageUri.CurrentValue  = builder.MainPackageUri.ToString();
                this.Version.CurrentValue         = builder.Version;
                this.ShowPrompt.CurrentValue      = builder.ShowPrompt;

                this.TabPackage.Name.CurrentValue         = builder.MainPackageName;
                this.TabPackage.Version.CurrentValue      = builder.MainPackageVersion;
                this.TabPackage.Publisher.CurrentValue    = builder.MainPackagePublisher;
                this.TabPackage.PackageType.CurrentValue  = builder.MainPackageType;
                this.TabPackage.Architecture.CurrentValue = builder.MainPackageArchitecture;

                this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;

                this.OnPropertyChanged(nameof(ShowLaunchOptions));
                this.OnPropertyChanged(nameof(CompatibleWindows));
            },
                                                               CancellationToken.None,
                                                               TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.ExecuteSynchronously,
                                                               TaskScheduler.FromCurrentSynchronizationContext());
        }