diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryEventUtils.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryEventUtils.java index e228ce5f21b57ce3f1517ccf904791337b554a51..919c84f8ec44e00891bf2f706088ea8d1f1c4186 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryEventUtils.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryEventUtils.java @@ -135,6 +135,9 @@ public static final class PopulateDomainTabsEvent { /** * Construct a new PopulateDomainTabsEvent. + * + * @param domain The domain this event is for, or empty if no domain is + * selected. */ public PopulateDomainTabsEvent(String domain) { this.domain = domain; @@ -236,6 +239,7 @@ public static final class ArtifactSearchResultEvent { private final List<BlackboardArtifact> listOfArtifacts = new ArrayList<>(); private final BlackboardArtifact.ARTIFACT_TYPE artifactType; + private final boolean grabFocus; /** * Construct a new ArtifactSearchResultEvent with a list of specified @@ -243,12 +247,15 @@ public static final class ArtifactSearchResultEvent { * * @param artifactType The type of results in the list. * @param listOfArtifacts The list of results retrieved. + * @param shouldGrabFocus True if the list of artifacts should have + * focus, false otherwise. */ - public ArtifactSearchResultEvent(BlackboardArtifact.ARTIFACT_TYPE artifactType, List<BlackboardArtifact> listOfArtifacts) { + public ArtifactSearchResultEvent(BlackboardArtifact.ARTIFACT_TYPE artifactType, List<BlackboardArtifact> listOfArtifacts, boolean shouldGrabFocus) { if (listOfArtifacts != null) { this.listOfArtifacts.addAll(listOfArtifacts); } this.artifactType = artifactType; + this.grabFocus = shouldGrabFocus; } /** @@ -268,6 +275,17 @@ public List<BlackboardArtifact> getListOfArtifacts() { public BlackboardArtifact.ARTIFACT_TYPE getArtifactType() { return artifactType; } + + /** + * Get whether or not the artifacts list should grab focus. + * + * @return True if the list of artifacts should have focus, false + * otherwise. + */ + public boolean shouldGrabFocus() { + return grabFocus; + } + } /** @@ -278,18 +296,22 @@ public static final class MiniTimelineResultEvent { private final List<MiniTimelineResult> results = new ArrayList<>(); private final String domain; + private final boolean grabFocus; /** * Construct a new MiniTimelineResultEvent. * - * @param results The list of MiniTimelineResults contained in this - * event. - * @param domain The domain the results are for. + * @param results The list of MiniTimelineResults contained in + * this event. + * @param domain The domain the results are for. + * @param shouldGrabFocus True if the list of dates should have focus, + * false otherwise. */ - public MiniTimelineResultEvent(List<MiniTimelineResult> results, String domain) { + public MiniTimelineResultEvent(List<MiniTimelineResult> results, String domain, boolean shouldGrabFocus) { if (results != null) { this.results.addAll(results); } + this.grabFocus = shouldGrabFocus; this.domain = domain; } @@ -310,6 +332,15 @@ public List<MiniTimelineResult> getResultList() { public String getDomain() { return domain; } + + /** + * Get whether or not the dates list should grab focus. + * + * @return True if the list of dates should have focus, false otherwise. + */ + public boolean shouldGrabFocus() { + return grabFocus; + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java index 33e8b1c8f86270cab63cc03ec0fa04c2731dd95e..ae416d0e7fc2c0e9f57e581d18aa0aa6864c1e87 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java @@ -82,6 +82,14 @@ void addSelectionListener(ListSelectionListener listener) { artifactsTable.getSelectionModel().addListSelectionListener(listener); } + /** + * Assign the focus to this panel's list. + */ + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) + void focusList() { + artifactsTable.grabFocus(); + } + @Override void removeSelectionListener(ListSelectionListener listener) { artifactsTable.getSelectionModel().removeListSelectionListener(listener); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java index 1202f20647955f03a4da241b9b55b735d0be3866..8226776cd77d43dfd1733bc1f766ce2174509b8f 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsWorker.java @@ -41,16 +41,21 @@ class ArtifactsWorker extends SwingWorker<List<BlackboardArtifact>, Void> { private final BlackboardArtifact.ARTIFACT_TYPE artifactType; private final static Logger logger = Logger.getLogger(ArtifactsWorker.class.getName()); private final String domain; + private final boolean grabFocus; /** * Construct a new ArtifactsWorker. * - * @param artifactType The type of artifact being retrieved. - * @param domain The domain the artifacts should have as an attribute. + * @param artifactType The type of artifact being retrieved. + * @param domain The domain the artifacts should have as an + * attribute. + * @param shouldGrabFocus True if the list of artifacts should have focus, + * false otherwise. */ - ArtifactsWorker(BlackboardArtifact.ARTIFACT_TYPE artifactType, String domain) { + ArtifactsWorker(BlackboardArtifact.ARTIFACT_TYPE artifactType, String domain, boolean shouldGrabFocus) { this.artifactType = artifactType; this.domain = domain; + this.grabFocus = shouldGrabFocus; } @Override @@ -61,7 +66,7 @@ protected List<BlackboardArtifact> doInBackground() throws Exception { return domainSearch.getArtifacts(new DomainSearchArtifactsRequest(Case.getCurrentCase().getSleuthkitCase(), domain, artifactType)); } catch (DiscoveryException ex) { if (ex.getCause() instanceof InterruptedException) { - this.cancel(true); + this.cancel(true); //ignore the exception as it was cancelled while the cache was performing its get and we support cancellation } else { throw ex; @@ -77,7 +82,7 @@ protected void done() { if (!isCancelled()) { try { listOfArtifacts.addAll(get()); - DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ArtifactSearchResultEvent(artifactType, listOfArtifacts)); + DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ArtifactSearchResultEvent(artifactType, listOfArtifacts, grabFocus)); } catch (InterruptedException | ExecutionException ex) { logger.log(Level.SEVERE, "Exception while trying to get list of artifacts for Domain details for artifact type: " + artifactType.getDisplayName() + " and domain: " + domain, ex); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java index 1cc29aef1d1da50921b86e7b28d9690a61158c5a..e4ce23b86548fbf5a8e745f1b8903136bb89acb2 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java @@ -95,6 +95,14 @@ private void setRightComponent() { } } + /** + * Assign the focus to this panel's list. + */ + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) + void focusList() { + listPanel.focusList(); + } + /** * Get the status of the panel which indicates if it is populated. * @@ -144,6 +152,9 @@ void handleArtifactSearchResultEvent(DiscoveryEventUtils.ArtifactSearchResultEve listPanel.selectFirst(); removeAll(); add(mainSplitPane); + if (artifactresultEvent.shouldGrabFocus()) { + focusList(); + } revalidate(); repaint(); try { diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainDetailsPanel.java index df77f939fbb6301146088b120ceba2d1f778ec77..c50ab5002081922dd8392a7e1786d729eb3fd8a5 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainDetailsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainDetailsPanel.java @@ -81,9 +81,9 @@ public void stateChanged(ChangeEvent e) { selectedTabName = newTabTitle; Component selectedComponent = jTabbedPane1.getSelectedComponent(); if (selectedComponent instanceof DomainArtifactsTabPanel) { - runDomainWorker((DomainArtifactsTabPanel) selectedComponent); + runDomainWorker((DomainArtifactsTabPanel) selectedComponent, true); } else if (selectedComponent instanceof MiniTimelinePanel) { - runMiniTimelineWorker((MiniTimelinePanel) selectedComponent); + runMiniTimelineWorker((MiniTimelinePanel) selectedComponent, true); } } } @@ -122,17 +122,24 @@ DomainArtifactsTabPanel.ArtifactRetrievalStatus getCurrentTabStatus() { /** * Run the worker which retrieves the list of artifacts for the domain to * populate the details area. + * + * @param domainArtifactsTabPanel The DomainArtifactsTabPanel which has been + * selected. + * @param shouldGrabFocus True if the list of artifacts should have + * focus, false otherwise. */ @ThreadConfined(type = ThreadConfined.ThreadType.AWT) - private void runDomainWorker(DomainArtifactsTabPanel domainArtifactsTabPanel) { + private void runDomainWorker(DomainArtifactsTabPanel domainArtifactsTabPanel, boolean shouldGrabFocus) { if (singleArtifactDomainWorker != null && !singleArtifactDomainWorker.isDone()) { singleArtifactDomainWorker.cancel(true); } if (domainArtifactsTabPanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) { DiscoveryEventUtils.getDiscoveryEventBus().register(domainArtifactsTabPanel); domainArtifactsTabPanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING); - singleArtifactDomainWorker = new ArtifactsWorker(domainArtifactsTabPanel.getArtifactType(), domain); + singleArtifactDomainWorker = new ArtifactsWorker(domainArtifactsTabPanel.getArtifactType(), domain, shouldGrabFocus); singleArtifactDomainWorker.execute(); + } else if (domainArtifactsTabPanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED) { + domainArtifactsTabPanel.focusList(); } } @@ -140,11 +147,17 @@ private void runDomainWorker(DomainArtifactsTabPanel domainArtifactsTabPanel) { /** * Run the worker which retrieves the list of MiniTimelineResults for the * mini timeline view to populate. + * + * @param miniTimelinePanel The MiniTimelinePanel which has been selected. + * @param shouldGrabFocus True if the list of dates should have focus, + * false otherwise. */ - private void runMiniTimelineWorker(MiniTimelinePanel miniTimelinePanel) { + private void runMiniTimelineWorker(MiniTimelinePanel miniTimelinePanel, boolean shouldGrabFocus) { if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) { miniTimelinePanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING, domain); - new MiniTimelineWorker(domain).execute(); + new MiniTimelineWorker(domain, shouldGrabFocus).execute(); + } else if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED) { + miniTimelinePanel.focusList(); } } @@ -162,12 +175,13 @@ void handlePopulateDomainTabsEvent(DiscoveryEventUtils.PopulateDomainTabsEvent p //send fade out event DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.DetailsVisibleEvent(false)); } else { + resetTabsStatus(); domain = populateEvent.getDomain(); Component selectedComponent = jTabbedPane1.getSelectedComponent(); if (selectedComponent instanceof DomainArtifactsTabPanel) { - runDomainWorker((DomainArtifactsTabPanel) selectedComponent); + runDomainWorker((DomainArtifactsTabPanel) selectedComponent, false); } else if (selectedComponent instanceof MiniTimelinePanel) { - runMiniTimelineWorker((MiniTimelinePanel) selectedComponent); + runMiniTimelineWorker((MiniTimelinePanel) selectedComponent, false); } //send fade in event DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.DetailsVisibleEvent(true)); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java index 39f5f288137ea84e5372fe915bd3bebfdecf9976..28c68c6ce61e12887a9ded49602c9311b5f5759b 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java @@ -64,6 +64,14 @@ void addSelectionListener(ListSelectionListener listener) { jTable1.getSelectionModel().addListSelectionListener(listener); } + /** + * Assign the focus to this panel's list. + */ + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) + void focusList() { + jTable1.grabFocus(); + } + /** * Remove a listener from the table of dates. * diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java index 32c9e6bf6c7b85b29e50799da6b0a458387ab2d5..87c99ad72480c873ab8fe2ad3a2fdd767db5b226 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java @@ -101,11 +101,19 @@ DomainArtifactsTabPanel.ArtifactRetrievalStatus getStatus() { return status; } + /** + * Assign the focus to this panel's list. + */ + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) + void focusList() { + dateListPanel.focusList(); + } + /** * Manually set the status of the panel. * * @param status The ArtifactRetrievalStatus of the panel - * @param domain The domain the panel is currently reflecting. + * @param domain The domain the panel is currently reflecting. */ @ThreadConfined(type = ThreadConfined.ThreadType.AWT) void setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus status, String domain) { @@ -143,6 +151,9 @@ void handleMiniTimelineResultEvent(DiscoveryEventUtils.MiniTimelineResultEvent m dateListPanel.addSelectionListener(dateListener); artifactListPanel.addSelectionListener(artifactListener); dateListPanel.selectFirst(); + if (miniTimelineResultEvent.shouldGrabFocus()) { + focusList(); + } removeAll(); add(mainSplitPane); revalidate(); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineWorker.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineWorker.java index 7ef49ca5d1b81383b555e552795d4944b2312cd7..b047f4392f4acb8bd1a07b7b8001bc706587cf54 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineWorker.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineWorker.java @@ -33,21 +33,26 @@ import org.sleuthkit.autopsy.discovery.search.DomainSearch; /** - * SwingWorker to retrieve a list of artifacts for a specified type and domain. + * SwingWorker to retrieve a list of artifacts organized by date for the + * miniTimelinePanel for a specific domain. */ class MiniTimelineWorker extends SwingWorker<Void, Void> { private final static Logger logger = Logger.getLogger(MiniTimelineWorker.class.getName()); private final String domain; + private final boolean grabFocus; /** - * Construct a new ArtifactsWorker. + * Construct a new MiniTimelineWorker. * - * @param artifactType The type of artifact being retrieved. - * @param domain The domain the artifacts should have as an attribute. + * @param domain The domain the artifacts should have as an + * attribute. + * @param shouldGrabFocus True if the list of artifacts should have focus, + * false otherwise. */ - MiniTimelineWorker(String domain) { + MiniTimelineWorker(String domain, boolean shouldGrabFocus) { this.domain = domain; + this.grabFocus = shouldGrabFocus; } @Override @@ -57,7 +62,7 @@ protected Void doInBackground() throws Exception { DomainSearch domainSearch = new DomainSearch(); try { results.addAll(domainSearch.getAllArtifactsForDomain(Case.getCurrentCase().getSleuthkitCase(), domain)); - DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.MiniTimelineResultEvent(results, domain)); + DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.MiniTimelineResultEvent(results, domain, grabFocus)); } catch (DiscoveryException ex) { if (ex.getCause() instanceof InterruptedException) { this.cancel(true); diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java index 1492670adad56c21028fe4913602f095fd60eb42..acb0acbc7d1bd2ecd88d9730dd9ccd3ec234b515 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java @@ -97,7 +97,7 @@ public void startUp(IngestJobContext context) throws IngestModuleException { } try { - aLeappFileProcessor = new LeappFileProcessor(XMLFILE); + aLeappFileProcessor = new LeappFileProcessor(XMLFILE, ALeappAnalyzerModuleFactory.getModuleName()); } catch (IOException | IngestModuleException | NoCurrentCaseException ex) { throw new IngestModuleException(Bundle.ALeappAnalyzerIngestModule_error_ileapp_file_processor_init(), ex); } diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java index d124801046a9f008cb596ba97ab89e0a0e38a59a..70e811905ccb573c470ee552911bb32179be1f9f 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java @@ -97,7 +97,7 @@ public void startUp(IngestJobContext context) throws IngestModuleException { } try { - iLeappFileProcessor = new LeappFileProcessor(XMLFILE); + iLeappFileProcessor = new LeappFileProcessor(XMLFILE, ILeappAnalyzerModuleFactory.getModuleName()); } catch (IOException | IngestModuleException | NoCurrentCaseException ex) { throw new IngestModuleException(Bundle.ILeappAnalyzerIngestModule_error_ileapp_file_processor_init(), ex); } diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java index 7c49dbcd1c362c847732649c943d3a2dc64c4f0f..9578372cb33f8e780599bc6ddd5f4f8897fe8cb0 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java @@ -126,9 +126,8 @@ boolean isRequired() { } private static final Logger logger = Logger.getLogger(LeappFileProcessor.class.getName()); - private static final String MODULE_NAME = ILeappAnalyzerModuleFactory.getModuleName(); - private final String xmlFile; //NON-NLS + private final String moduleName; private final Map<String, String> tsvFiles; private final Map<String, BlackboardArtifact.Type> tsvFileArtifacts; @@ -137,12 +136,13 @@ boolean isRequired() { Blackboard blkBoard; - public LeappFileProcessor(String xmlFile) throws IOException, IngestModuleException, NoCurrentCaseException { + public LeappFileProcessor(String xmlFile, String moduleName) throws IOException, IngestModuleException, NoCurrentCaseException { this.tsvFiles = new HashMap<>(); this.tsvFileArtifacts = new HashMap<>(); this.tsvFileArtifactComments = new HashMap<>(); this.tsvFileAttributes = new HashMap<>(); this.xmlFile = xmlFile; + this.moduleName = moduleName; blkBoard = Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard(); @@ -366,7 +366,7 @@ private Collection<BlackboardAttribute> processReadLine(List<String> lineValues, } if (tsvFileArtifactComments.containsKey(fileName)) { - attrsToRet.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COMMENT, MODULE_NAME, tsvFileArtifactComments.get(fileName))); + attrsToRet.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COMMENT, moduleName, tsvFileArtifactComments.get(fileName))); } return attrsToRet; @@ -400,22 +400,22 @@ private BlackboardAttribute getAttribute(BlackboardAttribute.Type attrType, Stri case JSON: case STRING: return parseAttrValue(value, attrType, fileName, false, false, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, v)); + (v) -> new BlackboardAttribute(attrType, moduleName, v)); case INTEGER: return parseAttrValue(value.trim(), attrType, fileName, true, false, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, (int) Double.valueOf(v).intValue())); + (v) -> new BlackboardAttribute(attrType, moduleName, (int) Double.valueOf(v).intValue())); case LONG: return parseAttrValue(value.trim(), attrType, fileName, true, false, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, (long) Double.valueOf(v).longValue())); + (v) -> new BlackboardAttribute(attrType, moduleName, (long) Double.valueOf(v).longValue())); case DOUBLE: return parseAttrValue(value.trim(), attrType, fileName, true, false, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, (double) Double.valueOf(v))); + (v) -> new BlackboardAttribute(attrType, moduleName, (double) Double.valueOf(v))); case BYTE: return parseAttrValue(value.trim(), attrType, fileName, true, false, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, new byte[]{Byte.valueOf(v)})); + (v) -> new BlackboardAttribute(attrType, moduleName, new byte[]{Byte.valueOf(v)})); case DATETIME: return parseAttrValue(value.trim(), attrType, fileName, true, true, - (v) -> new BlackboardAttribute(attrType, MODULE_NAME, TIMESTAMP_FORMAT.parse(v).getTime() / 1000)); + (v) -> new BlackboardAttribute(attrType, moduleName, TIMESTAMP_FORMAT.parse(v).getTime() / 1000)); default: // Log this and continue on with processing logger.log(Level.WARNING, String.format("Attribute Type %s for file %s not defined.", attrType, fileName)); //NON-NLS @@ -647,7 +647,7 @@ void postArtifacts(Collection<BlackboardArtifact> artifacts) { } try { - Case.getCurrentCase().getSleuthkitCase().getBlackboard().postArtifacts(artifacts, MODULE_NAME); + Case.getCurrentCase().getSleuthkitCase().getBlackboard().postArtifacts(artifacts, moduleName); } catch (Blackboard.BlackboardException ex) { logger.log(Level.SEVERE, Bundle.LeappFileProcessor_postartifacts_error(), ex); //NON-NLS } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java index 67ff60d8c08698c12cf1f019844b011f9d2980df..f438e2e9ad3286336ddfc2bac65eba17bd4ed276 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java @@ -28,6 +28,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.sleuthkit.autopsy.core.UserPreferences; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.tidy.Tidy; @@ -74,7 +75,7 @@ public interface ManifestFileParser { static Path makeTidyManifestFile(Path filePath) throws IOException { File tempFile = null; try{ - tempFile = File.createTempFile("mani", "tdy", filePath.getParent().toFile()); + tempFile = File.createTempFile("mani", "tdy", new File(System.getProperty("java.io.tmpdir"))); try (FileInputStream br = new FileInputStream(filePath.toFile()); FileOutputStream out = new FileOutputStream(tempFile);) { Tidy tidy = new Tidy(); diff --git a/docs/doxygen-user/file_discovery.dox b/docs/doxygen-user/file_discovery.dox index ffb5bd324f4c7dc159e5cec8b43e586ffc209911..08ff568d9e237163b353f66212ce99fdc3487d1d 100644 --- a/docs/doxygen-user/file_discovery.dox +++ b/docs/doxygen-user/file_discovery.dox @@ -124,6 +124,18 @@ When there are multiple path options in the filter, they will be applied as foll This allows you to, for example, make rules to include both the "My Documents" and the "My Pictures" folders. +\subsubsection file_disc_prev_notable_filter Previously Notable Filter + +The previously notable filter is for domain searches only and is used to restrict results to only those domains that have previously been marked as "Notable" in the \ref central_repo_page. + +\image html FileDiscovery/fd_notableFilter.png + +\subsubsection file_disc_known_account_filter Known Account Type Filter + +The previously notable filter is for domain searches only and is used to restrict results to only those domains that have a known account type. + +\image html FileDiscovery/fd_knownAccountFilter.png + \subsubsection file_disc_result_filter Result Type Filter The result type filter is for domain searches only and can be used to restrict which types of web results the domains can come from. @@ -158,7 +170,7 @@ The last grouping and sorting option is choosing how to sort the results within \subsection file_disc_results_overview Overview -Once you select your options and click "Search", you'll see a new window with the list of groups on the left side. Selecting one of these groups will display the results from that group on the right side. For image, video, and document searches, selecting a result will cause a panel to rise showing more details about each instance of that result. You can manually raise and lower this panel using the large arrows on the right side of the divider. This panel is disabled for domain searches. +Once you select your options and click "Search", you'll see a new window with the list of groups on the left side. Selecting one of these groups will display the results from that group on the right side. Selecting a result will cause a panel to rise showing more details about each instance of that result. You can manually raise and lower this panel using the large arrows on the right side of the divider. If your results are images, you'll see thumbnails for each image in the top area of the right panel. @@ -182,6 +194,10 @@ For image, video, and document searches, when you select a result from the top o The bottom section of the panel is identical to the standard \ref content_viewer_page and displays data corresponding to the file instance selected in the middle of the panel. +For domain searches, when you select a domain in the top of the right panel you'll see a details area that is a variation on the \ref content_viewer_page. The first tab on details panel displays a simple timeline - selecting a date will show all the results from that date in the center of the panel, with details for the selected result on the right. The other tabs (Web Bookmarks, Web Cookies, etc.) display results of the selected type with a list of results on the left and more details on the right. You can right-click on results to use most of options available in the normal \ref result_viewer_page. + +\image html FileDiscovery/fd_domainDetails.png + \subsection file_disc_dedupe De-duplication This section only applies to image, video and document searches. diff --git a/docs/doxygen-user/images/FileDiscovery/fd_domainDetails.png b/docs/doxygen-user/images/FileDiscovery/fd_domainDetails.png new file mode 100644 index 0000000000000000000000000000000000000000..111f77c21511fbe08140f306593d76774fcf4990 Binary files /dev/null and b/docs/doxygen-user/images/FileDiscovery/fd_domainDetails.png differ diff --git a/docs/doxygen-user/images/FileDiscovery/fd_domains.png b/docs/doxygen-user/images/FileDiscovery/fd_domains.png index 828d8253553893215910d310d8c9dbeb9d959c03..f86e07251c78fae585a9cb1c64eacba201435356 100644 Binary files a/docs/doxygen-user/images/FileDiscovery/fd_domains.png and b/docs/doxygen-user/images/FileDiscovery/fd_domains.png differ diff --git a/docs/doxygen-user/images/FileDiscovery/fd_knownAccountFilter.png b/docs/doxygen-user/images/FileDiscovery/fd_knownAccountFilter.png new file mode 100644 index 0000000000000000000000000000000000000000..10d62bc4a9d41eba02db5b5f9f58a2b704b7d1c0 Binary files /dev/null and b/docs/doxygen-user/images/FileDiscovery/fd_knownAccountFilter.png differ diff --git a/docs/doxygen-user/images/FileDiscovery/fd_notableFilter.png b/docs/doxygen-user/images/FileDiscovery/fd_notableFilter.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce100ef98059b1072054aa2115bd74bac6bf9ef Binary files /dev/null and b/docs/doxygen-user/images/FileDiscovery/fd_notableFilter.png differ