mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
wsl: fix command parameters escaping when wrapping into bash
GitOrigin-RevId: 1d2a1239f0a9e606c88e6401c07bb20802300cfe
This commit is contained in:
committed by
intellij-monorepo-bot
parent
28f7f30cf4
commit
42dcf7da91
@@ -3,6 +3,7 @@ package com.intellij.execution.wsl;
|
||||
|
||||
import com.intellij.credentialStore.CredentialAttributes;
|
||||
import com.intellij.credentialStore.CredentialPromptDialog;
|
||||
import com.intellij.execution.CommandLineUtil;
|
||||
import com.intellij.execution.ExecutionException;
|
||||
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||
import com.intellij.execution.configurations.ParametersList;
|
||||
@@ -17,6 +18,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.impl.local.LocalFileSystemBase;
|
||||
import com.intellij.util.ArrayUtilRt;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import gnu.trove.THashMap;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -203,7 +205,8 @@ public class WSLDistribution {
|
||||
commandLineString.append(realParamsList.get(1));
|
||||
}
|
||||
else {
|
||||
commandLineString.append(commandLine.getCommandLineString());
|
||||
List<String> bashParameters = ContainerUtil.prepend(realParamsList, commandLine.getExePath());
|
||||
commandLineString.append(StringUtil.join(bashParameters, CommandLineUtil::posixQuote, " "));
|
||||
}
|
||||
|
||||
if (askForSudo) { // fixme shouldn't we sudo for every chunk? also, preserve-env, login?
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright 2000-2017 JetBrains s.r.o.
|
||||
// Use of this source code is governed by the Apache 2.0 license that can be
|
||||
// found in the LICENSE file.
|
||||
package com.intellij.execution.wsl;
|
||||
|
||||
import com.intellij.execution.ExecutionException;
|
||||
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||
import com.intellij.execution.process.CapturingProcessHandler;
|
||||
import com.intellij.execution.process.ProcessOutput;
|
||||
import com.intellij.testFramework.HeavyPlatformTestCase;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import static org.junit.Assume.assumeTrue;
|
||||
|
||||
public class WSLCommandEscapingTest extends HeavyPlatformTestCase {
|
||||
|
||||
@Nullable
|
||||
private WSLDistribution myWSL;
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
myWSL = ContainerUtil.getFirstItem(WSLUtil.getAvailableDistributions());
|
||||
}
|
||||
|
||||
private void assumeWSLAvailable() {
|
||||
assumeTrue("WSL unavailable", myWSL != null);
|
||||
}
|
||||
|
||||
public void testCommandLineEscaping() {
|
||||
assumeWSLAvailable();
|
||||
|
||||
assertWslCommandOutput("\n", "echo");
|
||||
assertWslCommandOutput("asd\n", "echo", "asd");
|
||||
assertWslCommandOutput("\"test\"\n", "echo", "\"test\"");
|
||||
assertWslCommandOutput("'test'\n", "echo", "'test'");
|
||||
assertWslCommandOutput("(asd)\n", "echo", "(asd)");
|
||||
assertWslCommandOutput("&& exit && exit\n", "echo", "&& exit", "&&", "exit");
|
||||
assertWslCommandOutput(".*\n", "echo", ".*");
|
||||
assertWslCommandOutput("*\n", "echo", "*");
|
||||
assertWslCommandOutput("\\\\\\\"\n", "echo", "\\\\\\\"");
|
||||
assertWslCommandOutput("_ \" ' ) \\\n", "echo", "_", "\"", "", "'", ")", "\\");
|
||||
assertWslCommandOutput("' ''' '' '\n", "echo", "'", "'''", "''", "'");
|
||||
}
|
||||
|
||||
private void assertWslCommandOutput(@NotNull String expectedOut, String command, String... parameters) {
|
||||
final GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||
commandLine.setExePath(command);
|
||||
commandLine.addParameters(parameters);
|
||||
|
||||
try {
|
||||
final GeneralCommandLine cmd = myWSL.patchCommandLine(commandLine, null, null, false);
|
||||
final CapturingProcessHandler process = new CapturingProcessHandler(cmd);
|
||||
ProcessOutput output = process.runProcess(10_000);
|
||||
|
||||
assertFalse(output.isTimeout());
|
||||
assertEquals(0, output.getExitCode());
|
||||
assertEquals(expectedOut, output.getStdout());
|
||||
assertEquals("", output.getStderr());
|
||||
}
|
||||
catch (ExecutionException e) {
|
||||
fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user