From b7bebc8a3295f63f0b27004b385be8d16de2e0cd Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sat, 14 May 2022 21:25:36 -0500 Subject: [PATCH 1/4] use old Arguments instead of ArgumentList to prevent auto escape quote in commands --- Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index bed46425dc1..d28a5b44c57 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -61,11 +61,9 @@ public List Query(Query query) if (basedir != null) { - var autocomplete = Directory.GetFileSystemEntries(basedir). - Select(o => dir + Path.GetFileName(o)). - Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) && - !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase)) && - !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase))).ToList(); + var autocomplete = Directory.GetFileSystemEntries(basedir).Select(o => dir + Path.GetFileName(o)).Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) && + !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase)) && + !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase))).ToList(); autocomplete.Sort(); results.AddRange(autocomplete.ConvertAll(m => new Result { @@ -78,7 +76,7 @@ public List Query(Query query) c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && !c.SpecialKeyState.WinPressed - ); + ); Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator)); return true; @@ -118,7 +116,7 @@ private List GetHistoryCmds(string cmd, Result result) c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && !c.SpecialKeyState.WinPressed - ); + ); Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; @@ -148,7 +146,7 @@ private Result GetCurrentCmd(string cmd) c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && !c.SpecialKeyState.WinPressed - ); + ); Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator)); return true; @@ -173,7 +171,7 @@ private List ResultsFromlHistory() c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && !c.SpecialKeyState.WinPressed - ); + ); Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; @@ -195,16 +193,18 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin ProcessStartInfo info = new() { - Verb = runAsAdministratorArg, - WorkingDirectory = workingDirectory, + Verb = runAsAdministratorArg, WorkingDirectory = workingDirectory, }; switch (_settings.Shell) { case Shell.Cmd: { info.FileName = "cmd.exe"; - info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); - info.ArgumentList.Add(command); + info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}"; + + // ArgumentList may break original shell command separation with quote. + // info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); + // info.ArgumentList.Add(command); break; } @@ -226,7 +226,10 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin case Shell.RunCommand: { - var parts = command.Split(new[] { ' ' }, 2); + var parts = command.Split(new[] + { + ' ' + }, 2); if (parts.Length == 2) { var filename = parts[0]; @@ -366,7 +369,7 @@ public List LoadContextMenus(Result selectedResult) Title = context.API.GetTranslation("flowlauncher_plugin_cmd_run_as_different_user"), Action = c => { - Task.Run(() =>Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title))); + Task.Run(() => Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title))); return true; }, IcoPath = "Images/user.png" @@ -396,4 +399,4 @@ public List LoadContextMenus(Result selectedResult) return resultlist; } } -} +} \ No newline at end of file From d48e841f218ba2dbf4e63f2733050c1635d77587 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 22 Jun 2022 06:37:33 +1000 Subject: [PATCH 2/4] formatting --- Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index d28a5b44c57..6797a0f6703 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -61,22 +61,26 @@ public List Query(Query query) if (basedir != null) { - var autocomplete = Directory.GetFileSystemEntries(basedir).Select(o => dir + Path.GetFileName(o)).Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) && + var autocomplete = + Directory.GetFileSystemEntries(basedir) + .Select(o => dir + Path.GetFileName(o)) + .Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) && !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase)) && !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase))).ToList(); + autocomplete.Sort(); + results.AddRange(autocomplete.ConvertAll(m => new Result { Title = m, IcoPath = Image, Action = c => { - var runAsAdministrator = ( + var runAsAdministrator = c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && - !c.SpecialKeyState.WinPressed - ); + !c.SpecialKeyState.WinPressed; Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator)); return true; @@ -111,12 +115,11 @@ private List GetHistoryCmds(string cmd, Result result) IcoPath = Image, Action = c => { - var runAsAdministrator = ( + var runAsAdministrator = c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && - !c.SpecialKeyState.WinPressed - ); + !c.SpecialKeyState.WinPressed; Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; @@ -141,12 +144,11 @@ private Result GetCurrentCmd(string cmd) IcoPath = Image, Action = c => { - var runAsAdministrator = ( + var runAsAdministrator = c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && - !c.SpecialKeyState.WinPressed - ); + !c.SpecialKeyState.WinPressed; Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator)); return true; @@ -166,12 +168,11 @@ private List ResultsFromlHistory() IcoPath = Image, Action = c => { - var runAsAdministrator = ( + var runAsAdministrator = c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed && !c.SpecialKeyState.AltPressed && - !c.SpecialKeyState.WinPressed - ); + !c.SpecialKeyState.WinPressed; Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; From 9b894b3b92001f48bde1e3b53fadf2e295bcdfbd Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 22 Jun 2022 07:55:47 +1000 Subject: [PATCH 3/4] update comment regarding usage of Argument vs ArgumentList --- Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 6797a0f6703..ae74aa80482 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -194,7 +194,8 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin ProcessStartInfo info = new() { - Verb = runAsAdministratorArg, WorkingDirectory = workingDirectory, + Verb = runAsAdministratorArg, + WorkingDirectory = workingDirectory, }; switch (_settings.Shell) { @@ -202,10 +203,20 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin { info.FileName = "cmd.exe"; info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}"; - - // ArgumentList may break original shell command separation with quote. + + //// Use info.Arguments instead of info.ArgumentList to enable user better control over the argument they are writing. + //// Previous code using ArgumentList, commands needed to be seperated correctly: + //// Incorrect: // info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); - // info.ArgumentList.Add(command); + // info.ArgumentList.Add(command); //<== info.ArgumentList.Add("mkdir \"c:\\test new\""); + + //// Correct version should be: + //info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); + //info.ArgumentList.Add("mkdir"); + //info.ArgumentList.Add(@"c:\test new"); + + //https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.argumentlist?view=net-6.0#remarks + break; } From dba03c9676dcecb66450a69318c2b9d5600c686a Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 22 Jun 2022 07:59:39 +1000 Subject: [PATCH 4/4] formatting --- Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index ae74aa80482..dd8a05b0f75 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -204,7 +204,7 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin info.FileName = "cmd.exe"; info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}"; - //// Use info.Arguments instead of info.ArgumentList to enable user better control over the argument they are writing. + //// Use info.Arguments instead of info.ArgumentList to enable users better control over the arguments they are writing. //// Previous code using ArgumentList, commands needed to be seperated correctly: //// Incorrect: // info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); @@ -238,10 +238,7 @@ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdmin case Shell.RunCommand: { - var parts = command.Split(new[] - { - ' ' - }, 2); + var parts = command.Split(new[] { ' ' }, 2); if (parts.Length == 2) { var filename = parts[0];