From dc1e1bda91ac634dfaea69830568d195bd5bcb7d Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 15 Sep 2025 06:58:24 +0000 Subject: [PATCH] Add sudo cache --- .../main/java/io/xpipe/app/process/ShellControl.java | 2 ++ .../main/java/io/xpipe/app/process/SudoCache.java | 12 ++++++++++++ .../io/xpipe/app/process/WrapperShellControl.java | 5 +++++ .../main/java/io/xpipe/app/util/SecretManager.java | 12 +++++++++--- 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/process/SudoCache.java diff --git a/app/src/main/java/io/xpipe/app/process/ShellControl.java b/app/src/main/java/io/xpipe/app/process/ShellControl.java index 91755b324..a63f12296 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellControl.java +++ b/app/src/main/java/io/xpipe/app/process/ShellControl.java @@ -271,4 +271,6 @@ public interface ShellControl extends ProcessControl { CommandControl command(CommandBuilder builder); void exitAndWait() throws IOException; + + SudoCache getSudoCache(); } diff --git a/app/src/main/java/io/xpipe/app/process/SudoCache.java b/app/src/main/java/io/xpipe/app/process/SudoCache.java new file mode 100644 index 000000000..56d1ef796 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/process/SudoCache.java @@ -0,0 +1,12 @@ +package io.xpipe.app.process; + +import io.xpipe.core.FilePath; + +public interface SudoCache { + + void setRequiresPassword(); + + boolean requiresPassword() throws Exception; + + FilePath getSudoExecutable() throws Exception; +} diff --git a/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java b/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java index 3d1ae3e6b..be45184fd 100644 --- a/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java +++ b/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java @@ -364,4 +364,9 @@ public class WrapperShellControl implements ShellControl { public void exitAndWait() throws IOException { parent.exitAndWait(); } + + @Override + public SudoCache getSudoCache() { + return parent.getSudoCache(); + } } diff --git a/app/src/main/java/io/xpipe/app/util/SecretManager.java b/app/src/main/java/io/xpipe/app/util/SecretManager.java index d90150405..ca492430c 100644 --- a/app/src/main/java/io/xpipe/app/util/SecretManager.java +++ b/app/src/main/java/io/xpipe/app/util/SecretManager.java @@ -88,12 +88,18 @@ public class SecretManager { return r; } - public static synchronized void completeRequest(UUID request) { - if (progress.removeIf( - secretQueryProgress -> secretQueryProgress.getRequestId().equals(request))) { + public static synchronized List completeRequest(UUID request) { + var found = progress.stream().filter( + secretQueryProgress -> secretQueryProgress.getRequestId().equals(request)) + .toList(); + + if (progress.removeAll(found)) { TrackEvent.withTrace("Completed secret request") .tag("uuid", request) .handle(); + return found; + } else { + return List.of(); } }