From 5a422c4502bff381bee917247478623014c606f0 Mon Sep 17 00:00:00 2001
From: ghidra1
Date: Tue, 30 Aug 2022 18:31:11 -0400
Subject: [PATCH] GP-2509 GP-2644 Improved Ghidra URL support. Added support
for Ghidra URL linked files and folders within project.
---
.../core/debug/DebuggerCoordinates.java | 4 +-
.../DebuggerTraceManagerServicePlugin.java | 13 +-
.../service/url/ProjectExperimentsTest.java | 2 +-
.../trace/database/DBTraceContentHandler.java | 32 +-
.../database/DBTraceLinkContentHandler.java | 71 +++
Ghidra/Features/Base/certification.manifest | 2 +-
.../CallAnotherScriptForAllPrograms.java | 8 +-
.../RepositoryFileUpgradeScript.java | 2 +
.../ghidra_scripts/VersionControl_AddAll.java | 5 +-
.../help/topics/Annotations/Annotations.html | 45 +-
.../FrontEndPlugin/Ghidra_Front_end.htm | 48 ++
.../images/LinkOtherProject.png | Bin 0 -> 37226 bytes
.../images/ViewOtherProjects.png | Bin 30835 -> 37159 bytes
.../core/calltree/CallTreeProvider.java | 9 +-
.../core/clear/ClearFlowAndRepairCmd.java | 26 +-
.../plugin/core/comments/CommentsDialog.java | 9 +-
.../core/datamgr/DataTypeManagerPlugin.java | 11 +-
.../core/datamgr/DataTypesProvider.java | 11 +-
.../associate/AssociateDataTypeAction.java | 31 +-
.../archive/DataTypeManagerHandler.java | 24 +-
.../core/datamgr/util/DataTypeUtils.java | 14 +-
.../plugin/core/exporter/ExporterDialog.java | 22 +-
.../misc/MyProgramChangesDisplayPlugin.java | 3 +-
.../processors/LanguageProviderPlugin.java | 26 +-
.../core/progmgr/MultiProgramManager.java | 119 ++--
.../core/progmgr/ProgramManagerPlugin.java | 308 +++++-----
.../core/progmgr/ProgramSaveManager.java | 17 +-
.../app/util/headless/HeadlessAnalyzer.java | 13 +-
.../ghidra/app/util/task/OpenProgramTask.java | 295 +++++++---
.../app/util/viewer/field/Annotation.java | 36 +-
.../GhidraLocalURLAnnotatedStringHandler.java | 34 ++
...GhidraServerURLAnnotatedStringHandler.java | 34 ++
.../field/URLAnnotatedStringHandler.java | 4 +-
.../ghidra/base/project/GhidraProject.java | 7 +
.../ghidra/framework/main/DataTreeDialog.java | 21 +-
.../src/main/java/ghidra/test/TestEnv.java | 69 ++-
.../Base/src/main/resources/images/link.png | Bin 410 -> 0 bytes
.../app/util/viewer/field/AnnotationTest.java | 99 +++-
.../data/ProjectFileManagerTest.java | 7 +-
.../framework/main/DataTreeDialogTest.java | 9 +-
.../project/AddViewToProjectTest.java | 4 +-
.../project/CreateDomainObjectTest.java | 2 +-
.../ghidra/base/project/FakeRepository.java | 37 +-
.../base/project/FakeSharedProject.java | 26 +-
.../CollectFailedRelocations.java | 4 +
.../CreateMultipleLibraries.java | 4 +
.../ghidra_scripts/FidStatistics.java | 4 +
.../FunctionID/ghidra_scripts/FindErrors.java | 11 +-
.../ghidra_scripts/FindFunctionByHash.java | 4 +
.../ghidra_scripts/FindNamedFunction.java | 10 +-
.../ghidra/feature/fid/plugin/IngestTask.java | 4 +
.../ghidra/feature/vt/api/db/VTSessionDB.java | 4 +-
.../vt/api/impl/VTSessionContentHandler.java | 15 +-
.../OpenVersionTrackingSessionAction.java | 13 +-
.../vt/gui/wizard/NewSessionPanel.java | 5 +-
.../feature/vt/gui/wizard/VTWizardUtils.java | 23 +-
.../java/db/buffers/BufferFileAdapter.java | 7 +-
.../java/docking/widgets/tree/GTreeNode.java | 26 +
.../tree/tasks/GTreeExpandAllTask.java | 21 +-
.../framework/client/RepositoryAdapter.java | 6 +-
.../client/RepositoryNotFoundException.java | 31 +
.../client/RepositoryServerAdapter.java | 25 +-
.../framework/remote/RepositoryHandle.java | 2 +-
.../store/FileSystemEventManager.java | 105 ++--
.../store/local/IndexedLocalFileSystem.java | 36 +-
.../store/local/IndexedV1LocalFileSystem.java | 3 +-
.../store/local/LocalFileSystem.java | 57 +-
.../local/AbstractLocalFileSystemTest.java | 7 +-
.../generic/test/AbstractGenericTest.java | 35 ++
.../java/generic/util/FileChannelLock.java | 6 +-
.../Framework/Project/certification.manifest | 1 +
.../data/project.icons.theme.properties | 6 +-
.../ghidra/framework/data/ContentHandler.java | 64 +--
.../framework/data/DBContentHandler.java | 109 +---
.../data/DBWithUserDataContentHandler.java | 144 +++++
.../framework/data/DomainFileProxy.java | 72 ++-
.../framework/data/DomainObjectAdapter.java | 30 +-
.../data/FolderLinkContentHandler.java | 119 ++++
.../ghidra/framework/data/GhidraFile.java | 89 ++-
.../ghidra/framework/data/GhidraFileData.java | 295 ++++++----
.../ghidra/framework/data/GhidraFolder.java | 86 ++-
.../framework/data/GhidraFolderData.java | 96 +++-
.../ghidra/framework/data/LinkHandler.java | 210 +++++++
.../framework/data/LinkedGhidraFile.java | 426 ++++++++++++++
.../framework/data/LinkedGhidraFolder.java | 138 +++++
.../framework/data/LinkedGhidraSubFolder.java | 294 ++++++++++
.../framework/data/ProjectFileManager.java | 301 +++++++---
.../{project => data}/ProjectLock.java | 2 +-
.../ghidra/framework/data/URLLinkObject.java | 101 ++++
.../ghidra/framework/main/FrontEndPlugin.java | 81 ++-
.../framework/main/ProjectActionManager.java | 13 +-
.../framework/main/ProjectDataPanel.java | 48 +-
.../main/datatable/ProjectDataTablePanel.java | 9 +-
.../main/datatable/ProjectTreeAction.java | 2 +-
.../main/datatree/ChangeManager.java | 38 +-
.../framework/main/datatree/CheckInTask.java | 2 +-
.../main/datatree/DomainFileNode.java | 58 +-
.../main/datatree/DomainFolderNode.java | 41 +-
.../main/datatree/ProjectDataTreePanel.java | 3 +
.../main/datatree/VersionControlDialog.java | 14 +-
.../main/datatree/VersionControlTask.java | 12 +-
.../actions/ProjectDataCopyAction.java | 4 -
.../actions/ProjectDataNewFolderAction.java | 5 +
.../actions/ProjectDataPasteLinkAction.java | 147 +++++
.../actions/VersionControlAddAction.java | 4 +-
.../actions/VersionControlCheckInAction.java | 2 +-
.../ghidra/framework/model/DomainFile.java | 98 +++-
.../framework/model/DomainFileFilter.java | 10 +-
.../ghidra/framework/model/DomainFolder.java | 46 +-
.../framework/model/LinkedDomainFile.java | 33 ++
.../framework/model/LinkedDomainFolder.java | 44 ++
.../java/ghidra/framework/model/Project.java | 29 +-
.../ghidra/framework/model/ProjectData.java | 13 +-
.../framework/model/ProjectLocator.java | 76 ++-
.../framework/model/ProjectViewListener.java | 42 ++
.../ghidra/framework/model/ToolServices.java | 54 +-
.../ghidra/framework/plugintool/Plugin.java | 12 +
.../framework/plugintool/PluginManager.java | 18 +
.../framework/plugintool/PluginTool.java | 13 +
.../plugintool/ToolServicesAdapter.java | 16 +
.../framework/project/DefaultProject.java | 276 +++++----
.../project/tool/GhidraToolTemplate.java | 2 +-
.../project/tool/ToolServicesImpl.java | 142 +++--
.../DefaultGhidraProtocolConnector.java | 41 +-
.../ghidra/DefaultGhidraProtocolHandler.java | 7 +-
.../DefaultLocalGhidraProtocolConnector.java | 51 +-
.../ghidra/GetUrlContentTypeTask.java | 113 ++++
.../ghidra/GhidraProtocolConnector.java | 109 ++--
.../framework/protocol/ghidra/GhidraURL.java | 530 +++++++++++++-----
.../protocol/ghidra/GhidraURLConnection.java | 160 ++++--
.../ghidra/GhidraURLWrappedContent.java | 42 +-
.../protocol/ghidra/RepositoryInfo.java | 8 +
.../protocol/ghidra/TransientProjectData.java | 4 +-
.../ghidra/TransientProjectManager.java | 26 +-
.../util/exception/BadLinkException.java | 30 +
.../src/main/resources/images/link.png | Bin 0 -> 2913 bytes
.../framework/model/TestDummyDomainFile.java | 31 +-
.../model/TestDummyDomainFolder.java | 11 +
.../framework/model/TestDummyProjectData.java | 7 -
.../DataTypeArchiveContentHandler.java | 37 +-
.../DataTypeArchiveLinkContentHandler.java | 71 +++
.../database/ProgramContentHandler.java | 34 +-
.../database/ProgramLinkContentHandler.java | 71 +++
.../program/database/ProgramUserDataDB.java | 8 +-
.../screenshot/FrontEndPluginScreenShots.java | 57 +-
.../screenshot/VersionControlScreenShots.java | 1 -
.../framework/main/LaunchUrlInToolTest.java | 343 ++++++++++++
.../ghidra/server/remote/ServerTestUtil.java | 66 ++-
.../java/ghidra/test/DataTreeHelper.java | 152 +++++
.../java/ghidra/test/FrontEndTestEnv.java | 84 +--
...faultGhidraProtocolConnectorParseTest.java | 128 +++++
...LocalGhidraProtocolConnectorParseTest.java | 77 +++
.../protocol/ghidra/GhidraURLTest.java | 499 +++++++++++++++++
153 files changed, 7083 insertions(+), 1732 deletions(-)
create mode 100644 Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceLinkContentHandler.java
create mode 100644 Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/images/LinkOtherProject.png
create mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/GhidraLocalURLAnnotatedStringHandler.java
create mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/GhidraServerURLAnnotatedStringHandler.java
delete mode 100644 Ghidra/Features/Base/src/main/resources/images/link.png
create mode 100644 Ghidra/Framework/FileSystem/src/main/java/ghidra/framework/client/RepositoryNotFoundException.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DBWithUserDataContentHandler.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/FolderLinkContentHandler.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/LinkHandler.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/LinkedGhidraFile.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/LinkedGhidraFolder.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/LinkedGhidraSubFolder.java
rename Ghidra/Framework/Project/src/main/java/ghidra/framework/{project => data}/ProjectLock.java (97%)
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/data/URLLinkObject.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataPasteLinkAction.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/model/LinkedDomainFile.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/model/LinkedDomainFolder.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/model/ProjectViewListener.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/protocol/ghidra/GetUrlContentTypeTask.java
create mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/util/exception/BadLinkException.java
create mode 100644 Ghidra/Framework/Project/src/main/resources/images/link.png
create mode 100644 Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/DataTypeArchiveLinkContentHandler.java
create mode 100644 Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/ProgramLinkContentHandler.java
create mode 100644 Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/LaunchUrlInToolTest.java
create mode 100644 Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/test/DataTreeHelper.java
create mode 100644 Ghidra/Test/IntegrationTest/src/test/java/ghidra/framework/protocol/ghidra/DefaultGhidraProtocolConnectorParseTest.java
create mode 100644 Ghidra/Test/IntegrationTest/src/test/java/ghidra/framework/protocol/ghidra/DefaultLocalGhidraProtocolConnectorParseTest.java
create mode 100644 Ghidra/Test/IntegrationTest/src/test/java/ghidra/framework/protocol/ghidra/GhidraURLTest.java
diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/DebuggerCoordinates.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/DebuggerCoordinates.java
index e556bd5631..01fd9f49d1 100644
--- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/DebuggerCoordinates.java
+++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/DebuggerCoordinates.java
@@ -27,6 +27,7 @@ import ghidra.framework.data.ProjectFileManager;
import ghidra.framework.model.*;
import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.PluginTool;
+import ghidra.framework.store.LockException;
import ghidra.trace.database.DBTraceContentHandler;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace;
@@ -643,6 +644,7 @@ public class DebuggerCoordinates {
ProjectData projData = tool.getProject().getProjectData(projLoc);
if (projData == null) {
try {
+ // FIXME! orphaned instance - transient in nature
projData = new ProjectFileManager(projLoc, false, false);
}
catch (NotOwnerException e) {
@@ -650,7 +652,7 @@ public class DebuggerCoordinates {
"Not project owner: " + projLoc + "(" + pathname + ")");
return null;
}
- catch (IOException e) {
+ catch (IOException | LockException e) {
Msg.showError(DebuggerCoordinates.class, tool.getToolFrame(), "Trace Open Failed",
"Project error: " + e.getMessage());
return null;
diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java
index d91aaacd57..3a81e82f92 100644
--- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java
+++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java
@@ -368,7 +368,18 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
if (traceChooserDialog != null) {
return traceChooserDialog;
}
- DomainFileFilter filter = df -> Trace.class.isAssignableFrom(df.getDomainObjectClass());
+ DomainFileFilter filter = new DomainFileFilter() {
+
+ @Override
+ public boolean accept(DomainFile df) {
+ return Trace.class.isAssignableFrom(df.getDomainObjectClass());
+ }
+
+ @Override
+ public boolean followLinkedFolders() {
+ return false;
+ }
+ };
// TODO regarding the hack note below, I believe this issue ahs been fixed, but not sure how to test
return traceChooserDialog =
diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/url/ProjectExperimentsTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/url/ProjectExperimentsTest.java
index 7234a74d4f..e0c6d45e19 100644
--- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/url/ProjectExperimentsTest.java
+++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/url/ProjectExperimentsTest.java
@@ -176,7 +176,7 @@ public class ProjectExperimentsTest extends AbstractGhidraHeadedIntegrationTest
assertNotNull(proj2 = pm.openProject(loc2, false, false));
- ProjectData data1 = proj2.addProjectView(loc1.getURL());
+ ProjectData data1 = proj2.addProjectView(loc1.getURL(), true);
assertNotNull(data1);
// It's a cryin' shame. I don't get *any* callbacks. _ANY!_
diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceContentHandler.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceContentHandler.java
index 8030c22464..f3018fbae1 100644
--- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceContentHandler.java
+++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceContentHandler.java
@@ -18,11 +18,13 @@ package ghidra.trace.database;
import java.io.IOException;
import javax.swing.Icon;
+import javax.swing.ImageIcon;
import db.DBHandle;
import db.buffers.BufferFile;
import db.buffers.ManagedBufferFile;
-import ghidra.framework.data.*;
+import ghidra.framework.data.DBWithUserDataContentHandler;
+import ghidra.framework.data.DomainObjectMergeManager;
import ghidra.framework.model.ChangeSet;
import ghidra.framework.model.DomainObject;
import ghidra.framework.store.*;
@@ -34,9 +36,16 @@ import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor;
-public class DBTraceContentHandler extends DBContentHandler {
+public class DBTraceContentHandler extends DBWithUserDataContentHandler {
public static final String TRACE_CONTENT_TYPE = "Trace";
+ public static ImageIcon TRACE_ICON = Trace.TRACE_ICON;
+
+ static final Class TRACE_DOMAIN_OBJECT_CLASS = DBTrace.class;
+ static final String TRACE_CONTENT_DEFAULT_TOOL = "Debugger";
+
+ private static final DBTraceLinkContentHandler linkHandler = new DBTraceLinkContentHandler();
+
@Override
public long createFile(FileSystem fs, FileSystem userfs, String path, String name,
DomainObject obj, TaskMonitor monitor)
@@ -48,7 +57,7 @@ public class DBTraceContentHandler extends DBContentHandler {
}
@Override
- public DomainObjectAdapter getImmutableObject(FolderItem item, Object consumer, int version,
+ public DBTrace getImmutableObject(FolderItem item, Object consumer, int version,
int minChangeVersion, TaskMonitor monitor)
throws IOException, CancelledException, VersionException {
String contentType = item.getContentType();
@@ -96,7 +105,7 @@ public class DBTraceContentHandler extends DBContentHandler {
}
@Override
- public DomainObjectAdapter getReadOnlyObject(FolderItem item, int version, boolean okToUpgrade,
+ public DBTrace getReadOnlyObject(FolderItem item, int version, boolean okToUpgrade,
Object consumer, TaskMonitor monitor)
throws IOException, VersionException, CancelledException {
String contentType = item.getContentType();
@@ -146,7 +155,7 @@ public class DBTraceContentHandler extends DBContentHandler {
}
@Override
- public DomainObjectAdapter getDomainObject(FolderItem item, FileSystem userfs, long checkoutId,
+ public DBTrace getDomainObject(FolderItem item, FileSystem userfs, long checkoutId,
boolean okToUpgrade, boolean recover, Object consumer, TaskMonitor monitor)
throws IOException, CancelledException, VersionException {
String contentType = item.getContentType();
@@ -296,8 +305,8 @@ public class DBTraceContentHandler extends DBContentHandler {
}
@Override
- public Class extends DomainObject> getDomainObjectClass() {
- return DBTrace.class;
+ public Class getDomainObjectClass() {
+ return TRACE_DOMAIN_OBJECT_CLASS;
}
@Override
@@ -312,12 +321,12 @@ public class DBTraceContentHandler extends DBContentHandler {
@Override
public String getDefaultToolName() {
- return "Debugger";
+ return TRACE_CONTENT_DEFAULT_TOOL;
}
@Override
public Icon getIcon() {
- return Trace.TRACE_ICON;
+ return TRACE_ICON;
}
@Override
@@ -331,4 +340,9 @@ public class DBTraceContentHandler extends DBContentHandler {
// TODO:
return null;
}
+
+ @Override
+ public DBTraceLinkContentHandler getLinkHandler() {
+ return linkHandler;
+ }
}
diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceLinkContentHandler.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceLinkContentHandler.java
new file mode 100644
index 0000000000..f64526be0a
--- /dev/null
+++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceLinkContentHandler.java
@@ -0,0 +1,71 @@
+/* ###
+ * IP: GHIDRA
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package ghidra.trace.database;
+
+import java.io.IOException;
+
+import javax.swing.Icon;
+
+import ghidra.framework.data.LinkHandler;
+import ghidra.framework.data.URLLinkObject;
+import ghidra.framework.model.DomainObject;
+import ghidra.framework.store.FileSystem;
+import ghidra.util.InvalidNameException;
+import ghidra.util.exception.CancelledException;
+import ghidra.util.task.TaskMonitor;
+
+public class DBTraceLinkContentHandler extends LinkHandler {
+
+ public static final String TRACE_LINK_CONTENT_TYPE = "TraceLink";
+
+ @Override
+ public long createFile(FileSystem fs, FileSystem userfs, String path, String name,
+ DomainObject obj, TaskMonitor monitor)
+ throws IOException, InvalidNameException, CancelledException {
+ if (!(obj instanceof URLLinkObject)) {
+ throw new IOException("Unsupported domain object: " + obj.getClass().getName());
+ }
+ return createFile((URLLinkObject) obj, TRACE_LINK_CONTENT_TYPE, fs, path, name,
+ monitor);
+ }
+
+ @Override
+ public String getContentType() {
+ return TRACE_LINK_CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentTypeDisplayString() {
+ return TRACE_LINK_CONTENT_TYPE;
+ }
+
+ @Override
+ public Class getDomainObjectClass() {
+ // return linked content class
+ return DBTraceContentHandler.TRACE_DOMAIN_OBJECT_CLASS;
+ }
+
+ @Override
+ public Icon getIcon() {
+ return DBTraceContentHandler.TRACE_ICON;
+ }
+
+ @Override
+ public String getDefaultToolName() {
+ return DBTraceContentHandler.TRACE_CONTENT_DEFAULT_TOOL;
+ }
+
+}
diff --git a/Ghidra/Features/Base/certification.manifest b/Ghidra/Features/Base/certification.manifest
index d35661f6a9..195fbaad40 100644
--- a/Ghidra/Features/Base/certification.manifest
+++ b/Ghidra/Features/Base/certification.manifest
@@ -351,6 +351,7 @@ src/main/help/help/topics/FrontEndPlugin/images/DeleteProject.png||GHIDRA||||END
src/main/help/help/topics/FrontEndPlugin/images/EditPluginPath.png||GHIDRA||||END|
src/main/help/help/topics/FrontEndPlugin/images/EditProjectAccessList.png||GHIDRA||||END|
src/main/help/help/topics/FrontEndPlugin/images/EditProjectAccessPanel.png||GHIDRA||||END|
+src/main/help/help/topics/FrontEndPlugin/images/LinkOtherProject.png||GHIDRA||||END|
src/main/help/help/topics/FrontEndPlugin/images/MemoryUsage.png||GHIDRA||||END|
src/main/help/help/topics/FrontEndPlugin/images/NonSharedProjectInfo.png||GHIDRA||||END|
src/main/help/help/topics/FrontEndPlugin/images/OpenProject.png||GHIDRA||||END|
@@ -1089,7 +1090,6 @@ src/main/resources/images/layout_add.png||FAMFAMFAM Icons - CC 2.5|||famfamfam s
src/main/resources/images/ledgreen.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
src/main/resources/images/ledred.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
src/main/resources/images/ledyellow.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
-src/main/resources/images/link.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
src/main/resources/images/lock.gif||GHIDRA||||END|
src/main/resources/images/magnifier.png||FAMFAMFAM Icons - CC 2.5||||END|
src/main/resources/images/media-flash.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
diff --git a/Ghidra/Features/Base/ghidra_scripts/CallAnotherScriptForAllPrograms.java b/Ghidra/Features/Base/ghidra_scripts/CallAnotherScriptForAllPrograms.java
index 4832a4be91..2394c1f664 100644
--- a/Ghidra/Features/Base/ghidra_scripts/CallAnotherScriptForAllPrograms.java
+++ b/Ghidra/Features/Base/ghidra_scripts/CallAnotherScriptForAllPrograms.java
@@ -17,6 +17,8 @@
// NOTE: Script will only process unversioned and checked-out files.
//@category Examples
+import java.io.IOException;
+
import ghidra.app.script.GhidraScript;
import ghidra.app.script.GhidraState;
import ghidra.framework.model.*;
@@ -25,8 +27,6 @@ import ghidra.program.model.listing.Program;
import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException;
-import java.io.IOException;
-
public class CallAnotherScriptForAllPrograms extends GhidraScript {
// The script referenced in the following line should be replaced with the script to be called
@@ -59,6 +59,10 @@ public class CallAnotherScriptForAllPrograms extends GhidraScript {
}
private void processDomainFile(DomainFile domainFile) throws CancelledException, IOException {
+ // Do not follow folder-links or consider program links. Using content type
+ // to filter is best way to control this. If program links should be considered
+ // "Program.class.isAssignableFrom(domainFile.getDomainObjectClass())"
+ // should be used.
if (!ProgramContentHandler.PROGRAM_CONTENT_TYPE.equals(domainFile.getContentType())) {
return; // skip non-Program files
}
diff --git a/Ghidra/Features/Base/ghidra_scripts/RepositoryFileUpgradeScript.java b/Ghidra/Features/Base/ghidra_scripts/RepositoryFileUpgradeScript.java
index db4c0acaec..617aab04a8 100644
--- a/Ghidra/Features/Base/ghidra_scripts/RepositoryFileUpgradeScript.java
+++ b/Ghidra/Features/Base/ghidra_scripts/RepositoryFileUpgradeScript.java
@@ -143,6 +143,8 @@ public class RepositoryFileUpgradeScript extends GhidraScript {
}
private boolean performProgramUpgrade(DomainFile df) throws IOException, CancelledException {
+ // Do not follow folder-links or consider program links. Using content type
+ // to filter is best way to control this.
if (!ProgramContentHandler.PROGRAM_CONTENT_TYPE.equals(df.getContentType())) {
return false;
}
diff --git a/Ghidra/Features/Base/ghidra_scripts/VersionControl_AddAll.java b/Ghidra/Features/Base/ghidra_scripts/VersionControl_AddAll.java
index c1f2f84d62..63db21645d 100644
--- a/Ghidra/Features/Base/ghidra_scripts/VersionControl_AddAll.java
+++ b/Ghidra/Features/Base/ghidra_scripts/VersionControl_AddAll.java
@@ -48,7 +48,10 @@ public class VersionControl_AddAll extends GhidraScript {
if (monitor.isCancelled()) {
break;
}
-
+ // Do not follow folder-links or consider program links. Using content type
+ // to filter is best way to control this. If program links should be considered
+ // "Program.class.isAssignableFrom(domainFile.getDomainObjectClass())"
+ // should be used. It may also be appropriate to handle other content types.
if (!ProgramContentHandler.PROGRAM_CONTENT_TYPE.equals(file.getContentType()) ||
file.isVersioned()) {
continue;// skip
diff --git a/Ghidra/Features/Base/src/main/help/help/topics/Annotations/Annotations.html b/Ghidra/Features/Base/src/main/help/help/topics/Annotations/Annotations.html
index 288af811a4..acb36fbbd4 100644
--- a/Ghidra/Features/Base/src/main/help/help/topics/Annotations/Annotations.html
+++ b/Ghidra/Features/Base/src/main/help/help/topics/Annotations/Annotations.html
@@ -22,13 +22,15 @@
hyperlink.
- The following text shows the syntax of the URL annotation:
+ The following text shows the syntax of a sample URL annotation:
- {@url "http://www.google.com"}
+ {@url "http://www.google.com" "Search Web"}
The bold text is required for all annotations. The italicized text is required but is
- specific to the annotation being used (see the table below).
+ specific to the annotation being used (see the table below). The optional rendered display text
+ "Search Web" will be displayed in listing. If the optional display test is omitted, the URL
+ will be displayed. Quotes around display text are optional.
Examples
@@ -47,10 +49,21 @@
Rendered URL Annotation Example
When the URL text (e.g., "http://www.google.com") in the above image is clicked from within
- Ghidra, a web browser is launched and attempts to load the corresponding web page. If the URL text
- is of the form ghidra://<host>[:<port>]/<repository-name>/<program-path>[#<address-or-symbol-ref>]
- an attempt will be made to open the corresponding program from the referenced Ghidra Server (e.g.,
- ghidra://myserver/Repo/notepad.exe#entry).
+ Ghidra, a web browser is launched and attempts to load the corresponding web page.
+
+ If the URL text corresponds to a Ghidra URL and attempt will be made to open the referenced
+ Program file within the Code Browser. Such a URL may refer to a Program file from a
+ local project or Ghidra Server. The Ghidra URL forms supported include:
+
+ Remote Ghidra Server file
+ ghidra://<host>[:<port>]/<repository-name>/<program-path>[#<address-or-symbol-ref>]
+ Example: ghidra://hostname/Repo/notepad.exe#entry
+
+
+ Local Ghidra project file
+ ghidra:/[<project-path>/]<project-name>?/<program-path>[#<address-or-symbol-ref>]
+ Example: ghidra:/share/MyProject?/notepad.exe#entry
+
Valid Annotations
@@ -174,9 +187,10 @@
Displays the given URL has a hyperlink. This annotation
optionally takes display text so that the hyperlink may be displayed with text other
than that of the URL.
- References to ghidra://, which refer to a program within a Ghidra Server repository,
- will be opened within the Listing display, while all other URL protocols (e.g., http://, https://,
- file://, etc.) will be launched via an external web browser (see
+ References to a program file on a Ghidra Server (ghidra://<host...) or
+ local project (ghidra:/<project-...) will be opened within the Listing display,
+ while all other URL forms (e.g., http://, https://, file://, etc.) will be
+ launched via an external web browser (see
command configuration
for Processor Manuals).
|
@@ -216,6 +230,12 @@
{@url "ghidra://myserver/Repo/notepad.exe#entry"}
{@url "ghidra://myserver/Repo/notepad.exe" "see notepad.exe"}
+
+ {@url "ghidra:/share/MyProject?/notepad.exe#entry"}
+
+ {@url "ghidra:/share/MyProject?/notepad.exe" "see notepad.exe"}
+
+
@@ -224,8 +244,9 @@
Program
|
- Displays a hyperlink to the given Ghidra program name that
- will open that program in a new Listing tab when clicked.
+ | Displays a hyperlink to the given Ghidra program pathname
+ with the current project. Referenced program
+ will open in a new Listing tab when clicked.
You may optionally provide an address or symbol to be displayed when the program is
opened by appending to the program name an '@' character, followed by an address or
symbol name. |
diff --git a/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/Ghidra_Front_end.htm b/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/Ghidra_Front_end.htm
index db73da2d09..8ba831bb37 100644
--- a/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/Ghidra_Front_end.htm
+++ b/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/Ghidra_Front_end.htm
@@ -688,6 +688,54 @@
The tabbed pane for read-only Project data is removed from the Project Window.
+
+ Create Linked Folder or File
+
+
+ This feature allows you to create a folder or file link in your active project to a
+ corresponding folder or file within a read-only viewed project.
+ This is done using a Ghidra URL which references the
+ file in its local or remote storage location. If the viewed project corresponds to a
+ viewed repository a remote URL will be used, while other cases will refer to the
+ locally viewed project. It is possible for links to become broken if the referenced
+ repository, local project or file location are changed.
+
+ - Select a single folder or file from a viewed READ-ONLY Project Data tree.
+ - Right mouse click on the selected tree node and choose the Copy option.
+ - Select a destination folder in the active project tree.
+ - Right mouse click on the folder and choose the Paste as Link option.
+
Currently, linked-file types are
+ currently limited to Program and Data Type Archive files
+ only. The Past as Link menu item will be disabled for
+ unsupported file content types or for other unsupported situations such as internal
+ linking within the same project.
+
+
+ A linked-file may be opened in a tool via the project window in the same fashion that
+ a normal file is opened (e.g., double-left-mouse-click or drag-n-drop onto a tool box icon).
+ Such a project file may also be opened within a Tool using its File->Open... action
+ and selected from the resulting project file selection dilaog.
+ Clicking on a linked-folder in the active project window will open that location in a
+ READ-ONLY Project Data tree. The user may be prompted for a shared repository
+ connection password when accessing a linked folder or file.
+ Within a project file chooser dialog a linked-folder may be expanded in a similar fashion
+ to local folders provided any neccessary repository connection can be completed.
+
Add to Version Control... is supported
+ for repository folder and file links only and will be disabled for links to a
+ local project.
+
Currently, linked-files only provide access
+ to the latest file version and do not facilitate access to older file versions.
+ The project window below shows a Program file-link "Program1" which is linked to the
+ same file in the viewed project. Hovering the mouse over a linked-file will show the URL
+ of the linked file or folder. The chain-link icon decoration indicates such a linked
+ file or folder.
+
+
+
+
+
+
+
Workspaces
diff --git a/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/images/LinkOtherProject.png b/Ghidra/Features/Base/src/main/help/help/topics/FrontEndPlugin/images/LinkOtherProject.png
new file mode 100644
index 0000000000000000000000000000000000000000..15d4c8bcaaa7595d9a82b2bd7fb263e58ab0a7be
GIT binary patch
literal 37226
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