From aa71a72f584a443becbf26ede0f2cc5e6da92798 Mon Sep 17 00:00:00 2001 From: crschnick Date: Tue, 19 Dec 2023 15:31:06 +0000 Subject: [PATCH] Ssh key file fixes --- .../xpipe/app/issue/SentryErrorHandler.java | 2 +- .../app/storage/ContextualFileReference.java | 18 ++++++++++------ .../io/xpipe/app/util/LicenseProvider.java | 2 ++ .../java/io/xpipe/app/util/ScriptHelper.java | 14 ++++++------- .../app/util/SecretRetrievalStrategy.java | 21 +------------------ .../io/xpipe/core/process/ShellControl.java | 11 ++++++++++ .../io/xpipe/core/process/ShellDialect.java | 2 +- 7 files changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java b/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java index 053b09bb..6990c21d 100644 --- a/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java +++ b/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java @@ -165,7 +165,7 @@ public class SentryErrorHandler implements ErrorHandler { atts.forEach(attachment -> s.addAttachment(attachment)); } - s.setTag("hasLicense", String.valueOf(LicenseProvider.get().hasLicense())); + s.setTag("hasLicense", String.valueOf(LicenseProvider.get().hasPaidLicense())); s.setTag("updatesEnabled", AppPrefs.get() != null ? AppPrefs.get().automaticallyUpdate().getValue().toString() : "unknown"); s.setTag("initError", String.valueOf(OperationMode.isInStartup())); s.setTag( diff --git a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java index 7222fc01..8e1e3219 100644 --- a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java +++ b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java @@ -1,7 +1,7 @@ package io.xpipe.app.storage; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; import io.xpipe.core.store.FileNames; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -42,17 +42,23 @@ public class ContextualFileReference { } var ns = normalized(s.trim()); - // Replacement order is important - var replaced = ns.replace("", getDataDir()) - .replace("~", normalized(System.getProperty("user.home"))); + + String replaced; + var withHomeResolved = ns.replace("~", normalized(System.getProperty("user.home"))); + // Only replace ~ if it is part of data dir, otherwise keep it raw + if (withHomeResolved.startsWith(getDataDir())) { + replaced = withHomeResolved.replace("", getDataDir()); + } else { + replaced = ns.replace("", getDataDir()); + } return new ContextualFileReference(normalized(replaced)); } @NonNull private final String path; - public String toString() { - return path.replaceAll("/", Matcher.quoteReplacement(OsType.getLocal().getFileSystemSeparator())); + public String toFilePath(ShellControl sc) { + return path.replaceAll("/", Matcher.quoteReplacement(sc != null ? sc.getOsType().getFileSystemSeparator() : "/")); } public String serialize() { diff --git a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java index 5ac5d8a2..c89c62ad 100644 --- a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java +++ b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java @@ -46,4 +46,6 @@ public abstract class LicenseProvider { public abstract void init(); public abstract Comp overviewPage(); + + public abstract boolean hasPaidLicense(); } diff --git a/app/src/main/java/io/xpipe/app/util/ScriptHelper.java b/app/src/main/java/io/xpipe/app/util/ScriptHelper.java index 994b99e7..85bbd954 100644 --- a/app/src/main/java/io/xpipe/app/util/ScriptHelper.java +++ b/app/src/main/java/io/xpipe/app/util/ScriptHelper.java @@ -124,12 +124,12 @@ public class ScriptHelper { return file; } - public static String createAskPassScript(SecretValue pass, ShellControl parent, boolean forceExecutable) + public static String createAskpassScript(SecretValue pass, ShellControl parent, boolean forceExecutable, String errorMessage) throws Exception { - return createAskPassScript(pass != null ? List.of(pass) : List.of(), parent, forceExecutable); + return createAskpassScript(pass != null ? List.of(pass) : List.of(), parent, forceExecutable, errorMessage); } - public static String createAskPassScript(List pass, ShellControl parent, boolean forceExecutable) + public static String createAskpassScript(List pass, ShellControl parent, boolean forceExecutable, String errorMessage) throws Exception { var scriptType = parent.getShellDialect(); @@ -138,10 +138,10 @@ public class ScriptHelper { scriptType = parent.getOsType().equals(OsType.WINDOWS) ? ShellDialects.CMD : ShellDialects.SH; } - return createAskPassScript(pass, parent, scriptType); + return createAskpassScript(pass, parent, scriptType, errorMessage); } - private static String createAskPassScript(List pass, ShellControl parent, ShellDialect type) + private static String createAskpassScript(List pass, ShellControl parent, ShellDialect type, String errorMessage) throws Exception { var fileName = "exec-" + getScriptId() + "." + type.getScriptFileEnding(); var temp = parent.getSubTemporaryDirectory(); @@ -154,7 +154,7 @@ public class ScriptHelper { file, pass.stream() .map(secretValue -> secretValue.getSecretValue()) - .toList()); + .toList(), errorMessage); return createExecScript(sub.getShellDialect(), sub, file, content); } } else { @@ -164,7 +164,7 @@ public class ScriptHelper { file, pass.stream() .map(secretValue -> secretValue.getSecretValue()) - .toList()); + .toList(), errorMessage); return createExecScript(parent.getShellDialect(), parent, file, content); } } diff --git a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java index f1891584..646f3635 100644 --- a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java +++ b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java @@ -44,7 +44,7 @@ public interface SecretRetrievalStrategy { @Override public boolean isLocalAskpassCompatible() { - return false; + return true; } @Override @@ -125,25 +125,6 @@ public interface SecretRetrievalStrategy { } } - @JsonTypeName("dynamicPrompt") - class DynamicPrompt implements SecretRetrievalStrategy { - - @Override - public SecretValue retrieve(String displayName, UUID id, int sub) { - return AskpassAlert.query(displayName, UUID.randomUUID(), id, sub); - } - - @Override - public boolean shouldCache() { - return false; - } - - @Override - public boolean isLocalAskpassCompatible() { - return true; - } - } - @JsonTypeName("passwordManager") @Builder @Jacksonized diff --git a/core/src/main/java/io/xpipe/core/process/ShellControl.java b/core/src/main/java/io/xpipe/core/process/ShellControl.java index 9e454859..45c7acee 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellControl.java +++ b/core/src/main/java/io/xpipe/core/process/ShellControl.java @@ -1,5 +1,6 @@ package io.xpipe.core.process; +import io.xpipe.core.store.ShellStore; import io.xpipe.core.store.StatefulDataStore; import io.xpipe.core.util.*; import lombok.NonNull; @@ -16,6 +17,10 @@ import java.util.function.Predicate; public interface ShellControl extends ProcessControl { + Optional getSourceStore(); + + ShellControl withSourceStore(ShellStore store); + List getInitCommands(); ShellControl withTargetTerminalShellDialect(ShellDialect d); @@ -44,6 +49,8 @@ public interface ShellControl extends ProcessControl { ShellControl onInit(FailableConsumer pc); + ShellControl onPreInit(FailableConsumer pc); + default ShellControl withShellStateInit(StatefulDataStore store) { return onInit(shellControl -> { var s = store.getState(); @@ -169,6 +176,10 @@ public interface ShellControl extends ProcessControl { ShellControl additionalTimeout(int ms); + default ShellControl disableTimeout() { + return additionalTimeout(Integer.MAX_VALUE); + } + FailableSupplier getElevationPassword(); default ShellControl subShell(@NonNull ShellDialect type) { diff --git a/core/src/main/java/io/xpipe/core/process/ShellDialect.java b/core/src/main/java/io/xpipe/core/process/ShellDialect.java index 10baf13c..cacfddf4 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellDialect.java +++ b/core/src/main/java/io/xpipe/core/process/ShellDialect.java @@ -129,7 +129,7 @@ public interface ShellDialect { String getScriptPermissionsCommand(String file); - String prepareAskpassContent(ShellControl sc, String fileName, List s) throws Exception; + String prepareAskpassContent(ShellControl sc, String fileName, List s, String errorMessage) throws Exception; String getSetEnvironmentVariableCommand(String variable, String value);