private static AppInstallerConfig GetConfig(Action <AppInstallerConfig> configurator = null) { var newConfig = new AppInstallerConfig(); configurator?.Invoke(newConfig); return(newConfig); }
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); }
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); }
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); } }
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); }
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); }
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)); }
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()); }