From ad376fc96df1bb9d87ccb43346712a37bcebc8ba Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 19 Jun 2015 14:28:10 -0400 Subject: [PATCH] Restrict events and UI if not running interactively --- .../sleuthkit/autopsy/casemodule/Case.java | 42 +++--- .../DirectoryTreeTopComponent.java | 138 +++++++++--------- .../autopsy/events/RemoteEventPublisher.java | 57 ++++---- .../netbeans/core/startup/Bundle.properties | 2 +- .../core/windows/view/ui/Bundle.properties | 2 +- 5 files changed, 125 insertions(+), 116 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 6dfa935f6e..4ec24c9f7e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1392,29 +1392,33 @@ public class Case { Case.clearTempFolder(); checkSubFolders(toChangeTo); - // enable these menus - CallableSystemAction.get(AddImageAction.class).setEnabled(true); - CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); - CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true); - CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu + if (IngestManager.getInstance().isRunningInteractively()) { + // enable these menus + CallableSystemAction.get(AddImageAction.class).setEnabled(true); + CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); + CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true); + CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu - if (toChangeTo.hasData()) { - // open all top components - CoreComponentControl.openCoreWindows(); - } else { - // close all top components - CoreComponentControl.closeCoreWindows(); + if (toChangeTo.hasData()) { + // open all top components + CoreComponentControl.openCoreWindows(); + } else { + // close all top components + CoreComponentControl.closeCoreWindows(); + } } } else { // case is closed - // close all top components first - CoreComponentControl.closeCoreWindows(); - - // disable these menus - CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu - CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu - CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu - CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu + if (IngestManager.getInstance().isRunningInteractively()) { + // close all top components first + CoreComponentControl.closeCoreWindows(); + // disable these menus + CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu + CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu + CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu + CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu + } + //clear pending notifications MessageNotifyUtil.Notify.clear(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 121b59000b..1674f68a91 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -523,80 +523,82 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat */ @Override public void propertyChange(PropertyChangeEvent evt) { - String changed = evt.getPropertyName(); - if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case - // When a case is closed, the old value of this property is the - // closed Case object and the new value is null. When a case is - // opened, the old value is null and the new value is the new Case - // object. - // @@@ This needs to be revisited. Perhaps case closed and case - // opened events instead of property change events would be a better - // solution. Either way, more probably needs to be done to clean up - // data model objects when a case is closed. - if (evt.getOldValue() != null && evt.getNewValue() == null) { - // The current case has been closed. Reset the ExplorerManager. - SwingUtilities.invokeLater(() -> { - Node emptyNode = new AbstractNode(Children.LEAF); - em.setRootContext(emptyNode); - }); - } else if (evt.getNewValue() != null) { - // A new case has been opened. Reset the ExplorerManager. - Case newCase = (Case) evt.getNewValue(); - final String newCaseName = newCase.getName(); - SwingUtilities.invokeLater(() -> { - em.getRootContext().setName(newCaseName); - em.getRootContext().setDisplayName(newCaseName); + if (IngestManager.getInstance().isRunningInteractively()) { + String changed = evt.getPropertyName(); + if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case + // When a case is closed, the old value of this property is the + // closed Case object and the new value is null. When a case is + // opened, the old value is null and the new value is the new Case + // object. + // @@@ This needs to be revisited. Perhaps case closed and case + // opened events instead of property change events would be a better + // solution. Either way, more probably needs to be done to clean up + // data model objects when a case is closed. + if (evt.getOldValue() != null && evt.getNewValue() == null) { + // The current case has been closed. Reset the ExplorerManager. + SwingUtilities.invokeLater(() -> { + Node emptyNode = new AbstractNode(Children.LEAF); + em.setRootContext(emptyNode); + }); + } else if (evt.getNewValue() != null) { + // A new case has been opened. Reset the ExplorerManager. + Case newCase = (Case) evt.getNewValue(); + final String newCaseName = newCase.getName(); + SwingUtilities.invokeLater(() -> { + em.getRootContext().setName(newCaseName); + em.getRootContext().setDisplayName(newCaseName); // Reset the forward and back - // buttons. Note that a call to CoreComponentControl.openCoreWindows() - // by the new Case object will lead to a componentOpened() call - // that will repopulate the tree. - // @@@ The repopulation of the tree in this fashion also merits - // reconsideration. - resetHistory(); + // buttons. Note that a call to CoreComponentControl.openCoreWindows() + // by the new Case object will lead to a componentOpened() call + // that will repopulate the tree. + // @@@ The repopulation of the tree in this fashion also merits + // reconsideration. + resetHistory(); + }); + } + } // if the image is added to the case + else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked out. + * Currently, remote events may be received for a case that is + * already closed. + */ + try { + Case.getCurrentCase(); + CoreComponentControl.openCoreWindows(); + SwingUtilities.invokeLater(this::componentOpened); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } // change in node selection + else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { + SwingUtilities.invokeLater(() -> { + respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue()); }); - } - } // if the image is added to the case - else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { - /** - * Checking for a current case is a stop gap measure until a - * different way of handling the closing of cases is worked out. - * Currently, remote events may be received for a case that is - * already closed. - */ - try { - Case.getCurrentCase(); - CoreComponentControl.openCoreWindows(); - SwingUtilities.invokeLater(this::componentOpened); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } // change in node selection - else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { - SwingUtilities.invokeLater(() -> { - respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue()); - }); - } else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + } else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { // nothing to do here. - // all nodes should be listening for these events and update accordingly. - } else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) - || changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { - /** - * Checking for a current case is a stop gap measure until a - * different way of handling the closing of cases is worked out. - * Currently, remote events may be received for a case that is - * already closed. - */ - try { - Case.getCurrentCase(); - SwingUtilities.invokeLater(this::refreshDataSourceTree); - } catch (IllegalStateException notUsed) { + // all nodes should be listening for these events and update accordingly. + } else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) + || changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { /** - * Case is closed, do nothing. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked out. + * Currently, remote events may be received for a case that is + * already closed. */ + try { + Case.getCurrentCase(); + SwingUtilities.invokeLater(this::refreshDataSourceTree); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } } } } diff --git a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java index c4cf9248c7..85d4cc8f83 100644 --- a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java +++ b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java @@ -34,6 +34,7 @@ import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; /** * Provides thread-safe support for publishing events to registered subscribers @@ -135,38 +136,40 @@ final class RemoteEventPublisher { */ @Override public void onMessage(Message message) { - /** - * This is a stop gap measure until a different way of handling the - * closing of cases is worked out. Currently, Case.currentCase is - * set to null before Case.Event.CURRENT_CASE is published. That - * means that clients of this class have not had the chance to close - * their remote event channels and remote events may be received for - * a case that is already closed. - */ - try { - Case.getCurrentCase(); - } catch (IllegalStateException notUsed) { + if (IngestManager.getInstance().isRunningInteractively()) { /** - * Case is closed, do not publish the event. + * This is a stop gap measure until a different way of handling + * the closing of cases is worked out. Currently, + * Case.currentCase is set to null before + * Case.Event.CURRENT_CASE is published. That means that clients + * of this class have not had the chance to close their remote + * event channels and remote events may be received for a case + * that is already closed. */ - return; - } - - try { - if (message instanceof ObjectMessage) { - ObjectMessage objectMessage = (ObjectMessage) message; - Object object = objectMessage.getObject(); - if (object instanceof AutopsyEvent) { - AutopsyEvent event = (AutopsyEvent) object; - event.setSourceType(AutopsyEvent.SourceType.REMOTE); - localPublisher.publish(event); - } + try { + Case.getCurrentCase(); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do not publish the event. + */ + return; + } + + try { + if (message instanceof ObjectMessage) { + ObjectMessage objectMessage = (ObjectMessage) message; + Object object = objectMessage.getObject(); + if (object instanceof AutopsyEvent) { + AutopsyEvent event = (AutopsyEvent) object; + event.setSourceType(AutopsyEvent.SourceType.REMOTE); + localPublisher.publish(event); + } + } + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error receiving message", ex); } - } catch (Exception ex) { - logger.log(Level.SEVERE, "Error receiving message", ex); } } - } } diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 0b319fa533..cd1d0cd2c8 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Mon, 08 Jun 2015 11:37:44 -0400 +#Fri, 19 Jun 2015 13:59:39 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 90c8ec5261..0639304dec 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Mon, 08 Jun 2015 11:37:44 -0400 +#Fri, 19 Jun 2015 13:59:39 -0400 CTL_MainWindow_Title=Autopsy 3.1.2 CTL_MainWindow_Title_No_Project=Autopsy 3.1.2