From a8b604647ed494c43d105840c938cde446449c70 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Fri, 18 Jul 2025 19:13:40 +0000 Subject: [PATCH] GP-0 fix FSB tests and the 'list mounted' feature. --- .../fsbrowser/FSBComponentProvider.java | 7 ++- .../ghidra/plugins/fsbrowser/FSBRootNode.java | 4 +- .../fsbrowser/FileSystemBrowserPlugin.java | 20 +++++-- .../ListMountedFSBFileHandler.java | 56 +++++++++++++++---- 4 files changed, 67 insertions(+), 20 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBComponentProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBComponentProvider.java index 2b8eb4a1c4..4486a0cc9a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBComponentProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBComponentProvider.java @@ -230,8 +230,11 @@ public class FSBComponentProvider extends ComponentProviderAdapter plugin.getTool().removePopupActionProvider(this); projectIndex.removeIndexListener(this); - if (rootNode != null && rootNode.getFSRef() != null && !rootNode.getFSRef().isClosed()) { - rootNode.getFSRef().getFilesystem().getRefManager().removeListener(this); + if (rootNode != null) { + FileSystemRef rootNodeFSRef = rootNode.getFSRef(); + if (rootNodeFSRef != null && !rootNodeFSRef.isClosed()) { + rootNodeFSRef.getFilesystem().getRefManager().removeListener(this); + } } fileHandlers.clear(); if (gTree != null) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBRootNode.java b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBRootNode.java index fded6f8da6..632e648c8c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBRootNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FSBRootNode.java @@ -107,11 +107,11 @@ public class FSBRootNode extends FSBNode { } public FileSystemRef getFSRef() { - return modelNode.rootDir.fsRef; + return modelNode.rootDir != null ? modelNode.rootDir.fsRef : null; } private void releaseFSRefIfModelNode() { - if (this != modelNode) { + if (this != modelNode || rootDir == null) { return; } FileSystemService.getInstance().releaseFileSystemImmediate(rootDir.fsRef); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FileSystemBrowserPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FileSystemBrowserPlugin.java index a6b6a1cedb..6f169f9145 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FileSystemBrowserPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/FileSystemBrowserPlugin.java @@ -168,6 +168,12 @@ public class FileSystemBrowserPlugin extends Plugin } if (show) { + showProvider(provider); + } + } + + public void showProvider(FSBComponentProvider provider) { + if (provider != null) { getTool().showComponentProvider(provider, true); getTool().toFront(provider); provider.contextChanged(); @@ -283,20 +289,24 @@ public class FileSystemBrowserPlugin extends Plugin } /** - * For testing access only. + * Returns an already opened provider for the specified FSRL. * - * @param fsFSRL {@link FSRLRoot} of browser component to fetch. + * @param fsrl {@link FSRL} of root dir of browser component to fetch. * @return provider or null if not found. */ - /* package */ FSBComponentProvider getProviderFor(FSRLRoot fsFSRL) { - FSBComponentProvider provider = currentBrowsers.get(fsFSRL); + public FSBComponentProvider getProviderFor(FSRL fsrl) { + FSBComponentProvider provider = currentBrowsers.get(fsrl); if (provider == null) { - Msg.info(this, "Could not find browser for " + fsFSRL); + Msg.info(this, "Could not find browser for " + fsrl); return null; } return provider; } + public List getCurrentlyOpenBrowsers() { + return List.copyOf(currentBrowsers.keySet()); + } + //-------------------------------------------------------------------------------------------- @Override public void processEvent(PluginEvent event) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/filehandlers/ListMountedFSBFileHandler.java b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/filehandlers/ListMountedFSBFileHandler.java index 6d78533eb8..da76f836e8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/filehandlers/ListMountedFSBFileHandler.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/plugins/fsbrowser/filehandlers/ListMountedFSBFileHandler.java @@ -15,13 +15,14 @@ */ package ghidra.plugins.fsbrowser.filehandlers; +import java.io.File; +import java.util.ArrayList; import java.util.List; import docking.action.DockingAction; import docking.action.builder.ActionBuilder; import docking.widgets.SelectFromListDialog; -import ghidra.formats.gfilesystem.FSRLRoot; -import ghidra.formats.gfilesystem.FileSystemRef; +import ghidra.formats.gfilesystem.*; import ghidra.plugins.fsbrowser.*; public class ListMountedFSBFileHandler implements FSBFileHandler { @@ -45,19 +46,52 @@ public class ListMountedFSBFileHandler implements FSBFileHandler { .popupMenuPath("List Mounted Filesystems") .popupMenuGroup("L") .onAction(ac -> { - FSRLRoot fsFSRL = SelectFromListDialog.selectFromList( - context.fsService().getMountedFilesystems(), "Select filesystem", - "Choose filesystem to view", f -> f.toPrettyString()); + List sortedFSRLs = new ArrayList<>(); + sortedFSRLs.addAll(context.plugin().getCurrentlyOpenBrowsers()); + sortedFSRLs.sort((f1, f2) -> f1.toString().compareTo(f2.toString())); + FSRL fsrl = SelectFromListDialog.selectFromList(sortedFSRLs, + "Select filesystem", "Choose filesystem to view", + f -> getPrettyFSRLString(f)); + + if (fsrl != null) { + context.plugin().showProvider(context.plugin().getProviderFor(fsrl)); - FileSystemRef fsRef; - if (fsFSRL != null && - (fsRef = context.fsService().getMountedFilesystem(fsFSRL)) != null) { - context.fsbComponent() - .getPlugin() - .createNewFileSystemBrowser(fsRef, null, true); } }) .build()); } + private String getPrettyFSRLString(FSRL fsrl) { + FileSystemService fsService = context.fsService(); + LocalFileSystem localFS = fsService.getLocalFS(); + if (localFS.getRootDir().getFSRL().equals(fsrl)) { + return "My Computer"; + } + else if (fsrl.getNestingDepth() == 1) { + return new File(fsrl.getPath()).getPath(); + } + else { + if (fsrl.getPath().equals("/")) { + fsrl = fsrl.getFS(); + } + String result = ""; + List fsrlParts = fsrl.split(); + for (int i = 0; i < fsrlParts.size(); i++) { + FSRL part = fsrlParts.get(i); + if (i == 0) { + result = new File(part.getPath()).getPath(); + } + else { + if (part instanceof FSRLRoot) { + // skip, will be last element + } + else { + result += "|" + part.getPath(); + } + } + } + return result; + } + } + }