Merge branch 'develop' of github.com:sleuthkit/autopsy into 7212-xleappSources

This commit is contained in:
Greg DiCristofaro 2021-01-15 13:50:23 -05:00
commit 07146d5792
9 changed files with 71 additions and 48 deletions

View File

@ -277,17 +277,20 @@ public final class DiscoveryEventUtils {
public static final class MiniTimelineResultEvent { public static final class MiniTimelineResultEvent {
private final List<MiniTimelineResult> results = new ArrayList<>(); private final List<MiniTimelineResult> results = new ArrayList<>();
private final String domain;
/** /**
* Construct a new MiniTimelineResultEvent. * Construct a new MiniTimelineResultEvent.
* *
* @param results The list of MiniTimelineResults contained in this * @param results The list of MiniTimelineResults contained in this
* event. * event.
* @param domain The domain the results are for.
*/ */
public MiniTimelineResultEvent(List<MiniTimelineResult> results) { public MiniTimelineResultEvent(List<MiniTimelineResult> results, String domain) {
if (results != null) { if (results != null) {
this.results.addAll(results); this.results.addAll(results);
} }
this.domain = domain;
} }
/** /**
@ -298,6 +301,15 @@ public final class DiscoveryEventUtils {
public List<MiniTimelineResult> getResultList() { public List<MiniTimelineResult> getResultList() {
return Collections.unmodifiableList(results); return Collections.unmodifiableList(results);
} }
/**
* Get the domain this list of results is for.
*
* @return The domain the list of results is for.
*/
public String getDomain() {
return domain;
}
} }
/** /**

View File

@ -172,6 +172,7 @@ public final class DiscoveryTopComponent extends TopComponent {
DiscoveryEventUtils.getDiscoveryEventBus().unregister(resultsPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(resultsPanel);
DiscoveryEventUtils.getDiscoveryEventBus().unregister(detailsPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(detailsPanel);
if (detailsPanel instanceof DomainDetailsPanel) { if (detailsPanel instanceof DomainDetailsPanel) {
((DomainDetailsPanel) detailsPanel).unregister();
selectedDomainTabName = ((DomainDetailsPanel) detailsPanel).getSelectedTabName(); selectedDomainTabName = ((DomainDetailsPanel) detailsPanel).getSelectedTabName();
} }
resetBottomComponent(); resetBottomComponent();

View File

@ -2,13 +2,13 @@
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> <Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties> <Properties>
<Property name="enabled" type="boolean" value="false"/>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 0]"/> <Dimension value="[0, 0]"/>
</Property> </Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 0]"/> <Dimension value="[0, 0]"/>
</Property> </Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties> </Properties>
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>

View File

@ -39,7 +39,6 @@ final class DomainDetailsPanel extends JPanel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private ArtifactsWorker singleArtifactDomainWorker; private ArtifactsWorker singleArtifactDomainWorker;
private MiniTimelineWorker miniTimelineWorker;
private String domain; private String domain;
private String selectedTabName = null; private String selectedTabName = null;
@ -51,7 +50,9 @@ final class DomainDetailsPanel extends JPanel {
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
DomainDetailsPanel() { DomainDetailsPanel() {
initComponents(); initComponents();
jTabbedPane1.add(Bundle.DomainDetailsPanel_miniTimelineTitle_text(), new MiniTimelinePanel()); MiniTimelinePanel timelinePanel = new MiniTimelinePanel();
DiscoveryEventUtils.getDiscoveryEventBus().register(timelinePanel);
jTabbedPane1.add(Bundle.DomainDetailsPanel_miniTimelineTitle_text(), timelinePanel);
for (BlackboardArtifact.ARTIFACT_TYPE type : SearchData.Type.DOMAIN.getArtifactTypes()) { for (BlackboardArtifact.ARTIFACT_TYPE type : SearchData.Type.DOMAIN.getArtifactTypes()) {
jTabbedPane1.add(type.getDisplayName(), new DomainArtifactsTabPanel(type)); jTabbedPane1.add(type.getDisplayName(), new DomainArtifactsTabPanel(type));
} }
@ -141,14 +142,9 @@ final class DomainDetailsPanel extends JPanel {
* mini timeline view to populate. * mini timeline view to populate.
*/ */
private void runMiniTimelineWorker(MiniTimelinePanel miniTimelinePanel) { private void runMiniTimelineWorker(MiniTimelinePanel miniTimelinePanel) {
if (miniTimelineWorker != null && !miniTimelineWorker.isDone()) {
miniTimelineWorker.cancel(true);
}
if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) { if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) {
DiscoveryEventUtils.getDiscoveryEventBus().register(miniTimelinePanel); miniTimelinePanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING, domain);
miniTimelinePanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING); new MiniTimelineWorker(domain).execute();
miniTimelineWorker = new MiniTimelineWorker(domain);
miniTimelineWorker.execute();
} }
} }
@ -189,7 +185,7 @@ final class DomainDetailsPanel extends JPanel {
if (comp instanceof DomainArtifactsTabPanel) { if (comp instanceof DomainArtifactsTabPanel) {
((DomainArtifactsTabPanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED); ((DomainArtifactsTabPanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED);
} else if (comp instanceof MiniTimelinePanel) { } else if (comp instanceof MiniTimelinePanel) {
((MiniTimelinePanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED); ((MiniTimelinePanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED, domain);
} }
} }
} }
@ -228,4 +224,15 @@ final class DomainDetailsPanel extends JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JTabbedPane jTabbedPane1;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
/*
* Unregister the MiniTimelinePanel from the event bus.
*/
void unregister() {
for (Component comp : jTabbedPane1.getComponents()) {
if (comp instanceof MiniTimelinePanel) {
DiscoveryEventUtils.getDiscoveryEventBus().unregister(comp);
}
}
}
} }

View File

@ -19,13 +19,11 @@
package org.sleuthkit.autopsy.discovery.ui; package org.sleuthkit.autopsy.discovery.ui;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.util.logging.Level;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.contentviewers.artifactviewers.GeneralPurposeArtifactViewer; import org.sleuthkit.autopsy.contentviewers.artifactviewers.GeneralPurposeArtifactViewer;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.discovery.search.DiscoveryEventUtils; import org.sleuthkit.autopsy.discovery.search.DiscoveryEventUtils;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact;
@ -41,7 +39,7 @@ final class MiniTimelinePanel extends javax.swing.JPanel {
private final MiniTimelineArtifactListPanel artifactListPanel = new MiniTimelineArtifactListPanel(); private final MiniTimelineArtifactListPanel artifactListPanel = new MiniTimelineArtifactListPanel();
private DomainArtifactsTabPanel.ArtifactRetrievalStatus status = DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED; private DomainArtifactsTabPanel.ArtifactRetrievalStatus status = DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED;
private AbstractArtifactDetailsPanel rightPanel = new GeneralPurposeArtifactViewer(); private AbstractArtifactDetailsPanel rightPanel = new GeneralPurposeArtifactViewer();
private static final Logger logger = Logger.getLogger(MiniTimelinePanel.class.getName()); private String selectedDomain = null;
private final ListSelectionListener artifactListener; private final ListSelectionListener artifactListener;
private final ListSelectionListener dateListener; private final ListSelectionListener dateListener;
@ -106,11 +104,13 @@ final class MiniTimelinePanel extends javax.swing.JPanel {
/** /**
* Manually set the status of the panel. * Manually set the status of the panel.
* *
* @param status The ArtifactRetrievalStatus of the panel. * @param status The ArtifactRetrievalStatus of the panel
* @param domain The domain the panel is currently reflecting.
*/ */
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
void setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus status) { void setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus status, String domain) {
this.status = status; this.status = status;
this.selectedDomain = domain;
if (status == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) { if (status == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) {
artifactListPanel.clearList(); artifactListPanel.clearList();
dateListPanel.clearList(); dateListPanel.clearList();
@ -123,7 +123,6 @@ final class MiniTimelinePanel extends javax.swing.JPanel {
removeAll(); removeAll();
add(new LoadingPanel(Bundle.MiniTimelinePanel_loadingPanel_details())); add(new LoadingPanel(Bundle.MiniTimelinePanel_loadingPanel_details()));
} }
} }
/** /**
@ -135,23 +134,19 @@ final class MiniTimelinePanel extends javax.swing.JPanel {
@Subscribe @Subscribe
void handleMiniTimelineResultEvent(DiscoveryEventUtils.MiniTimelineResultEvent miniTimelineResultEvent) { void handleMiniTimelineResultEvent(DiscoveryEventUtils.MiniTimelineResultEvent miniTimelineResultEvent) {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
dateListPanel.removeListSelectionListener(dateListener); if (miniTimelineResultEvent.getDomain().equals(selectedDomain)) {
artifactListPanel.removeSelectionListener(artifactListener); dateListPanel.removeListSelectionListener(dateListener);
dateListPanel.addArtifacts(miniTimelineResultEvent.getResultList()); artifactListPanel.removeSelectionListener(artifactListener);
status = DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED; dateListPanel.addArtifacts(miniTimelineResultEvent.getResultList());
setEnabled(!dateListPanel.isEmpty()); status = DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED;
dateListPanel.addSelectionListener(dateListener); setEnabled(!dateListPanel.isEmpty());
artifactListPanel.addSelectionListener(artifactListener); dateListPanel.addSelectionListener(dateListener);
dateListPanel.selectFirst(); artifactListPanel.addSelectionListener(artifactListener);
removeAll(); dateListPanel.selectFirst();
add(mainSplitPane); removeAll();
revalidate(); add(mainSplitPane);
repaint(); revalidate();
try { repaint();
DiscoveryEventUtils.getDiscoveryEventBus().unregister(this);
} catch (IllegalArgumentException notRegistered) {
logger.log(Level.INFO, "Attempting to unregister mini timeline view which was not registered");
// attempting to remove a tab that was never registered
} }
}); });
} }

View File

@ -35,7 +35,7 @@ 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 for a specified type and domain.
*/ */
class MiniTimelineWorker extends SwingWorker<List<MiniTimelineResult>, Void> { class MiniTimelineWorker extends SwingWorker<Void, Void> {
private final static Logger logger = Logger.getLogger(MiniTimelineWorker.class.getName()); private final static Logger logger = Logger.getLogger(MiniTimelineWorker.class.getName());
private final String domain; private final String domain;
@ -51,12 +51,13 @@ class MiniTimelineWorker extends SwingWorker<List<MiniTimelineResult>, Void> {
} }
@Override @Override
protected List<MiniTimelineResult> doInBackground() throws Exception { protected Void doInBackground() throws Exception {
List<MiniTimelineResult> results = new ArrayList<>(); List<MiniTimelineResult> results = new ArrayList<>();
if (!StringUtils.isBlank(domain)) { if (!StringUtils.isBlank(domain)) {
DomainSearch domainSearch = new DomainSearch(); DomainSearch domainSearch = new DomainSearch();
try { try {
results.addAll(domainSearch.getAllArtifactsForDomain(Case.getCurrentCase().getSleuthkitCase(), domain)); results.addAll(domainSearch.getAllArtifactsForDomain(Case.getCurrentCase().getSleuthkitCase(), domain));
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.MiniTimelineResultEvent(results, domain));
} catch (DiscoveryException ex) { } catch (DiscoveryException ex) {
if (ex.getCause() instanceof InterruptedException) { if (ex.getCause() instanceof InterruptedException) {
this.cancel(true); this.cancel(true);
@ -66,22 +67,19 @@ class MiniTimelineWorker extends SwingWorker<List<MiniTimelineResult>, Void> {
} }
} }
} }
return results; return null;
} }
@Override @Override
protected void done() { protected void done() {
List<MiniTimelineResult> results = new ArrayList<>();
if (!isCancelled()) { if (!isCancelled()) {
try { try {
results.addAll(get()); get();
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.MiniTimelineResultEvent(results));
} catch (InterruptedException | ExecutionException ex) { } catch (InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, "Exception while trying to get list of artifacts for Domain details for mini timeline view for domain: " + domain, ex); logger.log(Level.SEVERE, "Exception while trying to get list of artifacts for Domain details for mini timeline view for domain: " + domain, ex);
} catch (CancellationException ignored) { } catch (CancellationException ignored) {
//Worker was cancelled after previously finishing its background work, exception ignored to cut down on non-helpful logging //Worker was cancelled after previously finishing its background work, exception ignored to cut down on non-helpful logging
} }
} }
} }
} }

View File

@ -284,7 +284,11 @@ class Ingester {
//Make a SolrInputDocument out of the field map //Make a SolrInputDocument out of the field map
SolrInputDocument updateDoc = new SolrInputDocument(); SolrInputDocument updateDoc = new SolrInputDocument();
for (String key : fields.keySet()) { for (String key : fields.keySet()) {
updateDoc.addField(key, Chunker.sanitize((String)fields.get(key)).toString()); if (fields.get(key).getClass() == String.class) {
updateDoc.addField(key, Chunker.sanitize((String)fields.get(key)).toString());
} else {
updateDoc.addField(key, fields.get(key));
}
} }
try { try {

View File

@ -62,8 +62,12 @@ class LanguageSpecificContentIndexingHelper {
//Make a SolrInputDocument out of the field map //Make a SolrInputDocument out of the field map
SolrInputDocument updateDoc = new SolrInputDocument(); SolrInputDocument updateDoc = new SolrInputDocument();
for (String key : fields.keySet()) { for (String key : fields.keySet()) {
updateDoc.addField(key, Chunker.sanitize((String)fields.get(key)).toString()); if (fields.get(key).getClass() == String.class) {
} updateDoc.addField(key, Chunker.sanitize((String)fields.get(key)).toString());
} else {
updateDoc.addField(key, fields.get(key));
}
}
try { try {
updateDoc.setField(Server.Schema.ID.toString(), Chunker.sanitize(MiniChunkHelper.getChunkIdString(baseChunkID)).toString()); updateDoc.setField(Server.Schema.ID.toString(), Chunker.sanitize(MiniChunkHelper.getChunkIdString(baseChunkID)).toString());

View File

@ -628,9 +628,11 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info
if legacy_artifact_id != 'NULL' and legacy_artifact_id in artifact_table.keys(): if legacy_artifact_id != 'NULL' and legacy_artifact_id in artifact_table.keys():
fields_list[6] = artifact_table[legacy_artifact_id] fields_list[6] = artifact_table[legacy_artifact_id]
fields_list[1] = cleanupEventDescription(fields_list[1])
fields_list[2] = cleanupEventDescription(fields_list[2]) if fields_list[1] == fields_list[2] and fields_list[1] == fields_list[3]:
fields_list[3] = cleanupEventDescription(fields_list[3]) fields_list[1] = cleanupEventDescription(fields_list[1])
fields_list[2] = cleanupEventDescription(fields_list[2])
fields_list[3] = cleanupEventDescription(fields_list[3])
newLine = ('INSERT INTO "tsk_event_descriptions" VALUES(' + ','.join(fields_list[1:]) + ');') # remove report_id newLine = ('INSERT INTO "tsk_event_descriptions" VALUES(' + ','.join(fields_list[1:]) + ');') # remove report_id
return newLine return newLine