From 37ff49cdf2a2bbd632a3a1976f5d5555e90dca7f Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 27 Sep 2026 14:11:16 +0000 Subject: [PATCH] Various fixes --- app/src/main/java/io/xpipe/app/core/AppLocalTemp.java | 4 ++-- .../io/xpipe/app/prefs/ExternalApplicationHelper.java | 6 +++--- .../java/io/xpipe/app/prefs/ExternalEditorType.java | 2 +- .../main/java/io/xpipe/app/process/ScriptHelper.java | 2 +- app/src/main/java/io/xpipe/app/process/ShellTemp.java | 11 ++++++++--- .../main/java/io/xpipe/app/rdp/CustomRdpClient.java | 3 ++- .../java/io/xpipe/app/spice/CustomSpiceClient.java | 2 +- .../io/xpipe/app/terminal/CustomTerminalType.java | 2 +- .../main/java/io/xpipe/app/vnc/CustomVncClient.java | 2 +- .../xpipe/ext/base/service/ServiceProtocolType.java | 2 +- 10 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java b/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java index 2d9d7bc47..fe778e69e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java +++ b/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java @@ -29,7 +29,7 @@ public class AppLocalTemp { ErrorEventFactory.fromThrowable(new IOException("Invalid file type for " + temp)) .term() .handle(); - return null; + return temp; } try { @@ -44,7 +44,7 @@ public class AppLocalTemp { return temp; } catch (Exception e) { ErrorEventFactory.fromThrowable(e).description("Unable to set temp dir permissions " + temp).term().handle(); - return null; + return temp; } } else { var temp = diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java index 454fea98a..9f12697fd 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java @@ -14,14 +14,14 @@ import java.util.stream.Collectors; public class ExternalApplicationHelper { - public static String replaceVariableArgument(String format, String variable, String value) { + public static String replaceVariableArgument(String format, String variable, String value, boolean quoteLiteral) { // Support for legacy variables that were not upper case variable = variable.toUpperCase(Locale.ROOT); format = format.replace("$" + variable.toLowerCase(Locale.ROOT), "$" + variable.toUpperCase(Locale.ROOT)); - var fileString = LocalShell.getDialect().fileArgument(value); + var substitute = quoteLiteral ? LocalShell.getDialect().literalArgument(value) : value; // Check if the variable is already quoted var quotedFormatString = format.contains("\"$" + variable + "\""); - return format.replace(quotedFormatString ? ("\"$" + variable + "\"") : ("$" + variable), fileString); + return format.replace(quotedFormatString ? ("\"$" + variable + "\"") : ("$" + variable), substitute); } public static void startAsync(String raw) throws Exception { diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java index cc8e82b0b..41bed7a14 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java @@ -503,7 +503,7 @@ public interface ExternalEditorType extends PrefsChoiceValue { var format = customCommand.toLowerCase(Locale.ROOT).contains("$file") ? customCommand : customCommand + " $FILE"; var command = CommandBuilder.of() - .add(ExternalApplicationHelper.replaceVariableArgument(format, "FILE", file.toString())); + .add(ExternalApplicationHelper.replaceVariableArgument(format, "FILE", file.toString(), true)); if (AppPrefs.get().customEditorCommandInTerminal().get()) { TerminalLaunch.builder() .title(file.toString()) diff --git a/app/src/main/java/io/xpipe/app/process/ScriptHelper.java b/app/src/main/java/io/xpipe/app/process/ScriptHelper.java index 3c8e1574d..799f474f7 100644 --- a/app/src/main/java/io/xpipe/app/process/ScriptHelper.java +++ b/app/src/main/java/io/xpipe/app/process/ScriptHelper.java @@ -35,7 +35,7 @@ public class ScriptHelper { ShellDialect type, ShellControl processControl, String content, boolean log) { content = type.prepareScriptContent(processControl, content); var fileName = "xpipe-" + getScriptHash(processControl, content); - var temp = processControl.getSubTemporaryDirectory(); + var temp = ShellTemp.getSubDirectory(processControl, "shell"); var file = temp.join(fileName + "." + type.getScriptFileEnding()); return createExecScriptRaw(processControl, file, content, log); } diff --git a/app/src/main/java/io/xpipe/app/process/ShellTemp.java b/app/src/main/java/io/xpipe/app/process/ShellTemp.java index df6489245..375e59725 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellTemp.java +++ b/app/src/main/java/io/xpipe/app/process/ShellTemp.java @@ -99,6 +99,7 @@ public class ShellTemp { if (newSession) { clearTemp(sc); try { + sc.view().mkdir(subTemp); sc.view().touch(sessionFile); } catch (ProcessOutputException pex) { if (!pex.getOutput().toLowerCase().contains("no space left on device")) { @@ -111,9 +112,13 @@ public class ShellTemp { } private static void clearTemp(ShellControl sc) throws Exception { - var subTemp = getUserSpecificTempDataDirectoryPath(sc); - if (sc.view().directoryExists(subTemp)) { - clearFiles(sc, subTemp); + var toClean = getUserSpecificTempDataDirectoryPath(sc); + // Only clear local shell dir to not interfere with AppLocalTemp too much + if (sc.isLocal()) { + toClean = toClean.join("shell"); + } + if (sc.view().directoryExists(toClean)) { + clearFiles(sc, toClean); } } diff --git a/app/src/main/java/io/xpipe/app/rdp/CustomRdpClient.java b/app/src/main/java/io/xpipe/app/rdp/CustomRdpClient.java index b00bb140a..537210c26 100644 --- a/app/src/main/java/io/xpipe/app/rdp/CustomRdpClient.java +++ b/app/src/main/java/io/xpipe/app/rdp/CustomRdpClient.java @@ -50,7 +50,8 @@ public class CustomRdpClient implements ExternalApplicationType, ExternalRdpClie format, "FILE", writeRdpConfigFile(configuration.getTitle(), configuration.getConfig()) - .toString()))); + .toString(), + true))); } @Override diff --git a/app/src/main/java/io/xpipe/app/spice/CustomSpiceClient.java b/app/src/main/java/io/xpipe/app/spice/CustomSpiceClient.java index 8f9ee7b1d..2d071f06d 100644 --- a/app/src/main/java/io/xpipe/app/spice/CustomSpiceClient.java +++ b/app/src/main/java/io/xpipe/app/spice/CustomSpiceClient.java @@ -44,7 +44,7 @@ public class CustomSpiceClient implements ExternalSpiceClient { var format = command.toLowerCase(Locale.ROOT).contains("$file") ? command : command + " $FILE"; var toExecute = ExternalApplicationHelper.replaceVariableArgument( - format, "ADDRESS", configuration.getFile().toString()); + format, "FILE", configuration.getFile().toString(), true); ExternalApplicationHelper.startAsync(CommandBuilder.of().add(toExecute)); } diff --git a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java index 6593801aa..2bed510e6 100644 --- a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java @@ -37,7 +37,7 @@ public class CustomTerminalType implements ExternalApplicationType, ExternalTerm var format = custom.toLowerCase(Locale.ROOT).contains("$cmd") ? custom : custom + " $CMD"; try (var sc = LocalShell.getShell()) { var toExecute = ExternalApplicationHelper.replaceVariableArgument( - format, "CMD", configuration.single().getScriptFile().toString()); + format, "CMD", configuration.single().getScriptFile().toString(), false); // We can't be sure whether the command is blocking or not, so always make it not blocking if (sc.getOsType() == OsType.WINDOWS) { toExecute = "start \"" + configuration.getCleanTitle() + "\" " + toExecute; diff --git a/app/src/main/java/io/xpipe/app/vnc/CustomVncClient.java b/app/src/main/java/io/xpipe/app/vnc/CustomVncClient.java index 36f18682b..ae3df8a6b 100644 --- a/app/src/main/java/io/xpipe/app/vnc/CustomVncClient.java +++ b/app/src/main/java/io/xpipe/app/vnc/CustomVncClient.java @@ -44,7 +44,7 @@ public class CustomVncClient implements ExternalVncClient { var address = configuration.getHost() + ":" + configuration.getPort(); var format = command.toLowerCase(Locale.ROOT).contains("$address") ? command : command + " $ADDRESS"; - var toExecute = ExternalApplicationHelper.replaceVariableArgument(format, "ADDRESS", address); + var toExecute = ExternalApplicationHelper.replaceVariableArgument(format, "ADDRESS", address, true); ExternalApplicationHelper.startAsync(CommandBuilder.of().add(toExecute)); } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java index e9f9e8d95..9fe4ba8f8 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java @@ -148,7 +148,7 @@ public interface ServiceProtocolType { var format = commandTemplate.toLowerCase(Locale.ROOT).contains("$port") ? commandTemplate : commandTemplate + " localhost:$PORT"; - var toExecute = ExternalApplicationHelper.replaceVariableArgument(format, "PORT", port); + var toExecute = ExternalApplicationHelper.replaceVariableArgument(format, "PORT", port, false); // We can't be sure whether the command is blocking or not, so always make it not blocking ExternalApplicationHelper.startAsync(toExecute); }