Merge branch 'master' of github.com:sleuthkit/autopsy

This commit is contained in:
Dick Fickling 2012-05-22 09:19:35 -04:00
commit 92fab86a45
9 changed files with 140 additions and 42 deletions

View File

@ -61,11 +61,14 @@ public class IngestImageThread extends SwingWorker<Object,Void> {
logger.log(Level.INFO, "Starting background processing"); logger.log(Level.INFO, "Starting background processing");
progress = ProgressHandleFactory.createHandle(service.getName() + " image id:" + image.getId(), new Cancellable() { final String displayName = service.getName() + " image id:" + image.getId();
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
logger.log(Level.INFO, "Image ingest service " + service.getName() + " cancelled by user."); logger.log(Level.INFO, "Image ingest service " + service.getName() + " cancelled by user.");
if (progress != null)
progress.setDisplayName(displayName + " (Cancelling...)");
return IngestImageThread.this.cancel(true); return IngestImageThread.this.cancel(true);
} }
}); });

View File

@ -938,11 +938,14 @@ public class IngestManager {
} }
}); });
progress = ProgressHandleFactory.createHandle("File Ingest", new Cancellable() { final String displayName = "File Ingest";
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
logger.log(Level.INFO, "Filed ingest cancelled by user."); logger.log(Level.INFO, "Filed ingest cancelled by user.");
if (progress != null)
progress.setDisplayName(displayName + " (Cancelling...)");
return IngestFsContentThread.this.cancel(true); return IngestFsContentThread.this.cancel(true);
} }
}); });
@ -1073,11 +1076,15 @@ public class IngestManager {
@Override @Override
protected Object doInBackground() throws Exception { protected Object doInBackground() throws Exception {
progress = ProgressHandleFactory.createHandle("Queueing Ingest", new Cancellable() {
final String displayName = "Queueing Ingest";
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
logger.log(Level.INFO, "Queueing ingest cancelled by user."); logger.log(Level.INFO, "Queueing ingest cancelled by user.");
if (progress != null)
progress.setDisplayName(displayName + " (Cancelling...)");
return EnqueueWorker.this.cancel(true); return EnqueueWorker.this.cancel(true);
} }
}); });

View File

@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.keywordsearch;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.List; import java.util.List;
import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearch.QueryType; import org.sleuthkit.autopsy.keywordsearch.KeywordSearch.QueryType;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentation; import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentation;
@ -77,6 +78,17 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
KeywordSearchUtil.displayDialog("Keyword Search Error", "No files are indexed, please index an image before searching", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog("Keyword Search Error", "No files are indexed, please index an image before searching", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return; return;
} }
//check if keyword search service ingest is running (indexing, etc)
if (IngestManager.getDefault().isServiceRunning(KeywordSearchIngestService.getDefault())) {
if (KeywordSearchUtil.displayConfirmDialog("Keyword Search Ingest in Progress",
"<html>Keyword Search Ingest is currently running.<br />"
+ "Not all files have been indexed and this search might yield incomplete results.<br />"
+ "Do you want to proceed with this search anyway?</html>"
, KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false)
return;
}
KeywordSearchQueryManager man = null; KeywordSearchQueryManager man = null;
if (isMultiwordQuery()) { if (isMultiwordQuery()) {
final List<Keyword> keywords = getQueryList(); final List<Keyword> keywords = getQueryList();

View File

@ -48,3 +48,5 @@ ExtractedContentPanel.pageOfLabel.text=of
ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pageCurLabel.text=-
ExtractedContentPanel.pageTotalLabel.text=- ExtractedContentPanel.pageTotalLabel.text=-
ExtractedContentPanel.hitLabel.toolTipText= ExtractedContentPanel.hitLabel.toolTipText=
KeywordSearchEditListPanel.ingestMessagesCheckbox.text=Send messages during triage / ingest
KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText=Send messages during triage / ingest when hits on keyword from this list occur

View File

@ -111,12 +111,17 @@
<Component id="addKeywordPanel" min="-2" max="-2" attributes="0"/> <Component id="addKeywordPanel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="19" max="-2" attributes="0"/> <EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="ingestMessagesCheckbox" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="131" max="32767" attributes="0"/>
</Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<Component id="jScrollPane1" pref="263" max="32767" attributes="0"/> <Component id="jScrollPane1" pref="242" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="addKeywordPanel" min="-2" max="-2" attributes="0"/> <Component id="addKeywordPanel" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
@ -124,7 +129,9 @@
<Component id="deleteWordButton" min="-2" max="-2" attributes="0"/> <Component id="deleteWordButton" min="-2" max="-2" attributes="0"/>
<Component id="useForIngestCheckbox" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="useForIngestCheckbox" alignment="0" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace min="-2" max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="ingestMessagesCheckbox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -173,6 +180,9 @@
<ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchEditListPanel.useForIngestCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchEditListPanel.useForIngestCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
</Properties> </Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="useForIngestCheckboxActionPerformed"/>
</Events>
</Component> </Component>
<Container class="javax.swing.JPanel" name="addKeywordPanel"> <Container class="javax.swing.JPanel" name="addKeywordPanel">
@ -261,6 +271,16 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="javax.swing.JCheckBox" name="ingestMessagesCheckbox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchEditListPanel.ingestMessagesCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="javax.swing.JButton" name="saveListButton"> <Component class="javax.swing.JButton" name="saveListButton">

View File

@ -256,6 +256,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
chRegex.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked); chRegex.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked);
selectorsCombo.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked && chRegex.isSelected()); selectorsCombo.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked && chRegex.isSelected());
useForIngestCheckbox.setEnabled(listSet && (!ingestOngoing || !inIngest)); useForIngestCheckbox.setEnabled(listSet && (!ingestOngoing || !inIngest));
ingestMessagesCheckbox.setEnabled(useForIngestCheckbox.isEnabled() && useForIngestCheckbox.isSelected());
saveListButton.setEnabled(listSet); saveListButton.setEnabled(listSet);
exportButton.setEnabled(listSet); exportButton.setEnabled(listSet);
deleteListButton.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked); deleteListButton.setEnabled(listSet && (!ingestOngoing || !inIngest) && !isLocked);
@ -295,6 +296,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
addWordField = new javax.swing.JTextField(); addWordField = new javax.swing.JTextField();
chRegex = new javax.swing.JCheckBox(); chRegex = new javax.swing.JCheckBox();
selectorsCombo = new javax.swing.JComboBox(); selectorsCombo = new javax.swing.JComboBox();
ingestMessagesCheckbox = new javax.swing.JCheckBox();
saveListButton = new javax.swing.JButton(); saveListButton = new javax.swing.JButton();
exportButton = new javax.swing.JButton(); exportButton = new javax.swing.JButton();
deleteListButton = new javax.swing.JButton(); deleteListButton = new javax.swing.JButton();
@ -332,6 +334,11 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
}); });
useForIngestCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.useForIngestCheckbox.text")); // NOI18N useForIngestCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.useForIngestCheckbox.text")); // NOI18N
useForIngestCheckbox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
useForIngestCheckboxActionPerformed(evt);
}
});
addWordButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.addWordButton.text")); // NOI18N addWordButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.addWordButton.text")); // NOI18N
addWordButton.addActionListener(new java.awt.event.ActionListener() { addWordButton.addActionListener(new java.awt.event.ActionListener() {
@ -389,6 +396,9 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
.addContainerGap()) .addContainerGap())
); );
ingestMessagesCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.ingestMessagesCheckbox.text")); // NOI18N
ingestMessagesCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(KeywordSearchEditListPanel.class, "KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText")); // NOI18N
javax.swing.GroupLayout listEditorPanelLayout = new javax.swing.GroupLayout(listEditorPanel); javax.swing.GroupLayout listEditorPanelLayout = new javax.swing.GroupLayout(listEditorPanel);
listEditorPanel.setLayout(listEditorPanelLayout); listEditorPanel.setLayout(listEditorPanelLayout);
listEditorPanelLayout.setHorizontalGroup( listEditorPanelLayout.setHorizontalGroup(
@ -404,17 +414,23 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
.addContainerGap(34, Short.MAX_VALUE) .addContainerGap(34, Short.MAX_VALUE)
.addComponent(addKeywordPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(addKeywordPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(19, 19, 19)) .addGap(19, 19, 19))
.addGroup(listEditorPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(ingestMessagesCheckbox)
.addContainerGap(131, Short.MAX_VALUE))
); );
listEditorPanelLayout.setVerticalGroup( listEditorPanelLayout.setVerticalGroup(
listEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) listEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, listEditorPanelLayout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, listEditorPanelLayout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 263, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
.addGap(5, 5, 5) .addGap(5, 5, 5)
.addComponent(addKeywordPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(addKeywordPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(listEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(listEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(deleteWordButton) .addComponent(deleteWordButton)
.addComponent(useForIngestCheckbox)) .addComponent(useForIngestCheckbox))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ingestMessagesCheckbox)
.addContainerGap()) .addContainerGap())
); );
@ -629,6 +645,11 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
private void chRegexActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chRegexActionPerformed private void chRegexActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chRegexActionPerformed
selectorsCombo.setEnabled(chRegex.isEnabled() && chRegex.isSelected()); selectorsCombo.setEnabled(chRegex.isEnabled() && chRegex.isSelected());
}//GEN-LAST:event_chRegexActionPerformed }//GEN-LAST:event_chRegexActionPerformed
private void useForIngestCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useForIngestCheckboxActionPerformed
ingestMessagesCheckbox.setEnabled(useForIngestCheckbox.isSelected());
}//GEN-LAST:event_useForIngestCheckboxActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel addKeywordPanel; private javax.swing.JPanel addKeywordPanel;
private javax.swing.JButton addWordButton; private javax.swing.JButton addWordButton;
@ -639,6 +660,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
private javax.swing.JButton deleteListButton; private javax.swing.JButton deleteListButton;
private javax.swing.JButton deleteWordButton; private javax.swing.JButton deleteWordButton;
private javax.swing.JButton exportButton; private javax.swing.JButton exportButton;
private javax.swing.JCheckBox ingestMessagesCheckbox;
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator1;
private javax.swing.JTable keywordTable; private javax.swing.JTable keywordTable;
@ -695,16 +717,18 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
KeywordSearchList oldList = loader.getList(currentKeywordList); KeywordSearchList oldList = loader.getList(currentKeywordList);
List<Keyword> oldKeywords = oldList.getKeywords(); List<Keyword> oldKeywords = oldList.getKeywords();
boolean oldIngest = oldList.getUseForIngest(); boolean oldIngest = oldList.getUseForIngest();
boolean oldIngestMessages = oldList.getIngestMessages();
List<Keyword> newKeywords = getAllKeywords(); List<Keyword> newKeywords = getAllKeywords();
boolean newIngest = useForIngestCheckbox.isSelected(); boolean newIngest = useForIngestCheckbox.isSelected();
boolean newIngestMessages = ingestMessagesCheckbox.isSelected();
if (!oldKeywords.equals(newKeywords) || oldIngest != newIngest) {
if (!oldKeywords.equals(newKeywords) || oldIngest != newIngest || oldIngestMessages != newIngestMessages) {
/*boolean save = KeywordSearchUtil.displayConfirmDialog("Save List Changes", /*boolean save = KeywordSearchUtil.displayConfirmDialog("Save List Changes",
"Do you want to save the changes you made to list " + currentKeywordList + "?", "Do you want to save the changes you made to list " + currentKeywordList + "?",
KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);*/ KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);*/
boolean save = true; boolean save = true;
if (save) { if (save) {
loader.addList(currentKeywordList, newKeywords, newIngest, oldList.isLocked()); loader.addList(currentKeywordList, newKeywords, newIngest, newIngestMessages, oldList.isLocked());
} }
} }
} }
@ -825,7 +849,10 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
deleteAll(); deleteAll();
addKeywords(keywords); addKeywords(keywords);
useForIngestCheckbox.setSelected(list.getUseForIngest()); boolean useForIngest = list.getUseForIngest();
useForIngestCheckbox.setSelected(useForIngest);
ingestMessagesCheckbox.setEnabled(useForIngest);
ingestMessagesCheckbox.setSelected(list.getIngestMessages());
} }
void deleteAll() { void deleteAll() {

View File

@ -65,7 +65,7 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
private volatile boolean commitIndex = false; //whether to commit index next time private volatile boolean commitIndex = false; //whether to commit index next time
private List<Keyword> keywords; //keywords to search private List<Keyword> keywords; //keywords to search
private List<String> keywordLists; // lists currently being searched private List<String> keywordLists; // lists currently being searched
private Map<String, String> keywordToList; //keyword to list name mapping private Map<String, KeywordSearchList> keywordToList; //keyword to list name mapping
//private final Object lock = new Object(); //private final Object lock = new Object();
private Timer commitTimer; private Timer commitTimer;
private Indexer indexer; private Indexer indexer;
@ -219,7 +219,7 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
keywords = new ArrayList<Keyword>(); keywords = new ArrayList<Keyword>();
keywordLists = new ArrayList<String>(); keywordLists = new ArrayList<String>();
keywordToList = new HashMap<String, String>(); keywordToList = new HashMap<String, KeywordSearchList>();
initKeywords(); initKeywords();
@ -357,7 +357,7 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
} }
for (Keyword keyword : list.getKeywords()) { for (Keyword keyword : list.getKeywords()) {
keywords.add(keyword); keywords.add(keyword);
keywordToList.put(keyword.getQuery(), listName); keywordToList.put(keyword.getQuery(), list);
} }
} }
@ -373,9 +373,10 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
keywordToList.clear(); keywordToList.clear();
for (String name : keywordLists) { for (String name : keywordLists) {
for (Keyword k : loader.getList(name).getKeywords()) { KeywordSearchList list = loader.getList(name);
for (Keyword k : list.getKeywords()) {
keywords.add(k); keywords.add(k);
keywordToList.put(k.getQuery(), name); keywordToList.put(k.getQuery(), list);
} }
} }
} }
@ -525,11 +526,15 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
protected Object doInBackground() throws Exception { protected Object doInBackground() throws Exception {
logger.log(Level.INFO, "Pending start of new searcher"); logger.log(Level.INFO, "Pending start of new searcher");
progress = ProgressHandleFactory.createHandle("Keyword Search" + (finalRun ? " (Finalizing)" : ""), new Cancellable() { final String displayName = "Keyword Search" + (finalRun ? " (Finalizing)" : "");
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
logger.log(Level.INFO, "Cancelling the searcher by user."); logger.log(Level.INFO, "Cancelling the searcher by user.");
if (progress != null) {
progress.setDisplayName(displayName + " (Cancelling...)");
}
return Searcher.this.cancel(true); return Searcher.this.cancel(true);
} }
}); });
@ -554,8 +559,9 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
return null; return null;
} }
final String queryStr = keywordQuery.getQuery(); final String queryStr = keywordQuery.getQuery();
final String listName = keywordToList.get(queryStr); final KeywordSearchList list = keywordToList.get(queryStr);
final String listName = list.getName();
//DEBUG //DEBUG
//logger.log(Level.INFO, "Searching: " + queryStr); //logger.log(Level.INFO, "Searching: " + queryStr);
@ -624,7 +630,10 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
if (!newResults.isEmpty()) { if (!newResults.isEmpty()) {
//write results to BB //write results to BB
Collection<BlackboardArtifact> newArtifacts = new ArrayList<BlackboardArtifact>(); //new artifacts to report
//new artifacts created, to report to listeners
Collection<BlackboardArtifact> newArtifacts = new ArrayList<BlackboardArtifact>();
for (final Keyword hitTerm : newResults.keySet()) { for (final Keyword hitTerm : newResults.keySet()) {
List<ContentHit> contentHitsAll = newResults.get(hitTerm); List<ContentHit> contentHitsAll = newResults.get(hitTerm);
Map<FsContent, Integer> contentHitsFlattened = ContentHit.flattenResults(contentHitsAll); Map<FsContent, Integer> contentHitsFlattened = ContentHit.flattenResults(contentHitsAll);
@ -720,7 +729,10 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
} }
detailsSb.append("</table>"); detailsSb.append("</table>");
managerProxy.postMessage(IngestMessage.createDataMessage(++messageID, instance, subjectSb.toString(), detailsSb.toString(), uniqueKey, written.getArtifact())); //check if should send messages on hits on this list
if (list.getIngestMessages())
//post ingest inbox msg
managerProxy.postMessage(IngestMessage.createDataMessage(++messageID, instance, subjectSb.toString(), detailsSb.toString(), uniqueKey, written.getArtifact()));
} //for each term hit } //for each term hit
@ -756,9 +768,12 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
if (finalRun) { if (finalRun) {
logger.log(Level.INFO, "The final searcher in this ingest done."); logger.log(Level.INFO, "The final searcher in this ingest done.");
finalSearcherDone = true; finalSearcherDone = true;
//keywords.clear(); keywords.clear();
//keywordLists.clear(); keywordLists.clear();
//keywordToList.clear(); keywordToList.clear();
//reset current resuls earlier to potentially garbage collect sooner
currentResults = new HashMap<Keyword, List<ContentHit>>();
managerProxy.postMessage(IngestMessage.createMessage(++messageID, MessageType.INFO, KeywordSearchIngestService.instance, "Completed")); managerProxy.postMessage(IngestMessage.createMessage(++messageID, MessageType.INFO, KeywordSearchIngestService.instance, "Completed"));
} }
} }

View File

@ -450,10 +450,6 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
return getValueAt(0, c).getClass(); return getValueAt(0, c).getClass();
} }
private void updateUseForIngest(KeywordSearchList list, boolean selected) {
// This causes an event to be fired which resyncs the list and makes user lose selection
listsHandle.addList(list.getName(), list.getKeywords(), selected);
}
List<String> getAllLists() { List<String> getAllLists() {
List<String> ret = new ArrayList<String>(); List<String> ret = new ArrayList<String>();

View File

@ -67,6 +67,7 @@ public class KeywordSearchListsXML {
private static final String LIST_CREATE_ATTR = "created"; private static final String LIST_CREATE_ATTR = "created";
private static final String LIST_MOD_ATTR = "modified"; private static final String LIST_MOD_ATTR = "modified";
private static final String LIST_USE_FOR_INGEST = "use_for_ingest"; private static final String LIST_USE_FOR_INGEST = "use_for_ingest";
private static final String LIST_INGEST_MSGS = "ingest_messages";
private static final String KEYWORD_EL = "keyword"; private static final String KEYWORD_EL = "keyword";
private static final String KEYWORD_LITERAL_ATTR = "literal"; private static final String KEYWORD_LITERAL_ATTR = "literal";
private static final String KEYWORD_SELECTOR_ATTR = "selector"; private static final String KEYWORD_SELECTOR_ATTR = "selector";
@ -118,10 +119,10 @@ public class KeywordSearchListsXML {
//urls.add(new Keyword("ssh://", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)); //urls.add(new Keyword("ssh://", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL));
addList("Phone Numbers", phones, true, true); addList("Phone Numbers", phones, true, true, true);
addList("IP Addresses", ips, true, true); addList("IP Addresses", ips, true, true, true);
addList("Email Addresses", emails, true, true); addList("Email Addresses", emails, true, true, true);
addList("URLs", urls, true, true); addList("URLs", urls, true, false, true); //disable messages for URLs list by default
} }
/** /**
@ -244,17 +245,17 @@ public class KeywordSearchListsXML {
* @param useForIngest should this list be used for ingest * @param useForIngest should this list be used for ingest
* @return true if old list was replaced * @return true if old list was replaced
*/ */
boolean addList(String name, List<Keyword> newList, boolean useForIngest, boolean locked) { boolean addList(String name, List<Keyword> newList, boolean useForIngest, boolean ingestMessages, boolean locked) {
boolean replaced = false; boolean replaced = false;
KeywordSearchList curList = getList(name); KeywordSearchList curList = getList(name);
final Date now = new Date(); final Date now = new Date();
if (curList == null) { if (curList == null) {
theLists.put(name, new KeywordSearchList(name, now, now, useForIngest, newList, locked)); theLists.put(name, new KeywordSearchList(name, now, now, useForIngest, ingestMessages, newList, locked));
if(!locked) if(!locked)
save(); save();
changeSupport.firePropertyChange(ListsEvt.LIST_ADDED.toString(), null, name); changeSupport.firePropertyChange(ListsEvt.LIST_ADDED.toString(), null, name);
} else { } else {
theLists.put(name, new KeywordSearchList(name, curList.getDateCreated(), now, useForIngest, newList, locked)); theLists.put(name, new KeywordSearchList(name, curList.getDateCreated(), now, useForIngest, ingestMessages, newList, locked));
if(!locked) if(!locked)
save(); save();
replaced = true; replaced = true;
@ -264,17 +265,17 @@ public class KeywordSearchListsXML {
return replaced; return replaced;
} }
boolean addList(String name, List<Keyword> newList, boolean useForIngest) { boolean addList(String name, List<Keyword> newList, boolean useForIngest, boolean ingestMessages) {
KeywordSearchList curList = getList(name); KeywordSearchList curList = getList(name);
if (curList == null) { if (curList == null) {
return addList(name, newList, useForIngest, false); return addList(name, newList, useForIngest, ingestMessages, false);
} else { } else {
return addList(name, newList, curList.getUseForIngest(), false); return addList(name, newList, curList.getUseForIngest(), ingestMessages, false);
} }
} }
boolean addList(String name, List<Keyword> newList) { boolean addList(String name, List<Keyword> newList) {
return addList(name, newList, true); return addList(name, newList, true, true);
} }
@ -347,6 +348,7 @@ public class KeywordSearchListsXML {
String created = dateFormatter.format(list.getDateCreated()); String created = dateFormatter.format(list.getDateCreated());
String modified = dateFormatter.format(list.getDateModified()); String modified = dateFormatter.format(list.getDateModified());
String useForIngest = list.getUseForIngest().toString(); String useForIngest = list.getUseForIngest().toString();
String ingestMessages = list.getIngestMessages().toString();
List<Keyword> keywords = list.getKeywords(); List<Keyword> keywords = list.getKeywords();
Element listEl = doc.createElement(LIST_EL); Element listEl = doc.createElement(LIST_EL);
@ -354,6 +356,7 @@ public class KeywordSearchListsXML {
listEl.setAttribute(LIST_CREATE_ATTR, created); listEl.setAttribute(LIST_CREATE_ATTR, created);
listEl.setAttribute(LIST_MOD_ATTR, modified); listEl.setAttribute(LIST_MOD_ATTR, modified);
listEl.setAttribute(LIST_USE_FOR_INGEST, useForIngest); listEl.setAttribute(LIST_USE_FOR_INGEST, useForIngest);
listEl.setAttribute(LIST_INGEST_MSGS, ingestMessages);
for (Keyword keyword : keywords) { for (Keyword keyword : keywords) {
Element keywordEl = doc.createElement(KEYWORD_EL); Element keywordEl = doc.createElement(KEYWORD_EL);
@ -399,11 +402,14 @@ public class KeywordSearchListsXML {
final String created = listEl.getAttribute(LIST_CREATE_ATTR); final String created = listEl.getAttribute(LIST_CREATE_ATTR);
final String modified = listEl.getAttribute(LIST_MOD_ATTR); final String modified = listEl.getAttribute(LIST_MOD_ATTR);
final String useForIngest = listEl.getAttribute(LIST_USE_FOR_INGEST); final String useForIngest = listEl.getAttribute(LIST_USE_FOR_INGEST);
final String ingestMessages = listEl.getAttribute(LIST_INGEST_MSGS);
Date createdDate = dateFormatter.parse(created); Date createdDate = dateFormatter.parse(created);
Date modDate = dateFormatter.parse(modified); Date modDate = dateFormatter.parse(modified);
Boolean useForIngestBool = Boolean.parseBoolean(useForIngest); Boolean useForIngestBool = Boolean.parseBoolean(useForIngest);
Boolean ingestMessagesBool = Boolean.parseBoolean(ingestMessages);
List<Keyword> words = new ArrayList<Keyword>(); List<Keyword> words = new ArrayList<Keyword>();
KeywordSearchList list = new KeywordSearchList(name, createdDate, modDate, useForIngestBool, words); KeywordSearchList list = new KeywordSearchList(name, createdDate, modDate, useForIngestBool, ingestMessagesBool, words);
//parse all words //parse all words
NodeList wordsNList = listEl.getElementsByTagName(KEYWORD_EL); NodeList wordsNList = listEl.getElementsByTagName(KEYWORD_EL);
@ -506,20 +512,22 @@ class KeywordSearchList {
private Date created; private Date created;
private Date modified; private Date modified;
private Boolean useForIngest; private Boolean useForIngest;
private Boolean ingestMessages;
private List<Keyword> keywords; private List<Keyword> keywords;
private Boolean locked; private Boolean locked;
KeywordSearchList(String name, Date created, Date modified, Boolean useForIngest, List<Keyword> keywords, boolean locked) { KeywordSearchList(String name, Date created, Date modified, Boolean useForIngest, Boolean ingestMessages, List<Keyword> keywords, boolean locked) {
this.name = name; this.name = name;
this.created = created; this.created = created;
this.modified = modified; this.modified = modified;
this.useForIngest = useForIngest; this.useForIngest = useForIngest;
this.ingestMessages = ingestMessages;
this.keywords = keywords; this.keywords = keywords;
this.locked = locked; this.locked = locked;
} }
KeywordSearchList(String name, Date created, Date modified, Boolean useForIngest, List<Keyword> keywords) { KeywordSearchList(String name, Date created, Date modified, Boolean useForIngest, Boolean ingestMessages, List<Keyword> keywords) {
this(name, created, modified, useForIngest, keywords, false); this(name, created, modified, useForIngest, ingestMessages, keywords, false);
} }
@ -563,6 +571,14 @@ class KeywordSearchList {
void setUseForIngest(boolean use) { void setUseForIngest(boolean use) {
this.useForIngest = use; this.useForIngest = use;
} }
Boolean getIngestMessages() {
return ingestMessages;
}
void setIngestMessages(boolean ingestMessages) {
this.ingestMessages = ingestMessages;
}
List<Keyword> getKeywords() { List<Keyword> getKeywords() {
return keywords; return keywords;