diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java index 18e041c585..8751458633 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java @@ -99,6 +99,10 @@ class ArtifactsListPanel extends JPanel { return tableModel.getRowCount() <= 0; } + /** + * Select the first available artifact in the list if it is not empty to + * populate the panel to the right. + */ void selectFirst() { if (!isEmpty()) { jTable1.setRowSelectionInterval(0, 0); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java index fb53ec95ac..eeb6870df2 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java @@ -1,7 +1,7 @@ /* * Autopsy * - * Copyright 2019-2020 Basis Technology Corp. + * Copyright 2020 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.form index 2c828a28bc..c84525148c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.form @@ -50,7 +50,6 @@ - diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.java index ec5f4158ba..9691d646c0 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryTopComponent.java @@ -151,7 +151,6 @@ public final class DiscoveryTopComponent extends TopComponent { DiscoveryEventUtils.getDiscoveryEventBus().unregister(groupListPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(resultsPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(rightSplitPane.getBottomComponent()); - setDetailsVisible(false); super.componentClosed(); } @@ -182,9 +181,6 @@ public final class DiscoveryTopComponent extends TopComponent { rightSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); rightSplitPane.setResizeWeight(1.0); rightSplitPane.setPreferredSize(new java.awt.Dimension(800, 700)); - - setDetailsVisible(false); - mainSplitPane.setRightComponent(rightSplitPane); add(mainSplitPane, java.awt.BorderLayout.CENTER); @@ -295,11 +291,6 @@ public final class DiscoveryTopComponent extends TopComponent { progressMessageTextArea.setText(Bundle.DiscoveryTopComponent_searchInProgress_text(searchType.name())); } - private void setDetailsVisible(boolean isVisible) { - rightSplitPane.getComponent(1).setVisible(isVisible); - rightSplitPane.getComponent(2).setVisible(isVisible); - } - /** * Subscribe to the SearchCompleteEvent for updating the UI accordingly. * @@ -334,7 +325,6 @@ public final class DiscoveryTopComponent extends TopComponent { } else { rightSplitPane.setBottomComponent(new FileDetailsPanel()); } - setDetailsVisible(true); DiscoveryEventUtils.getDiscoveryEventBus().register(rightSplitPane.getBottomComponent()); descriptionText += searchCompleteEvent.getFilters().stream().map(AbstractFilter::getDesc).collect(Collectors.joining("; ")); progressMessageTextArea.setText(Bundle.DiscoveryTopComponent_searchComplete_text(descriptionText)); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java index e8bff3036f..18d430eb1a 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java @@ -107,10 +107,16 @@ final class DomainArtifactsTabPanel extends JPanel { void setStatus(ArtifactRetrievalStatus status) { this.status = status; if (status == ArtifactRetrievalStatus.UNPOPULATED && rightPanel != null) { - rightPanel.setArtifact(null); + rightPanel.setArtifact(null); } } + /** + * Handle the event which indicates the artifacts have been retrieved. + * + * @param artifactListEvent The event which indicates the artifacts have + * been retrieved. + */ @Subscribe void handleArtifactListRetrievedEvent(DiscoveryEventUtils.ArtifactListRetrievedEvent artifactListEvent) { SwingUtilities.invokeLater(() -> { diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java index 0f9759819f..9957c52454 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java @@ -79,7 +79,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { private static final int MBOX_SIZE_TO_SPLIT = 1048576000; private Case currentCase; - + /** * Empty constructor. */ @@ -139,6 +139,10 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { boolean isPstFile = PstParser.isPstFile(abstractFile); boolean isVcardFile = VcardParser.isVcardFile(abstractFile); + if (context.fileIngestIsCancelled()) { + return ProcessResult.OK; + } + if (isMbox || isEMLFile || isPstFile || isVcardFile ) { try { communicationArtifactsHelper = new CommunicationArtifactsHelper(currentCase.getSleuthkitCase(), @@ -213,6 +217,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { Iterator pstMsgIterator = parser.getEmailMessageIterator(); if (pstMsgIterator != null) { processEmails(parser.getPartialEmailMessages(), pstMsgIterator , abstractFile); + if (context.fileIngestIsCancelled()) { + return ProcessResult.OK; + } } else { // sometimes parser returns ParseResult=OK but there are no messages postErrorMessage( @@ -321,6 +328,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } processMboxFile(file, abstractFile, emailFolder); + if (context.fileIngestIsCancelled()) { + return ProcessResult.OK; + } if (file.delete() == false) { logger.log(Level.INFO, "Failed to delete temp file: {0}", file.getName()); //NON-NLS @@ -349,7 +359,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { if (splitFile.delete() == false) { logger.log(Level.INFO, "Failed to delete temp file: {0}", splitFile); //NON-NLS } - + if (context.fileIngestIsCancelled()) { + return ProcessResult.OK; + } } } @@ -385,6 +397,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { List emails = new ArrayList<>(); if(emailIterator != null) { while(emailIterator.hasNext()) { + if (context.fileIngestIsCancelled()) { + return; + } EmailMessage emailMessage = emailIterator.next(); if(emailMessage != null) { emails.add(emailMessage); @@ -526,6 +541,10 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { int msgCnt = 0; while(fullMessageIterator.hasNext()) { + if (context.fileIngestIsCancelled()) { + return; + } + EmailMessage current = fullMessageIterator.next(); if(current == null) { @@ -550,6 +569,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { if (derivedFiles.isEmpty() == false) { for (AbstractFile derived : derivedFiles) { + if (context.fileIngestIsCancelled()) { + return; + } services.fireModuleContentEvent(new ModuleContentEvent(derived)); } } @@ -675,6 +697,10 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { String senderAddress; senderAddressList.addAll(findEmailAddresess(from)); + if (context.fileIngestIsCancelled()) { + return null; + } + AccountFileInstance senderAccountInstance = null; if (senderAddressList.size() == 1) { @@ -690,13 +716,20 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { logger.log(Level.WARNING, "Failed to find sender address, from = {0}", from); //NON-NLS } + if (context.fileIngestIsCancelled()) { + return null; + } + List recipientAddresses = new ArrayList<>(); recipientAddresses.addAll(findEmailAddresess(to)); recipientAddresses.addAll(findEmailAddresess(cc)); recipientAddresses.addAll(findEmailAddresess(bcc)); List recipientAccountInstances = new ArrayList<>(); - recipientAddresses.forEach((addr) -> { + for (String addr : recipientAddresses) { + if (context.fileIngestIsCancelled()) { + return null; + } try { AccountFileInstance recipientAccountInstance = currentCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, addr, @@ -706,7 +739,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { catch(TskCoreException ex) { logger.log(Level.WARNING, "Failed to create account for email address " + addr, ex); //NON-NLS } - }); + } addArtifactAttribute(headers, ATTRIBUTE_TYPE.TSK_HEADERS, bbattributes); addArtifactAttribute(from, ATTRIBUTE_TYPE.TSK_EMAIL_FROM, bbattributes); @@ -731,12 +764,23 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { try { + if (context.fileIngestIsCancelled()) { + return null; + } bbart = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG); bbart.addAttributes(bbattributes); + if (context.fileIngestIsCancelled()) { + return null; + } + // Add account relationships currentCase.getSleuthkitCase().getCommunicationsManager().addRelationships(senderAccountInstance, recipientAccountInstances, bbart,Relationship.Type.MESSAGE, dateL); + + if (context.fileIngestIsCancelled()) { + return null; + } try { // index the artifact for keyword search