From 45712ab796ba80b44b6882dd9f2bddd614fe14ff Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 23 Sep 2022 12:35:45 -0400 Subject: [PATCH 1/4] ui calls don't occur with headless --- .../sleuthkit/autopsy/casemodule/Case.java | 17 +++---- .../org/sleuthkit/autopsy/core/Installer.java | 16 ++++-- .../autopsy/corecomponents/Installer.java | 49 +++++++++++-------- .../autopsy/ingest/IngestManager.java | 23 +++++---- .../sleuthkit/autopsy/ingest/Installer.java | 5 +- 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 6f10bcf364..5a3b916737 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -25,6 +25,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData; import java.awt.Frame; +import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeListener; @@ -41,7 +42,6 @@ import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -133,8 +133,6 @@ import org.sleuthkit.autopsy.events.AutopsyEventPublisher; import org.sleuthkit.autopsy.discovery.ui.OpenDiscoveryAction; import org.sleuthkit.autopsy.ingest.IngestJob; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.IngestServices; -import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences; @@ -143,18 +141,13 @@ import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.autopsy.timeline.OpenTimelineAction; import org.sleuthkit.autopsy.timeline.events.TimelineEventAddedEvent; -import org.sleuthkit.datamodel.Blackboard; -import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifactTag; import org.sleuthkit.datamodel.CaseDbConnectionInfo; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.FileSystem; -import org.sleuthkit.datamodel.Host; import org.sleuthkit.datamodel.Image; -import org.sleuthkit.datamodel.OsAccount; -import org.sleuthkit.datamodel.Person; import org.sleuthkit.datamodel.Report; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TimelineManager; @@ -209,9 +202,11 @@ public class Case { * changing the main window title. */ static { - WindowManager.getDefault().invokeWhenUIReady(() -> { - mainFrame = WindowManager.getDefault().getMainWindow(); - }); + if (!GraphicsEnvironment.isHeadless()) { + WindowManager.getDefault().invokeWhenUIReady(() -> { + mainFrame = WindowManager.getDefault().getMainWindow(); + }); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/core/Installer.java b/Core/src/org/sleuthkit/autopsy/core/Installer.java index 095cb7c6ff..60781effd8 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/core/Installer.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.core; import com.sun.jna.platform.win32.Kernel32; import java.awt.Cursor; +import java.awt.GraphicsEnvironment; import java.io.File; import java.io.IOException; import java.nio.file.Path; @@ -369,7 +370,11 @@ public class Installer extends ModuleInstall { ensurePythonModulesFolderExists(); ensureClassifierFolderExists(); ensureOcrLanguagePacksFolderExists(); - initJavaFx(); + + if (!GraphicsEnvironment.isHeadless()) { + initJavaFx(); + } + initializeSevenZip(); for (ModuleInstall mi : packageInstallers) { try { @@ -473,7 +478,10 @@ public class Installer extends ModuleInstall { @Override public boolean closing() { if (IngestRunningCheck.checkAndConfirmProceed(Bundle.Installer_closing_confirmationDialog_title(), Bundle.Installer_closing_confirmationDialog_message())) { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + if (!GraphicsEnvironment.isHeadless() && RuntimeProperties.runningWithGUI()) { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } + FutureTask future = new FutureTask<>(new Callable() { @Override public Void call() throws Exception { @@ -491,7 +499,9 @@ public class Installer extends ModuleInstall { logger.log(Level.SEVERE, "Error closing the current case", ex); MessageNotifyUtil.Message.error(Bundle.Installer_closing_messageBox_caseCloseExceptionMessage(ex.getMessage())); } finally { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + if (!GraphicsEnvironment.isHeadless() && RuntimeProperties.runningWithGUI()) { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } } return true; } else { diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java index 30d692747d..2e1850b390 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.corecomponents; import java.awt.Font; +import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -33,13 +34,12 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; import javax.swing.UnsupportedLookAndFeelException; -import org.netbeans.spi.sendopts.OptionProcessor; import org.netbeans.swing.tabcontrol.plaf.DefaultTabbedContainerUI; import org.openide.modules.ModuleInstall; -import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.StartupWindowProvider; +import org.sleuthkit.autopsy.commandlineingest.CommandLineIngestManager; import org.sleuthkit.autopsy.commandlineingest.CommandLineOptionProcessor; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -77,12 +77,15 @@ public class Installer extends ModuleInstall { } - SwingUtilities.invokeLater(() -> { - setLookAndFeel(); - }); - UIManager.put("ViewTabDisplayerUI", "org.sleuthkit.autopsy.corecomponents.NoTabsTabDisplayerUI"); - UIManager.put(DefaultTabbedContainerUI.KEY_VIEW_CONTENT_BORDER, BorderFactory.createEmptyBorder()); - UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); + if (!GraphicsEnvironment.isHeadless()) { + SwingUtilities.invokeLater(() -> { + setLookAndFeel(); + }); + + UIManager.put("ViewTabDisplayerUI", "org.sleuthkit.autopsy.corecomponents.NoTabsTabDisplayerUI"); + UIManager.put(DefaultTabbedContainerUI.KEY_VIEW_CONTENT_BORDER, BorderFactory.createEmptyBorder()); + UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); + } final CommandLineOptionProcessor finalprocessor = processor; @@ -97,20 +100,24 @@ public class Installer extends ModuleInstall { // Why not just listen to the command processor instead of using the invokeWhen? // If there were no command line options supplied then the process method will never // be called. - WindowManager.getDefault().invokeWhenUIReady(() -> { - if(WindowManager.getDefault().getMainWindow().isVisible() || finalprocessor == null || finalprocessor.getState() == CommandLineOptionProcessor.ProcessState.COMPLETED) { - StartupWindowProvider.getInstance().open(); - } else { - finalprocessor.addPropertyChangeListener(new PropertyChangeListener(){ - @Override - public void propertyChange(PropertyChangeEvent evt) { - if(evt.getPropertyName().equals(CommandLineOptionProcessor.PROCESSING_COMPLETED)) { - StartupWindowProvider.getInstance().open(); + if (GraphicsEnvironment.isHeadless()) { + new CommandLineIngestManager().start(); + } else { + WindowManager.getDefault().invokeWhenUIReady(() -> { + if(WindowManager.getDefault().getMainWindow().isVisible() || finalprocessor == null || finalprocessor.getState() == CommandLineOptionProcessor.ProcessState.COMPLETED) { + StartupWindowProvider.getInstance().open(); + } else { + finalprocessor.addPropertyChangeListener(new PropertyChangeListener(){ + @Override + public void propertyChange(PropertyChangeEvent evt) { + if(evt.getPropertyName().equals(CommandLineOptionProcessor.PROCESSING_COMPLETED)) { + StartupWindowProvider.getInstance().open(); + } } - } - }); - } - }); + }); + } + }); + } } @Override diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 01938c326c..e84cd5f464 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.ingest; import com.google.common.eventbus.Subscribe; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.EventQueue; +import java.awt.GraphicsEnvironment; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; @@ -574,18 +575,20 @@ public class IngestManager implements IngestProgressSnapshotProvider { // initialize IngestMessageInbox, if it hasn't been initialized yet. This can't be done in // the constructor because that ends up freezing the UI on startup (JIRA-7345). - if (SwingUtilities.isEventDispatchThread()) { - initIngestMessageInbox(); - } else { - try { - SwingUtilities.invokeAndWait(() -> initIngestMessageInbox()); - } catch (InterruptedException ex) { - // ignore interruptions - } catch (InvocationTargetException ex) { - logger.log(Level.WARNING, "There was an error starting ingest message inbox", ex); + if (!GraphicsEnvironment.isHeadless()) { + if (SwingUtilities.isEventDispatchThread()) { + initIngestMessageInbox(); + } else { + try { + SwingUtilities.invokeAndWait(() -> initIngestMessageInbox()); + } catch (InterruptedException ex) { + // ignore interruptions + } catch (InvocationTargetException ex) { + logger.log(Level.WARNING, "There was an error starting ingest message inbox", ex); + } } } - + List errors = null; Case openCase; try { diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java index 19fa852b20..91aaa2c534 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.ingest; +import java.awt.GraphicsEnvironment; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -68,7 +69,9 @@ public class Installer extends ModuleInstall { @Override public boolean closing() { //force ingest inbox closed on exit and save state as such - IngestMessageTopComponent.findInstance().close(); + if (!GraphicsEnvironment.isHeadless()) { + IngestMessageTopComponent.findInstance().close(); + } return true; } From 8a402d8c9e37f4c989322bff40b05c558a3d8343 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 23 Sep 2022 12:49:11 -0400 Subject: [PATCH 2/4] space fix --- Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index e84cd5f464..90de8a188f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -588,7 +588,7 @@ public class IngestManager implements IngestProgressSnapshotProvider { } } } - + List errors = null; Case openCase; try { From 54acb53cca5cad5fc1630be99bd2d3bf730d0aa8 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 18 Jan 2023 20:29:24 -0500 Subject: [PATCH 3/4] fix for headless to wait for command line option processor to finish --- .../sleuthkit/autopsy/corecomponents/Installer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java index 2e1850b390..e14585919f 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java @@ -101,7 +101,18 @@ public class Installer extends ModuleInstall { // If there were no command line options supplied then the process method will never // be called. if (GraphicsEnvironment.isHeadless()) { - new CommandLineIngestManager().start(); + if (finalprocessor.getState() == CommandLineOptionProcessor.ProcessState.COMPLETED) { + new CommandLineIngestManager().start(); + } else { + finalprocessor.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(CommandLineOptionProcessor.PROCESSING_COMPLETED)) { + new CommandLineIngestManager().start(); + } + } + }); + } } else { WindowManager.getDefault().invokeWhenUIReady(() -> { if(WindowManager.getDefault().getMainWindow().isVisible() || finalprocessor == null || finalprocessor.getState() == CommandLineOptionProcessor.ProcessState.COMPLETED) { From 8104e6b33d3558f1465a410abe679f893fd9e675 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 17 Dec 2024 11:07:52 -0500 Subject: [PATCH 4/4] updated advanced installer --- build-windows-installer.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-windows-installer.xml b/build-windows-installer.xml index 92e5871d4b..12347d32c9 100644 --- a/build-windows-installer.xml +++ b/build-windows-installer.xml @@ -39,7 +39,8 @@ - + +