mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 11:56:30 +00:00
Plugin settings - Restart Artemis for plugins that require admin rights
Setup wizard - Restart Artemis device providers that require admin rights Setup wizard - Gracefully handle errors during device provider enable Profile editor - Select a valid default brush on clean installs
This commit is contained in:
1 parent
b917f36978
commit
985a94dbaf
16 files changed
+363
-151
No files matched your search
@@ -3,17 +3,20 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection.Metadata;
|
||||
using System.Security.Principal;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using Artemis.Core;
|
||||
using Artemis.Core.LayerBrushes;
|
||||
using Artemis.Core.Services;
|
||||
using Artemis.Core.Services.Core;
|
||||
using Artemis.UI.Properties;
|
||||
using Artemis.UI.Screens.StartupWizard;
|
||||
using Artemis.UI.Services;
|
||||
using Artemis.UI.Shared;
|
||||
using Artemis.UI.Shared.Services;
|
||||
using Artemis.UI.Utilities;
|
||||
using Ninject;
|
||||
using Serilog.Events;
|
||||
using Stylet;
|
||||
@@ -70,7 +73,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.General
|
||||
_defaultLayerBrushDescriptor = _settingsService.GetSetting("ProfileEditor.DefaultLayerBrushDescriptor", new LayerBrushReference
|
||||
{
|
||||
LayerBrushProviderId = "Artemis.Plugins.LayerBrushes.Color.ColorBrushProvider-92a9d6ba",
|
||||
BrushType = "ColorBrush"
|
||||
BrushType = "SolidBrush"
|
||||
});
|
||||
|
||||
WebServerPortSetting = _settingsService.GetSetting("WebServer.Port", 9696);
|
||||
@@ -306,7 +309,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.General
|
||||
if (File.Exists(autoRunFile))
|
||||
File.Delete(autoRunFile);
|
||||
|
||||
// TODO: Don't do anything if running a development build, only auto-run release builds
|
||||
if (Constants.BuildInfo.IsLocalBuild)
|
||||
return;
|
||||
|
||||
// Create or remove the task if necessary
|
||||
try
|
||||
@@ -314,26 +318,13 @@ namespace Artemis.UI.Screens.Settings.Tabs.General
|
||||
bool taskCreated = false;
|
||||
if (!recreate)
|
||||
{
|
||||
Process schtasks = new()
|
||||
{
|
||||
StartInfo =
|
||||
{
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
UseShellExecute = true,
|
||||
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
|
||||
Arguments = "/TN \"Artemis 2 autorun\""
|
||||
}
|
||||
};
|
||||
|
||||
schtasks.Start();
|
||||
schtasks.WaitForExit();
|
||||
taskCreated = schtasks.ExitCode == 0;
|
||||
taskCreated = SettingsUtilities.IsAutoRunTaskCreated();
|
||||
}
|
||||
|
||||
if (StartWithWindows && !taskCreated)
|
||||
CreateAutoRunTask();
|
||||
SettingsUtilities.CreateAutoRunTask(TimeSpan.FromSeconds(AutoRunDelay));
|
||||
else if (!StartWithWindows && taskCreated)
|
||||
RemoveAutoRunTask();
|
||||
SettingsUtilities.RemoveAutoRunTask();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -341,71 +332,10 @@ namespace Artemis.UI.Screens.Settings.Tabs.General
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateAutoRunTask()
|
||||
{
|
||||
XDocument document = XDocument.Parse(Resources.artemis_autorun);
|
||||
XElement task = document.Descendants().First();
|
||||
|
||||
task.Descendants().First(d => d.Name.LocalName == "RegistrationInfo").Descendants().First(d => d.Name.LocalName == "Date")
|
||||
.SetValue(DateTime.Now);
|
||||
task.Descendants().First(d => d.Name.LocalName == "RegistrationInfo").Descendants().First(d => d.Name.LocalName == "Author")
|
||||
.SetValue(WindowsIdentity.GetCurrent().Name);
|
||||
|
||||
task.Descendants().First(d => d.Name.LocalName == "Triggers").Descendants().First(d => d.Name.LocalName == "LogonTrigger").Descendants().First(d => d.Name.LocalName == "Delay")
|
||||
.SetValue(TimeSpan.FromSeconds(AutoRunDelay));
|
||||
|
||||
task.Descendants().First(d => d.Name.LocalName == "Principals").Descendants().First(d => d.Name.LocalName == "Principal").Descendants().First(d => d.Name.LocalName == "UserId")
|
||||
.SetValue(WindowsIdentity.GetCurrent().User.Value);
|
||||
|
||||
task.Descendants().First(d => d.Name.LocalName == "Actions").Descendants().First(d => d.Name.LocalName == "Exec").Descendants().First(d => d.Name.LocalName == "WorkingDirectory")
|
||||
.SetValue(Constants.ApplicationFolder);
|
||||
task.Descendants().First(d => d.Name.LocalName == "Actions").Descendants().First(d => d.Name.LocalName == "Exec").Descendants().First(d => d.Name.LocalName == "Command")
|
||||
.SetValue("\"" + Constants.ExecutablePath + "\"");
|
||||
|
||||
string xmlPath = Path.GetTempFileName();
|
||||
using (Stream fileStream = new FileStream(xmlPath, FileMode.Create))
|
||||
{
|
||||
document.Save(fileStream);
|
||||
}
|
||||
|
||||
Process schtasks = new()
|
||||
{
|
||||
StartInfo =
|
||||
{
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
UseShellExecute = true,
|
||||
Verb = "runas",
|
||||
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
|
||||
Arguments = $"/Create /XML \"{xmlPath}\" /tn \"Artemis 2 autorun\" /F"
|
||||
}
|
||||
};
|
||||
|
||||
schtasks.Start();
|
||||
schtasks.WaitForExit();
|
||||
|
||||
File.Delete(xmlPath);
|
||||
}
|
||||
|
||||
private void RemoveAutoRunTask()
|
||||
{
|
||||
Process schtasks = new()
|
||||
{
|
||||
StartInfo =
|
||||
{
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
UseShellExecute = true,
|
||||
Verb = "runas",
|
||||
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
|
||||
Arguments = "/Delete /TN \"Artemis 2 autorun\" /f"
|
||||
}
|
||||
};
|
||||
|
||||
schtasks.Start();
|
||||
schtasks.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public enum ApplicationColorScheme
|
||||
{
|
||||
Light,
|
||||
|
||||
@@ -45,8 +45,17 @@
|
||||
<TextBlock Grid.Column="1" Text="{Binding FeatureInfo.Name}" Style="{StaticResource MaterialDesignTextBlock}" VerticalAlignment="Center" ToolTip="{Binding FeatureInfo.Description}" />
|
||||
|
||||
<!-- Enable toggle column -->
|
||||
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="8"
|
||||
Visibility="{Binding Enabling, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, Mode=OneWay, FallbackValue=Collapsed}">
|
||||
<StackPanel Grid.Column="2"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Margin="8"
|
||||
Visibility="{Binding Enabling, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, Mode=OneWay, FallbackValue=Collapsed}"
|
||||
Orientation="Horizontal">
|
||||
<materialDesign:PackIcon Kind="ShieldHalfFull"
|
||||
ToolTip="Plugin requires admin rights"
|
||||
VerticalAlignment="Center"
|
||||
Margin="0 0 5 0"
|
||||
Visibility="{Binding ShowShield, Converter={x:Static s:BoolToVisibilityConverter.Instance}, Mode=OneWay}" />
|
||||
<CheckBox Style="{StaticResource MaterialDesignCheckBox}" IsChecked="{Binding IsEnabled}" IsEnabled="{Binding FeatureInfo.Plugin.IsEnabled}">
|
||||
Feature enabled
|
||||
</CheckBox>
|
||||
|
||||
@@ -11,26 +11,33 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
||||
{
|
||||
public class PluginFeatureViewModel : Screen
|
||||
{
|
||||
private readonly ICoreService _coreService;
|
||||
private readonly IDialogService _dialogService;
|
||||
private readonly IPluginManagementService _pluginManagementService;
|
||||
private bool _enabling;
|
||||
private readonly IMessageService _messageService;
|
||||
|
||||
public PluginFeatureViewModel(PluginFeatureInfo pluginFeatureInfo,
|
||||
public PluginFeatureViewModel(PluginFeatureInfo pluginFeatureInfo,
|
||||
bool showShield,
|
||||
ICoreService coreService,
|
||||
IDialogService dialogService,
|
||||
IPluginManagementService pluginManagementService,
|
||||
IMessageService messageService)
|
||||
{
|
||||
_coreService = coreService;
|
||||
_dialogService = dialogService;
|
||||
_pluginManagementService = pluginManagementService;
|
||||
_messageService = messageService;
|
||||
|
||||
FeatureInfo = pluginFeatureInfo;
|
||||
ShowShield = FeatureInfo.Plugin.Info.RequiresAdmin && showShield;
|
||||
}
|
||||
|
||||
public PluginFeatureInfo FeatureInfo { get; }
|
||||
public Exception LoadException => FeatureInfo.Instance?.LoadException;
|
||||
|
||||
public bool ShowShield { get; }
|
||||
|
||||
public bool Enabling
|
||||
{
|
||||
get => _enabling;
|
||||
@@ -95,6 +102,16 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
||||
|
||||
try
|
||||
{
|
||||
if (FeatureInfo.Plugin.Info.RequiresAdmin && !_coreService.IsElevated)
|
||||
{
|
||||
bool confirmed = await _dialogService.ShowConfirmDialog("Enable feature", "The plugin of this feature requires admin rights, are you sure you want to enable it?");
|
||||
if (!confirmed)
|
||||
{
|
||||
NotifyOfPropertyChange(nameof(IsEnabled));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await Task.Run(() => _pluginManagementService.EnablePluginFeature(FeatureInfo.Instance, true));
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
||||
protected override void OnInitialActivate()
|
||||
{
|
||||
foreach (PluginFeatureInfo pluginFeatureInfo in Plugin.Features)
|
||||
Items.Add(_settingsVmFactory.CreatePluginFeatureViewModel(pluginFeatureInfo));
|
||||
Items.Add(_settingsVmFactory.CreatePluginFeatureViewModel(pluginFeatureInfo, false));
|
||||
|
||||
base.OnInitialActivate();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user