From 08d0b297f54fb080536f6eea2695e910cc76fafb Mon Sep 17 00:00:00 2001 From: crschnick Date: Sat, 26 Sep 2026 10:17:57 +0000 Subject: [PATCH] Various fixes --- .../api/TerminalExternalLaunchExchange.java | 2 +- .../xpipe/app/beacon/mcp/McpToolHandler.java | 2 +- .../io/xpipe/app/beacon/mcp/McpTools.java | 2 +- .../app/browser/file/BrowserFileInput.java | 2 +- .../browser/file/BrowserFileListNameCell.java | 2 +- .../app/browser/file/BrowserFileOutput.java | 2 +- .../xpipe/app/storage/DataStorageQuery.java | 44 +++++++++---------- .../java/io/xpipe/app/util/PasswdFile.java | 4 -- 8 files changed, 28 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java index 26422fbac..8953edf29 100644 --- a/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java @@ -28,7 +28,7 @@ public class TerminalExternalLaunchExchange extends BeaconInterface getDataStoreRef(String name) throws BeaconClientException { - var found = DataStorageQuery.queryUserInput(name); + var found = DataStorageQuery.queryEntry(name); if (found.isEmpty()) { throw new BeaconClientException("No connection found for input " + name); } diff --git a/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java b/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java index 826ec2ae0..4e1b3b213 100644 --- a/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java +++ b/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java @@ -157,7 +157,7 @@ public final class McpTools { .tool(tool) .callHandler(McpToolHandler.of((req) -> { var filter = req.getStringArgument("filter"); - var entries = DataStorageQuery.queryUserInput(filter); + var entries = DataStorageQuery.queryEntry(filter); var list = new ArrayList(); for (var e : entries) { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java index e64bc202c..ecb78b6b5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java @@ -54,7 +54,7 @@ public interface BrowserFileInput { } var userOwned = info.getUid() != null - && sc.view().getPasswdFile().getUidForUser(sc.view().user()) == info.getUid() + && info.getUid().equals(sc.view().getPasswdFile().getUidForUserIfPresent(sc.view().user()).orElse(null)) || info.getUser() != null && sc.view().user().equals(info.getUser()); var userWrite = info.getPermissions().charAt(0) == 'r'; if (userOwned && userWrite) { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java index 0bb4e3e04..32fdaa56d 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java @@ -229,7 +229,7 @@ class BrowserFileListNameCell extends TableCell { .resolved() .getPath(); var currentPath = fileList.getFileSystemModel().getCurrentDirectory(); - var shownTarget = currentPath != null && target.startsWith(currentPath.getPath()) ? + var shownTarget = currentPath != null && target.startsWith(currentPath.getPath().toDirectory()) ? "./" + target.relativize(currentPath.getPath()) : target; fileName = i.getFileName() + " -> " + shownTarget; } else { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java index 88641c548..490072957 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java @@ -60,7 +60,7 @@ public interface BrowserFileOutput { } var userOwned = info.getUid() != null - && sc.view().getPasswdFile().getUidForUser(sc.view().user()) == info.getUid() + && info.getUid().equals(sc.view().getPasswdFile().getUidForUserIfPresent(sc.view().user()).orElse(null)) || info.getUser() != null && sc.view().user().equals(info.getUser()); var userWrite = info.getPermissions().charAt(1) == 'w'; if (userOwned && userWrite) { diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java b/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java index ebb103426..35079fffe 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java @@ -2,30 +2,25 @@ package io.xpipe.app.storage; import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; public class DataStorageQuery { - public static List queryUserInput(String input) { - var connectionFilter = input != null && !input.isEmpty() && !input.equals("*") && !input.equals("**") - ? "**" + input + "**" - : "**"; - var found = queryEntry("**", connectionFilter, "*"); + public static List queryEntry(String globInput) { + var found = queryEntry("**", globInput, "*"); if (found.size() > 1) { var narrowPath = found.stream() .filter(dataStoreEntry -> DataStorage.get() .getStorePath(dataStoreEntry) .toString() - .equalsIgnoreCase(input)) + .equalsIgnoreCase(globInput)) .toList(); if (narrowPath.size() >= 1) { return narrowPath; } var narrowName = found.stream() - .filter(dataStoreEntry -> dataStoreEntry.getName().equalsIgnoreCase(input)) + .filter(dataStoreEntry -> dataStoreEntry.getName().equalsIgnoreCase(globInput)) .toList(); if (narrowName.size() >= 1) { return narrowName; @@ -34,12 +29,12 @@ public class DataStorageQuery { return found; } - public static List queryCategory(String categoryFilter) { + public static List queryCategory(String categoryGlobFilter) { if (DataStorage.get() == null) { return List.of(); } - var catMatcher = compilePattern(categoryFilter); + var catMatcher = compileSearchPattern(categoryGlobFilter); List found = new ArrayList<>(); for (DataStoreCategory cat : DataStorage.get().getStoreCategories()) { @@ -53,14 +48,14 @@ public class DataStorageQuery { return found; } - public static List queryEntry(String categoryFilter, String connectionFilter, String typeFilter) { + public static List queryEntry(String categoryGlobFilter, String connectionGlobFilter, String typeGlobFilter) { if (DataStorage.get() == null) { return List.of(); } - var catMatcher = compilePattern(categoryFilter); - var conMatcher = compilePattern(connectionFilter); - var typeMatcher = compilePattern(typeFilter); + var catMatcher = compileSearchPattern(categoryGlobFilter); + var conMatcher = compileSearchPattern(connectionGlobFilter); + var typeMatcher = compileSearchPattern(typeGlobFilter); List found = new ArrayList<>(); for (DataStoreEntry storeEntry : DataStorage.get().getStoreEntries()) { @@ -96,14 +91,14 @@ public class DataStorageQuery { return found; } - public static String toRegex(String pattern) { - pattern = pattern.replaceAll("\\*\\*", "#"); + public static String toRegex(String globPattern) { + globPattern = globPattern.replaceAll("\\*\\*", "#"); // https://stackoverflow.com/a/17369948/6477761 - StringBuilder sb = new StringBuilder(pattern.length()); + StringBuilder sb = new StringBuilder(globPattern.length()); int inGroup = 0; int inClass = 0; int firstIndexInClass = -1; - char[] arr = pattern.toCharArray(); + char[] arr = globPattern.toCharArray(); for (int i = 0; i < arr.length; i++) { char ch = arr[i]; switch (ch) { @@ -199,11 +194,16 @@ public class DataStorageQuery { return sb.toString(); } - private static Pattern compilePattern(String pattern) { + private static Pattern compileSearchPattern(String globPattern) { + var complexGlob = !globPattern.isEmpty() && !globPattern.equals("*") && !globPattern.equals("**"); + if (!complexGlob) { + return Pattern.compile(toRegex(globPattern)); + } + try { - return Pattern.compile(toRegex(pattern.toLowerCase())); + return Pattern.compile(toRegex("**" + globPattern.toLowerCase() + "**")); } catch (Throwable e) { - return Pattern.compile(Pattern.quote(pattern)); + return Pattern.compile(Pattern.quote(globPattern)); } } } diff --git a/app/src/main/java/io/xpipe/app/util/PasswdFile.java b/app/src/main/java/io/xpipe/app/util/PasswdFile.java index d5388805e..e25821695 100644 --- a/app/src/main/java/io/xpipe/app/util/PasswdFile.java +++ b/app/src/main/java/io/xpipe/app/util/PasswdFile.java @@ -30,10 +30,6 @@ public class PasswdFile { return found != null ? Optional.of(found) : Optional.empty(); } - public int getUidForUser(String name) { - return getUidForUserIfPresent(name).orElse(0); - } - private void loadUsers(ShellControl sc) throws Exception { if (sc.getOsType() == OsType.WINDOWS || sc.getOsType() == OsType.MACOS) { return;