From 04636339cef37078cb59b832c154feed0868d47f Mon Sep 17 00:00:00 2001 From: Chris <60838650+chrisharris333@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:37:30 -0500 Subject: [PATCH] [Powertoys Run] Add setting to confirm system commands (#12427) * HTTPS by default, HTTP only if specified * Added/Updated unit tests;Added FTPS * Added confirmation to system messages such as shutdown, reboot, and lock * Corrected Typo * Added confirmation to system messages such as shutdown, reboot, and lock * Corrected Typo * Made changes requested by @mykhailopylyp * Further changes per review by mykhailopylyp * Fixes per code review --- .../Main.cs | 82 +++++++++++++++---- .../Properties/Resources.Designer.cs | 72 ++++++++++++++++ .../Properties/Resources.resx | 31 +++++++ src/modules/launcher/Wox.Plugin/PluginPair.cs | 1 + .../Views/PowerLauncherPage.xaml | 18 ++-- 5 files changed, 180 insertions(+), 24 deletions(-) diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Main.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Main.cs index b6b4218af7..91a14a8597 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Main.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Main.cs @@ -4,18 +4,25 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Interop; using ManagedCommon; using Microsoft.PowerToys.Run.Plugin.System.Win32; +using Microsoft.PowerToys.Settings.UI.Library; using Wox.Infrastructure; +using Wox.Infrastructure.Storage; using Wox.Plugin; namespace Microsoft.PowerToys.Run.Plugin.System { - public class Main : IPlugin, IPluginI18n + public class Main : IPlugin, IPluginI18n, ISettingProvider { private PluginInitContext _context; + private const string ConfirmSystemCommands = nameof(ConfirmSystemCommands); internal const int EWXLOGOFF = 0x00000000; internal const int EWXSHUTDOWN = 0x00000001; @@ -26,13 +33,27 @@ namespace Microsoft.PowerToys.Run.Plugin.System public string IconTheme { get; set; } + public ICommand Command { get; set; } + public string Name => Properties.Resources.Microsoft_plugin_sys_plugin_name; public string Description => Properties.Resources.Microsoft_plugin_sys_plugin_description; + private bool _confirmSystemCommands; + + public IEnumerable AdditionalOptions => new List() + { + new PluginAdditionalOption() + { + Key = ConfirmSystemCommands, + DisplayLabel = Properties.Resources.confirm_system_commands, + Value = false, + }, + }; + public void Init(PluginInitContext context) { - this._context = context; + _context = context; _context.API.ThemeChanged += OnThemeChanged; UpdateIconTheme(_context.API.GetCurrentTheme()); } @@ -73,8 +94,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\shutdown.{IconTheme}.png", Action = c => { - Helper.OpenInShell("shutdown", "/s /t 0"); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_shutdown_computer_confirmation, () => Helper.OpenInShell("shutdown", "/s /t 0")); }, }, new Result @@ -84,8 +104,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\restart.{IconTheme}.png", Action = c => { - Helper.OpenInShell("shutdown", "/r /t 0"); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_restart_computer_confirmation, () => Helper.OpenInShell("shutdown", "/r /t 0")); }, }, new Result @@ -95,8 +114,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\logoff.{IconTheme}.png", Action = c => { - NativeMethods.ExitWindowsEx(EWXLOGOFF, 0); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_sign_out_confirmation, () => NativeMethods.ExitWindowsEx(EWXLOGOFF, 0)); }, }, new Result @@ -106,8 +124,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\lock.{IconTheme}.png", Action = c => { - NativeMethods.LockWorkStation(); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_lock_confirmation, () => NativeMethods.LockWorkStation()); }, }, new Result @@ -117,8 +134,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\sleep.{IconTheme}.png", Action = c => { - NativeMethods.SetSuspendState(false, true, true); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_sleep_confirmation, () => NativeMethods.SetSuspendState(false, true, true)); }, }, new Result @@ -128,8 +144,7 @@ namespace Microsoft.PowerToys.Run.Plugin.System IcoPath = $"Images\\sleep.{IconTheme}.png", // Icon change needed Action = c => { - NativeMethods.SetSuspendState(true, true, true); - return true; + return ExecuteCommand(Properties.Resources.Microsoft_plugin_sys_hibernate_confirmation, () => NativeMethods.SetSuspendState(true, true, true)); }, }, new Result @@ -184,5 +199,44 @@ namespace Microsoft.PowerToys.Run.Plugin.System { return Properties.Resources.Microsoft_plugin_sys_plugin_name; } + + private bool ExecuteCommand(string confirmationMessage, Action command) + { + if (_confirmSystemCommands) + { + MessageBoxResult messageBoxResult = MessageBox.Show( + confirmationMessage, + Properties.Resources.Microsoft_plugin_sys_confirmation, + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + + if (messageBoxResult == MessageBoxResult.No) + { + return false; + } + } + + command(); + return true; + } + + public Control CreateSettingPanel() + { + throw new NotImplementedException(); + } + + public void UpdateSettings(PowerLauncherPluginSettings settings) + { + var confirmSystemCommands = false; + + if (settings != null && settings.AdditionalOptions != null) + { + var option = settings.AdditionalOptions.FirstOrDefault(x => x.Key == ConfirmSystemCommands); + + confirmSystemCommands = option == null ? false : option.Value; + } + + _confirmSystemCommands = confirmSystemCommands; + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.Designer.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.Designer.cs index 32a2f95067..926d99af89 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.Designer.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.Designer.cs @@ -60,6 +60,24 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to Show a dialog to confirm system commands. + /// + internal static string confirm_system_commands { + get { + return ResourceManager.GetString("confirm_system_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please Confirm. + /// + internal static string Microsoft_plugin_sys_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Empty Recycle Bin. /// @@ -87,6 +105,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to put this computer into hibernation, are you sure?. + /// + internal static string Microsoft_plugin_sys_hibernate_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_hibernate_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Hibernate computer. /// @@ -105,6 +132,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to lock this computer, are you sure?. + /// + internal static string Microsoft_plugin_sys_lock_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_lock_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Lock computer. /// @@ -141,6 +177,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to restart this computer, are you sure?. + /// + internal static string Microsoft_plugin_sys_restart_computer_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_restart_computer_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Restart computer. /// @@ -159,6 +204,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to shut down this computer, are you sure?. + /// + internal static string Microsoft_plugin_sys_shutdown_computer_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_shutdown_computer_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shutdown computer. /// @@ -177,6 +231,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to sign out of this computer, are you sure?. + /// + internal static string Microsoft_plugin_sys_sign_out_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_sign_out_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Sign out of computer. /// @@ -195,6 +258,15 @@ namespace Microsoft.PowerToys.Run.Plugin.System.Properties { } } + /// + /// Looks up a localized string similar to You are about to put this computer to sleep, are you sure?. + /// + internal static string Microsoft_plugin_sys_sleep_confirmation { + get { + return ResourceManager.GetString("Microsoft_plugin_sys_sleep_confirmation", resourceCulture); + } + } + /// /// Looks up a localized string similar to Put computer to sleep. /// diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.resx b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.resx index 0e64ff7661..fc45c28de2 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.resx +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.System/Properties/Resources.resx @@ -117,6 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Show a dialog to confirm system commands + + + Please Confirm + Request confirmation + Empty Recycle Bin This should align to the action in Windows of emptying the recycle bin on your computer. @@ -129,6 +136,10 @@ Hibernate This should align to the action in Windows of a hibernating your computer. + + You are about to put this computer into hibernation, are you sure? + This should align to the action in Windows of a hibernating your computer. + Hibernate computer This should align to the action in Windows of a hibernating your computer. @@ -137,6 +148,10 @@ Lock This should align to the action in Windows of a locking your computer. + + You are about to lock this computer, are you sure? + This should align to the action in Windows of a locking your computer. + Lock computer This should align to the action in Windows of a locking your computer. @@ -153,6 +168,10 @@ Restart This should align to the action in Windows of a restarting your computer. + + You are about to restart this computer, are you sure? + This should align to the action in Windows of a restarting your computer. + Restart computer This should align to the action in Windows of a restarting your computer. @@ -161,6 +180,10 @@ Shutdown This should align to the action in Windows of a shutting down your computer. + + You are about to shut down this computer, are you sure? + This should align to the action in Windows of a shutting down your computer. + Shutdown computer This should align to the action in Windows of a shutting down your computer. @@ -169,6 +192,10 @@ Sign out This should align to the action in windows of a signing out back to the lock screen. + + You are about to sign out of this computer, are you sure? + This should align to the action in windows of a signing out back to the lock screen. + Sign out of computer This should align to the action in windows of a signing out back to the lock screen. @@ -177,6 +204,10 @@ Sleep This should align to the action in Windows of a making your computer go to sleep. + + You are about to put this computer to sleep, are you sure? + This should align to the action in Windows of a making your computer go to sleep. + Put computer to sleep This should align to the action in Windows of a making your computer go to sleep. diff --git a/src/modules/launcher/Wox.Plugin/PluginPair.cs b/src/modules/launcher/Wox.Plugin/PluginPair.cs index b97c5077ae..ca8c8d22d2 100644 --- a/src/modules/launcher/Wox.Plugin/PluginPair.cs +++ b/src/modules/launcher/Wox.Plugin/PluginPair.cs @@ -80,6 +80,7 @@ namespace Wox.Plugin Metadata.ActionKeyword = setting.ActionKeyword; Metadata.IsGlobal = setting.IsGlobal; + if (Plugin is ISettingProvider) { (Plugin as ISettingProvider).UpdateSettings(setting); diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/PowerLauncherPage.xaml b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/PowerLauncherPage.xaml index 8c24e0fb01..8740554b5d 100644 --- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/PowerLauncherPage.xaml +++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/PowerLauncherPage.xaml @@ -278,20 +278,18 @@ AutomationProperties.LabeledBy="{Binding ElementName=ActionKeywordHeaderTextBlock}" HorizontalAlignment="Left" IsEnabled="{x:Bind Enabled, Mode=OneWay}" /> - - - - - +