mirror of
https://github.com/elisspace/autopsy.git
synced 2026-09-29 22:09:52 +00:00
4380 fix merge conflicts with normalization of new correlation attrs
This commit is contained in:
+13
-10
@@ -57,27 +57,30 @@ final public class CorrelationAttributeNormalizer {
|
||||
throw new CorrelationAttributeNormalizationException("Data was null.");
|
||||
}
|
||||
|
||||
String trimmedData = data.trim();
|
||||
|
||||
switch (attributeType.getId()) {
|
||||
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
||||
return normalizeMd5(data);
|
||||
return normalizeMd5(trimmedData);
|
||||
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
||||
return normalizeDomain(data);
|
||||
return normalizeDomain(trimmedData);
|
||||
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
||||
return normalizeEmail(data);
|
||||
return normalizeEmail(trimmedData);
|
||||
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
||||
return normalizePhone(data);
|
||||
return normalizePhone(trimmedData);
|
||||
case CorrelationAttributeInstance.USBID_TYPE_ID:
|
||||
return normalizeUsbId(data);
|
||||
return normalizeUsbId(trimmedData);
|
||||
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
||||
return verifySsid(data);
|
||||
return verifySsid(trimmedData);
|
||||
case CorrelationAttributeInstance.MAC_TYPE_ID:
|
||||
return normalizeMac(data);
|
||||
return normalizeMac(trimmedData);
|
||||
case CorrelationAttributeInstance.IMEI_TYPE_ID:
|
||||
return normalizeImei(data);
|
||||
return normalizeImei(trimmedData);
|
||||
case CorrelationAttributeInstance.IMSI_TYPE_ID:
|
||||
return normalizeImsi(data);
|
||||
return normalizeImsi(trimmedData);
|
||||
case CorrelationAttributeInstance.ICCID_TYPE_ID:
|
||||
return normalizeIccid(data);
|
||||
return normalizeIccid(trimmedData);
|
||||
|
||||
default:
|
||||
final String errorMessage = String.format(
|
||||
"Validator function not found for attribute type: %s",
|
||||
|
||||
+79
-2
@@ -60,6 +60,7 @@ public class IngestEventsListener {
|
||||
final Collection<String> recentlyAddedCeArtifacts = new LinkedHashSet<>();
|
||||
private static int correlationModuleInstanceCount;
|
||||
private static boolean flagNotableItems;
|
||||
private static boolean flagSeenDevices;
|
||||
private final ExecutorService jobProcessingExecutor;
|
||||
private static final String INGEST_EVENT_THREAD_NAME = "Ingest-Event-Listener-%d";
|
||||
private final PropertyChangeListener pcl1 = new IngestModuleEventListener();
|
||||
@@ -134,6 +135,15 @@ public class IngestEventsListener {
|
||||
return flagNotableItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Are previously seen devices being flagged?
|
||||
*
|
||||
* @return True if flagging seen devices; otherwise false.
|
||||
*/
|
||||
public synchronized static boolean isFlagSeenDevices() {
|
||||
return flagSeenDevices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure the listener to flag notable items or not.
|
||||
*
|
||||
@@ -143,6 +153,15 @@ public class IngestEventsListener {
|
||||
flagNotableItems = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure the listener to flag previously seen devices or not.
|
||||
*
|
||||
* @param value True to flag seen devices; otherwise false.
|
||||
*/
|
||||
public synchronized static void setFlagSeenDevices(boolean value) {
|
||||
flagSeenDevices = value;
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"IngestEventsListener.prevTaggedSet.text=Previously Tagged As Notable (Central Repository)",
|
||||
"IngestEventsListener.prevCaseComment.text=Previous Case: ",
|
||||
"IngestEventsListener.ingestmodule.name=Correlation Engine"})
|
||||
@@ -179,6 +198,46 @@ public class IngestEventsListener {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Interesting Aritfact hit for a device which was previously seen
|
||||
* in the central repository.
|
||||
*
|
||||
* @param bbArtifact the artifact to create the interesting item for
|
||||
*/
|
||||
@NbBundle.Messages({"IngestEventsListener.prevExists.text=Previously Seen Devices (Central Repository)",
|
||||
"# {0} - typeName",
|
||||
"# {1} - count",
|
||||
"IngestEventsListener.prevCount.text=Number of previous {0}: {1}"})
|
||||
static private void postCorrelatedPreviousArtifactToBlackboard(BlackboardArtifact bbArtifact) {
|
||||
|
||||
try {
|
||||
AbstractFile af = bbArtifact.getSleuthkitCase().getAbstractFileById(bbArtifact.getObjectID());
|
||||
Collection<BlackboardAttribute> attributes = new ArrayList<>();
|
||||
String MODULE_NAME = Bundle.IngestEventsListener_ingestmodule_name();
|
||||
BlackboardArtifact tifArtifact = af.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
|
||||
BlackboardAttribute att = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME,
|
||||
Bundle.IngestEventsListener_prevExists_text());
|
||||
attributes.add(att);
|
||||
attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, bbArtifact.getArtifactID()));
|
||||
|
||||
tifArtifact.addAttributes(attributes);
|
||||
try {
|
||||
// index the artifact for keyword search
|
||||
Blackboard blackboard = Case.getCurrentCaseThrows().getServices().getBlackboard();
|
||||
blackboard.indexArtifact(tifArtifact);
|
||||
} catch (Blackboard.BlackboardException | NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Unable to index blackboard artifact " + tifArtifact.getArtifactID(), ex); //NON-NLS
|
||||
}
|
||||
|
||||
// fire event to notify UI of this new artifact
|
||||
IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent(MODULE_NAME, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT));
|
||||
} catch (TskCoreException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Failed to create BlackboardArtifact.", ex); // NON-NLS
|
||||
} catch (IllegalStateException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Failed to create BlackboardAttribute.", ex); // NON-NLS
|
||||
}
|
||||
}
|
||||
|
||||
private class IngestModuleEventListener implements PropertyChangeListener {
|
||||
|
||||
@Override
|
||||
@@ -198,7 +257,8 @@ public class IngestEventsListener {
|
||||
case DATA_ADDED: {
|
||||
//if ingest isn't running create the interesting items otherwise use the ingest module setting to determine if we create interesting items
|
||||
boolean flagNotable = !IngestManager.getInstance().isIngestRunning() || isFlagNotableItems();
|
||||
jobProcessingExecutor.submit(new DataAddedTask(dbManager, evt, flagNotable));
|
||||
boolean flagPrevious = !IngestManager.getInstance().isIngestRunning() || isFlagSeenDevices();
|
||||
jobProcessingExecutor.submit(new DataAddedTask(dbManager, evt, flagNotable, flagPrevious));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -237,11 +297,13 @@ public class IngestEventsListener {
|
||||
private final EamDb dbManager;
|
||||
private final PropertyChangeEvent event;
|
||||
private final boolean flagNotableItemsEnabled;
|
||||
private final boolean flagPreviousItemsEnabled;
|
||||
|
||||
private DataAddedTask(EamDb db, PropertyChangeEvent evt, boolean flagNotableItemsEnabled) {
|
||||
private DataAddedTask(EamDb db, PropertyChangeEvent evt, boolean flagNotableItemsEnabled, boolean flagPreviousItemsEnabled) {
|
||||
dbManager = db;
|
||||
event = evt;
|
||||
this.flagNotableItemsEnabled = flagNotableItemsEnabled;
|
||||
this.flagPreviousItemsEnabled = flagPreviousItemsEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -279,6 +341,21 @@ public class IngestEventsListener {
|
||||
LOGGER.log(Level.INFO, String.format("Unable to flag notable item: %s.", eamArtifact.toString()), ex);
|
||||
}
|
||||
}
|
||||
if (flagPreviousItemsEnabled
|
||||
&& (eamArtifact.getCorrelationType().getId() == CorrelationAttributeInstance.USBID_TYPE_ID
|
||||
|| eamArtifact.getCorrelationType().getId() == CorrelationAttributeInstance.ICCID_TYPE_ID
|
||||
|| eamArtifact.getCorrelationType().getId() == CorrelationAttributeInstance.IMEI_TYPE_ID
|
||||
|| eamArtifact.getCorrelationType().getId() == CorrelationAttributeInstance.IMSI_TYPE_ID
|
||||
|| eamArtifact.getCorrelationType().getId() == CorrelationAttributeInstance.MAC_TYPE_ID)) {
|
||||
try {
|
||||
Long countPreviousOccurences = dbManager.getCountArtifactInstancesByTypeValue(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue());
|
||||
if (countPreviousOccurences > 0) {
|
||||
postCorrelatedPreviousArtifactToBlackboard(bbArtifact);
|
||||
}
|
||||
} catch (CorrelationAttributeNormalizationException ex) {
|
||||
LOGGER.log(Level.INFO, String.format("Unable to flag notable item: %s.", eamArtifact.toString()), ex);
|
||||
}
|
||||
}
|
||||
eamArtifacts.add(eamArtifact);
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
IngestSettingsPanel.ingestSettingsLabel.text=Ingest Settings
|
||||
IngestSettingsPanel.flagTaggedNotableItemsCheckbox.text=Flag items previously tagged as notable
|
||||
IngestSettingsPanel.flagPreviouslySeenDevicesCheckbox.text=Flag previously seen devices
|
||||
|
||||
@@ -61,6 +61,7 @@ import org.sleuthkit.autopsy.healthmonitor.TimingMetric;
|
||||
final class IngestModule implements FileIngestModule {
|
||||
|
||||
static final boolean DEFAULT_FLAG_TAGGED_NOTABLE_ITEMS = true;
|
||||
static final boolean DEFAULT_FLAG_PREVIOUS_DEVICES = true;
|
||||
|
||||
private final static Logger logger = Logger.getLogger(IngestModule.class.getName());
|
||||
private final IngestServices services = IngestServices.getInstance();
|
||||
@@ -72,6 +73,7 @@ final class IngestModule implements FileIngestModule {
|
||||
private Blackboard blackboard;
|
||||
private CorrelationAttributeInstance.Type filesType;
|
||||
private final boolean flagTaggedNotableItems;
|
||||
private final boolean flagPreviouslySeenDevices;
|
||||
|
||||
/**
|
||||
* Instantiate the Correlation Engine ingest module.
|
||||
@@ -80,6 +82,7 @@ final class IngestModule implements FileIngestModule {
|
||||
*/
|
||||
IngestModule(IngestSettings settings) {
|
||||
flagTaggedNotableItems = settings.isFlagTaggedNotableItems();
|
||||
flagPreviouslySeenDevices = settings.isFlagPreviousDevices();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -228,6 +231,9 @@ final class IngestModule implements FileIngestModule {
|
||||
if (IngestEventsListener.getCeModuleInstanceCount() == 1 || !IngestEventsListener.isFlagNotableItems()) {
|
||||
IngestEventsListener.setFlagNotableItems(flagTaggedNotableItems);
|
||||
}
|
||||
if (IngestEventsListener.getCeModuleInstanceCount() == 1 || !IngestEventsListener.isFlagSeenDevices()) {
|
||||
IngestEventsListener.setFlagSeenDevices(flagPreviouslySeenDevices);
|
||||
}
|
||||
|
||||
if (EamDb.isEnabled() == false) {
|
||||
/*
|
||||
|
||||
@@ -28,21 +28,25 @@ final class IngestSettings implements IngestModuleIngestJobSettings {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private boolean flagTaggedNotableItems;
|
||||
private boolean flagPreviousDevices;
|
||||
|
||||
/**
|
||||
* Instantiate the ingest job settings with default values.
|
||||
*/
|
||||
IngestSettings() {
|
||||
this.flagTaggedNotableItems = IngestModule.DEFAULT_FLAG_TAGGED_NOTABLE_ITEMS;
|
||||
this.flagPreviousDevices = IngestModule.DEFAULT_FLAG_PREVIOUS_DEVICES;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiate the ingest job settings.
|
||||
*
|
||||
* @param flagTaggedNotableItems Flag previously tagged notable items.
|
||||
* @param flagPreviousDevices Flag devices which exist already in the Central Repository
|
||||
*/
|
||||
IngestSettings(boolean flagTaggedNotableItems) {
|
||||
IngestSettings(boolean flagTaggedNotableItems, boolean flagPreviousDevices) {
|
||||
this.flagTaggedNotableItems = flagTaggedNotableItems;
|
||||
this.flagPreviousDevices = flagPreviousDevices;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,12 +64,11 @@ final class IngestSettings implements IngestModuleIngestJobSettings {
|
||||
}
|
||||
|
||||
/**
|
||||
* Flag or ignore previously identified notable items.
|
||||
* Are previously seen devices to be flagged?
|
||||
*
|
||||
* @param ignorePreviousNotableItems Are previously tagged notable items to
|
||||
* be flagged?
|
||||
* @return True if flagging; otherwise false.
|
||||
*/
|
||||
void setFlagTaggedNotableItems(boolean flagTaggedNotableItems) {
|
||||
this.flagTaggedNotableItems = flagTaggedNotableItems;
|
||||
boolean isFlagPreviousDevices() {
|
||||
return flagPreviousDevices;
|
||||
}
|
||||
}
|
||||
|
||||
+17
-5
@@ -19,11 +19,14 @@
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
||||
<Component id="flagTaggedNotableItemsCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="ingestSettingsLabel" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="flagPreviouslySeenDevicesCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="flagTaggedNotableItemsCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace pref="65" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
@@ -36,7 +39,9 @@
|
||||
<Component id="ingestSettingsLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="flagTaggedNotableItemsCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="245" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="flagPreviouslySeenDevicesCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="222" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -59,5 +64,12 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="flagPreviouslySeenDevicesCheckbox">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/ingestmodule/Bundle.properties" key="IngestSettingsPanel.flagPreviouslySeenDevicesCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
|
||||
+13
-4
@@ -42,11 +42,12 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
||||
*/
|
||||
private void customizeComponents(IngestSettings settings) {
|
||||
flagTaggedNotableItemsCheckbox.setSelected(settings.isFlagTaggedNotableItems());
|
||||
flagPreviouslySeenDevicesCheckbox.setSelected(settings.isFlagPreviousDevices());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IngestModuleIngestJobSettings getSettings() {
|
||||
return new IngestSettings(flagTaggedNotableItemsCheckbox.isSelected());
|
||||
return new IngestSettings(flagTaggedNotableItemsCheckbox.isSelected(), flagPreviouslySeenDevicesCheckbox.isSelected());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,12 +61,15 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
||||
|
||||
ingestSettingsLabel = new javax.swing.JLabel();
|
||||
flagTaggedNotableItemsCheckbox = new javax.swing.JCheckBox();
|
||||
flagPreviouslySeenDevicesCheckbox = new javax.swing.JCheckBox();
|
||||
|
||||
ingestSettingsLabel.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
|
||||
org.openide.awt.Mnemonics.setLocalizedText(ingestSettingsLabel, org.openide.util.NbBundle.getMessage(IngestSettingsPanel.class, "IngestSettingsPanel.ingestSettingsLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(flagTaggedNotableItemsCheckbox, org.openide.util.NbBundle.getMessage(IngestSettingsPanel.class, "IngestSettingsPanel.flagTaggedNotableItemsCheckbox.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(flagPreviouslySeenDevicesCheckbox, org.openide.util.NbBundle.getMessage(IngestSettingsPanel.class, "IngestSettingsPanel.flagPreviouslySeenDevicesCheckbox.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
@@ -73,10 +77,12 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(ingestSettingsLabel)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(10, 10, 10)
|
||||
.addComponent(flagTaggedNotableItemsCheckbox))
|
||||
.addComponent(ingestSettingsLabel))
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(flagPreviouslySeenDevicesCheckbox)
|
||||
.addComponent(flagTaggedNotableItemsCheckbox))))
|
||||
.addContainerGap(65, Short.MAX_VALUE))
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
@@ -86,11 +92,14 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
||||
.addComponent(ingestSettingsLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(flagTaggedNotableItemsCheckbox)
|
||||
.addContainerGap(245, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(flagPreviouslySeenDevicesCheckbox)
|
||||
.addContainerGap(222, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JCheckBox flagPreviouslySeenDevicesCheckbox;
|
||||
private javax.swing.JCheckBox flagTaggedNotableItemsCheckbox;
|
||||
private javax.swing.JLabel ingestSettingsLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@@ -322,11 +322,10 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
|
||||
}
|
||||
|
||||
@NbBundle.Messages({
|
||||
"BlackboardArtifactNode.createSheet.artifactType.displayName=Artifact Type",
|
||||
"BlackboardArtifactNode.createSheet.artifactType.name=Artifact Type",
|
||||
"BlackboardArtifactNode.createSheet.artifactDetails.displayName=Artifact Details",
|
||||
"BlackboardArtifactNode.createSheet.artifactDetails.name=Artifact Details",
|
||||
"BlackboardArtifactNode.artifact.displayName=Artifact",
|
||||
"BlackboardArtifactNode.createSheet.artifactType.displayName=Result Type",
|
||||
"BlackboardArtifactNode.createSheet.artifactType.name=Result Type",
|
||||
"BlackboardArtifactNode.createSheet.artifactDetails.displayName=Result Details",
|
||||
"BlackboardArtifactNode.createSheet.artifactDetails.name=Result Details",
|
||||
"BlackboardArtifactNode.createSheet.artifactMD5.displayName=MD5 Hash",
|
||||
"BlackboardArtifactNode.createSheet.artifactMD5.name=MD5 Hash",
|
||||
"BlackboardArtifactNode.createSheet.fileSize.name=Size",
|
||||
@@ -372,7 +371,7 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
|
||||
sheetSet.put(new NodeProperty<>(NbBundle.getMessage(BlackboardArtifactNode.class, "BlackboardArtifactNode.createSheet.artifactType.name"),
|
||||
NbBundle.getMessage(BlackboardArtifactNode.class, "BlackboardArtifactNode.createSheet.artifactType.displayName"),
|
||||
NO_DESCR,
|
||||
associatedArtifact.getDisplayName() + " " + NbBundle.getMessage(BlackboardArtifactNode.class, "BlackboardArtifactNode.artifact.displayName")));
|
||||
associatedArtifact.getDisplayName()));
|
||||
sheetSet.put(new NodeProperty<>(NbBundle.getMessage(BlackboardArtifactNode.class, "BlackboardArtifactNode.createSheet.artifactDetails.name"),
|
||||
NbBundle.getMessage(BlackboardArtifactNode.class, "BlackboardArtifactNode.createSheet.artifactDetails.displayName"),
|
||||
NO_DESCR,
|
||||
|
||||
@@ -411,11 +411,15 @@ public class HashsetHits implements AutopsyVisitableItem {
|
||||
BlackboardArtifact art = skCase.getBlackboardArtifact(id);
|
||||
artifactHits.put(id, art);
|
||||
}
|
||||
list.add(id);
|
||||
} catch (TskException ex) {
|
||||
logger.log(Level.SEVERE, "TSK Exception occurred", ex); //NON-NLS
|
||||
}
|
||||
});
|
||||
|
||||
// Adding all keys at once is more efficient than adding one at a
|
||||
// time because Netbeans triggers internal processing each time an
|
||||
// element is added to the list.
|
||||
list.addAll(artifactHits.keySet());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -824,6 +824,18 @@ public final class FilesSet implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Construct a case-insensitive file name extension condition.
|
||||
*
|
||||
* @param extension The file name extension to be matched.
|
||||
*/
|
||||
public ExtensionCondition(String extension) {
|
||||
// If there is a leading ".", strip it since
|
||||
// AbstractFile.getFileNameExtension() returns just the
|
||||
// extension chars and not the dot.
|
||||
super(extension.startsWith(".") ? extension.substring(1) : extension, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a case-insensitive file name extension condition.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@ OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleName=Search
|
||||
OtherCasesSearchDialog.searchButton.text=Search
|
||||
OtherCasesSearchDialog.correlationValueTextField.text=
|
||||
OtherCasesSearchDialog.correlationValueLabel.text=Correlation Property Value:
|
||||
OtherCasesSearchDialog.descriptionLabel.text=Search data in the Central Repository from other cases.
|
||||
OtherCasesSearchDialog.descriptionLabel.text=<html>Search the Central Repository for correlation properties with a specified value. The search is case insensitive.</html>
|
||||
OtherCasesSearchDialog.errorLabel.text=\
|
||||
OtherCasesSearchDialog.correlationTypeLabel.text=Correlation Property Type:
|
||||
OtherCasesSearchDialog.casesLabel.text=\
|
||||
|
||||
@@ -24,18 +24,10 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="casesLabel" max="32767" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="searchButton" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="descriptionLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="descriptionLabel" pref="430" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="correlationValueLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
@@ -43,11 +35,16 @@
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="correlationTypeComboBox" pref="289" max="32767" attributes="0"/>
|
||||
<Component id="correlationTypeComboBox" max="32767" attributes="0"/>
|
||||
<Component id="correlationValueTextField" max="32767" attributes="0"/>
|
||||
<Component id="errorLabel" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="casesLabel" max="32767" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="searchButton" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
@@ -57,25 +54,25 @@
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="descriptionLabel" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="descriptionLabel" min="-2" pref="39" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="correlationTypeComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="correlationTypeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="correlationValueLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="correlationValueTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="correlationValueLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="errorLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="20" max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="searchButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="casesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -149,7 +146,7 @@
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="casesLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="0"/>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.casesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
|
||||
@@ -26,19 +26,17 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.TopComponent;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizationException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizer;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
|
||||
@@ -55,6 +53,10 @@ import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
||||
"OtherCasesSearchDialog.resultsDescription.text=Other Cases Search",
|
||||
"OtherCasesSearchDialog.emptyNode.text=No results found.",
|
||||
"OtherCasesSearchDialog.validation.invalidHash=The supplied value is not a valid MD5 hash.",
|
||||
"OtherCasesSearchDialog.validation.invalidEmail=The supplied value is not a valid e-mail address.",
|
||||
"OtherCasesSearchDialog.validation.invalidDomain=The supplied value is not a valid domain.",
|
||||
"OtherCasesSearchDialog.validation.invalidPhone=The supplied value is not a valid phone number.",
|
||||
"OtherCasesSearchDialog.validation.genericMessage=The supplied value is not valid.",
|
||||
"# {0} - number of cases",
|
||||
"OtherCasesSearchDialog.caseLabel.text=The current Central Repository contains {0} case(s)."
|
||||
})
|
||||
@@ -67,9 +69,8 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
private static final Logger logger = Logger.getLogger(OtherCasesSearchDialog.class.getName());
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private static final String FILES_CORRELATION_TYPE = "Files";
|
||||
|
||||
private final List<CorrelationAttributeInstance.Type> correlationTypes;
|
||||
private CorrelationAttributeInstance.Type selectedCorrelationType;
|
||||
private TextPrompt correlationValueTextFieldPrompt;
|
||||
|
||||
/**
|
||||
@@ -84,23 +85,19 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
|
||||
/**
|
||||
* Perform the other cases search.
|
||||
*
|
||||
* @param type The correlation type.
|
||||
* @param value The value to be matched.
|
||||
*/
|
||||
private void search() {
|
||||
private void search(CorrelationAttributeInstance.Type type, String value) {
|
||||
new SwingWorker<List<CorrelationAttributeInstance>, Void>() {
|
||||
|
||||
@Override
|
||||
protected List<CorrelationAttributeInstance> doInBackground() {
|
||||
List<CorrelationAttributeInstance.Type> correlationTypes;
|
||||
List<CorrelationAttributeInstance> correlationInstances = new ArrayList<>();
|
||||
|
||||
try {
|
||||
correlationTypes = EamDb.getInstance().getDefinedCorrelationTypes();
|
||||
for (CorrelationAttributeInstance.Type type : correlationTypes) {
|
||||
if (type.getDisplayName().equals((String) correlationTypeComboBox.getSelectedItem())) {
|
||||
correlationInstances = EamDb.getInstance().getArtifactInstancesByTypeValue(type, correlationValueTextField.getText());
|
||||
break;
|
||||
}
|
||||
}
|
||||
correlationInstances = EamDb.getInstance().getArtifactInstancesByTypeValue(type, value);
|
||||
} catch (EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Unable to connect to the Central Repository database.", ex);
|
||||
} catch (CorrelationAttributeNormalizationException ex) {
|
||||
@@ -123,9 +120,7 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
TableFilterNode tableFilterNode = new TableFilterNode(searchNode, true, searchNode.getName());
|
||||
|
||||
String resultsText = String.format("%s (%s; \"%s\")",
|
||||
Bundle.OtherCasesSearchDialog_resultsTitle_text(),
|
||||
(String) correlationTypeComboBox.getSelectedItem(),
|
||||
correlationValueTextField.getText());
|
||||
Bundle.OtherCasesSearchDialog_resultsTitle_text(), type.getDisplayName(), value);
|
||||
final TopComponent searchResultWin;
|
||||
if (correlationInstances.isEmpty()) {
|
||||
Node emptyNode = new TableFilterNode(
|
||||
@@ -183,7 +178,7 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.descriptionLabel.text")); // NOI18N
|
||||
|
||||
casesLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
|
||||
casesLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(casesLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.casesLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
@@ -193,44 +188,42 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(casesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(searchButton))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(descriptionLabel)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addComponent(descriptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 430, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(correlationValueLabel)
|
||||
.addComponent(correlationTypeLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(correlationTypeComboBox, 0, 289, Short.MAX_VALUE)
|
||||
.addComponent(correlationTypeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(correlationValueTextField)
|
||||
.addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
||||
.addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(casesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(searchButton)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(descriptionLabel)
|
||||
.addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(correlationTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(correlationTypeLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGap(15, 15, 15)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(correlationValueLabel)
|
||||
.addComponent(correlationValueTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addComponent(correlationValueTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(correlationValueLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(errorLabel)
|
||||
.addGap(11, 11, 11)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 20, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(searchButton)
|
||||
.addComponent(casesLabel))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
searchButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleName")); // NOI18N
|
||||
@@ -240,23 +233,57 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
|
||||
if (validateInputs()) {
|
||||
/*
|
||||
* Just in case, we'll lock down the type and value components to
|
||||
* avoid the possibly of a race condition.
|
||||
*/
|
||||
correlationTypeComboBox.setEnabled(false);
|
||||
correlationValueTextField.setEnabled(false);
|
||||
|
||||
search();
|
||||
CorrelationAttributeInstance.Type correlationType = selectedCorrelationType;
|
||||
String correlationValue = correlationValueTextField.getText().trim();
|
||||
|
||||
if (validateInputs(correlationType, correlationValue)) {
|
||||
search(correlationType, correlationValue);
|
||||
dispose();
|
||||
} else {
|
||||
String validationMessage;
|
||||
switch (correlationType.getId()) {
|
||||
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidHash();
|
||||
break;
|
||||
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidDomain();
|
||||
break;
|
||||
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidEmail();
|
||||
break;
|
||||
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidPhone();
|
||||
break;
|
||||
default:
|
||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_genericMessage();
|
||||
break;
|
||||
|
||||
}
|
||||
errorLabel.setText(validationMessage);
|
||||
searchButton.setEnabled(false);
|
||||
errorLabel.setText(Bundle.OtherCasesSearchDialog_validation_invalidHash());
|
||||
correlationValueTextField.grabFocus();
|
||||
}
|
||||
}//GEN-LAST:event_searchButtonActionPerformed
|
||||
|
||||
|
||||
/**
|
||||
* Validate the supplied input.
|
||||
*
|
||||
* @param type The correlation type.
|
||||
* @param value The value to be validated.
|
||||
*
|
||||
* @return True if the input is valid for the given type; otherwise false.
|
||||
*/
|
||||
private boolean validateInputs(CorrelationAttributeInstance.Type type, String value) {
|
||||
try {
|
||||
CorrelationAttributeNormalizer.normalize(type, value);
|
||||
} catch (CorrelationAttributeNormalizationException ex) {
|
||||
// No need to log this.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Further customize the components beyond the standard initialization.
|
||||
*/
|
||||
@@ -277,20 +304,21 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
}
|
||||
|
||||
for (CorrelationAttributeInstance.Type type : correlationTypes) {
|
||||
// We only support the "Files" type for now.
|
||||
if (type.getDisplayName().equals(FILES_CORRELATION_TYPE)) {
|
||||
correlationTypeComboBox.addItem(type.getDisplayName());
|
||||
}
|
||||
correlationTypeComboBox.addItem(type.getDisplayName());
|
||||
}
|
||||
correlationTypeComboBox.setSelectedIndex(0);
|
||||
|
||||
correlationTypeComboBox.addItemListener(new ItemListener() {
|
||||
@Override
|
||||
public void itemStateChanged(ItemEvent e) {
|
||||
updateSelectedType();
|
||||
updateCorrelationValueTextFieldPrompt();
|
||||
updateSearchButton();
|
||||
}
|
||||
});
|
||||
|
||||
updateSelectedType();
|
||||
|
||||
/*
|
||||
* Create listener for text input.
|
||||
*/
|
||||
@@ -315,7 +343,12 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
}
|
||||
|
||||
@Messages({
|
||||
"OtherCasesSearchDialog.correlationValueTextField.filesExample=Example: \"f0e1d2c3b4a5968778695a4b3c2d1e0f\""
|
||||
"OtherCasesSearchDialog.correlationValueTextField.filesExample=Example: \"f0e1d2c3b4a5968778695a4b3c2d1e0f\"",
|
||||
"OtherCasesSearchDialog.correlationValueTextField.domainExample=Example: \"domain.com\"",
|
||||
"OtherCasesSearchDialog.correlationValueTextField.emailExample=Example: \"user@host.com\"",
|
||||
"OtherCasesSearchDialog.correlationValueTextField.phoneExample=Example: \"(800)123-4567\"",
|
||||
"OtherCasesSearchDialog.correlationValueTextField.usbExample=Example: \"4&1234567&0\"",
|
||||
"OtherCasesSearchDialog.correlationValueTextField.ssidExample=Example: \"WirelessNetwork-5G\""
|
||||
})
|
||||
/**
|
||||
* Update the text prompt of the name text field based on the input type
|
||||
@@ -325,7 +358,30 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
/**
|
||||
* Add text prompt to the text field.
|
||||
*/
|
||||
String text = Bundle.OtherCasesSearchDialog_correlationValueTextField_filesExample();
|
||||
String text;
|
||||
switch(selectedCorrelationType.getId()) {
|
||||
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_filesExample();
|
||||
break;
|
||||
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_domainExample();
|
||||
break;
|
||||
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_emailExample();
|
||||
break;
|
||||
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_phoneExample();
|
||||
break;
|
||||
case CorrelationAttributeInstance.USBID_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_usbExample();
|
||||
break;
|
||||
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_ssidExample();
|
||||
break;
|
||||
default:
|
||||
text = "";
|
||||
break;
|
||||
}
|
||||
correlationValueTextFieldPrompt = new TextPrompt(text, correlationValueTextField);
|
||||
|
||||
/**
|
||||
@@ -338,6 +394,19 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the 'selectedCorrelationType' value to match the selected type
|
||||
* from the combo-box.
|
||||
*/
|
||||
private void updateSelectedType() {
|
||||
for (CorrelationAttributeInstance.Type type : correlationTypes) {
|
||||
if (type.getDisplayName().equals((String) correlationTypeComboBox.getSelectedItem())) {
|
||||
selectedCorrelationType = type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable or disable the Search button depending on whether or not text has
|
||||
* been provided for the correlation property value.
|
||||
@@ -345,20 +414,6 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
private void updateSearchButton() {
|
||||
searchButton.setEnabled(correlationValueTextField.getText().isEmpty() == false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the value input.
|
||||
*
|
||||
* @return True if the input is valid for the selected type; otherwise false.
|
||||
*/
|
||||
private boolean validateInputs() {
|
||||
Pattern md5Pattern = Pattern.compile("^[a-fA-F0-9]{32}$"); // NON-NLS
|
||||
Matcher matcher = md5Pattern.matcher(correlationValueTextField.getText().trim());
|
||||
if (matcher.find()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the Search Other Cases dialog.
|
||||
@@ -378,4 +433,4 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
||||
private javax.swing.JLabel errorLabel;
|
||||
private javax.swing.JButton searchButton;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
}
|
||||
@@ -253,4 +253,8 @@ ReportGenerator.errList.coreExceptionWhileGenRptRow=Core exception while generat
|
||||
ReportKML.latLongStartPoint={0};{1};;{2} (Start)\n
|
||||
ReportKML.latLongEndPoint={0};{1};;{2} (End)\n
|
||||
ReportGenerationPanel.cancelButton.actionCommand=Cancel
|
||||
ReportGenerationPanel.cancelButton.text=Cancel
|
||||
ReportGenerationPanel.cancelButton.text=Cancel
|
||||
ReportHTMLConfigurationPanel.headerTextField.text=
|
||||
ReportHTMLConfigurationPanel.footerTextField.text=
|
||||
ReportHTMLConfigurationPanel.headerLabel.text=Header:
|
||||
ReportHTMLConfigurationPanel.footerLabel.text=Footer:
|
||||
|
||||
@@ -243,4 +243,4 @@ ReportVisualPanel1.invalidModuleWarning=\u7121\u52b9\u306a\u30ec\u30dd\u30fc\u30
|
||||
ReportGenerationPanel.confDlg.cancelReport.msg=\u672c\u5f53\u306b\u30ec\u30dd\u30fc\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u304b\uff1f
|
||||
ReportProgressPanel.complete.processLb2.text=\u5b8c\u4e86\u3057\u307e\u3057\u305f\u304c\u3001\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
||||
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2012 Basis Technology Corp.
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,8 +18,6 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.report;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
public interface GeneralReportModule extends ReportModule {
|
||||
|
||||
/**
|
||||
@@ -33,13 +31,4 @@ public interface GeneralReportModule extends ReportModule {
|
||||
*/
|
||||
public void generateReport(String baseReportDir, ReportProgressPanel progressPanel);
|
||||
|
||||
/**
|
||||
* Returns the configuration panel for the report, which is displayed in the
|
||||
* report configuration step of the report wizard.
|
||||
*
|
||||
* @return Configuration panel or null if the module does not need
|
||||
* configuration.
|
||||
*/
|
||||
public JPanel getConfigurationPanel();
|
||||
|
||||
}
|
||||
|
||||
@@ -47,6 +47,8 @@ import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.logging.Level;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.JPanel;
|
||||
import org.apache.commons.lang3.StringEscapeUtils;
|
||||
import org.openide.filesystems.FileUtil;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
@@ -56,6 +58,7 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
||||
import org.sleuthkit.autopsy.coreutils.EscapeUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
||||
import org.sleuthkit.autopsy.coreutils.Version;
|
||||
import org.sleuthkit.autopsy.datamodel.ContentUtils.ExtractFscContentVisitor;
|
||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||
@@ -89,6 +92,8 @@ class ReportHTML implements TableReportModule {
|
||||
private String currentDataType; // name of current data type
|
||||
private Integer rowCount; // number of rows (aka artifacts or tags) for the current data type
|
||||
private Writer out;
|
||||
|
||||
private ReportHTMLConfigurationPanel configPanel;
|
||||
|
||||
private final ReportBranding reportBranding;
|
||||
|
||||
@@ -104,6 +109,14 @@ class ReportHTML implements TableReportModule {
|
||||
private ReportHTML() {
|
||||
reportBranding = new ReportBranding();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JPanel getConfigurationPanel() {
|
||||
if (configPanel == null) {
|
||||
configPanel = new ReportHTMLConfigurationPanel();
|
||||
}
|
||||
return configPanel;
|
||||
}
|
||||
|
||||
// Refesh the member variables
|
||||
private void refresh() throws NoCurrentCaseException {
|
||||
@@ -332,6 +345,10 @@ class ReportHTML implements TableReportModule {
|
||||
*/
|
||||
@Override
|
||||
public void startReport(String baseReportDir) {
|
||||
// Save settings
|
||||
ModuleSettings.setConfigSetting("HTMLReport", "header", configPanel.getHeader()); //NON-NLS
|
||||
ModuleSettings.setConfigSetting("HTMLReport", "footer", configPanel.getFooter()); //NON-NLS
|
||||
|
||||
// Refresh the HTML report
|
||||
try {
|
||||
refresh();
|
||||
@@ -392,12 +409,14 @@ class ReportHTML implements TableReportModule {
|
||||
|
||||
try {
|
||||
StringBuilder page = new StringBuilder();
|
||||
page.append("<html>\n<head>\n\t<title>").append(name).append("</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"index.css\" />\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n</head>\n<body>\n"); //NON-NLS
|
||||
page.append("<div id=\"header\">").append(name).append("</div>\n<div id=\"content\">\n"); //NON-NLS
|
||||
page.append("<html>\n<head>\n\t<title>").append(name).append("</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"index.css\" />\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n</head>\n<body>\n") //NON-NLS
|
||||
.append(writePageHeader())
|
||||
.append("<div id=\"header\">").append(name).append("</div>\n")
|
||||
.append("<div id=\"content\">\n"); //NON-NLS
|
||||
if (!description.isEmpty()) {
|
||||
page.append("<p><strong>"); //NON-NLS
|
||||
page.append(description);
|
||||
page.append("</string></p>\n"); //NON-NLS
|
||||
page.append("</strong></p>\n"); //NON-NLS
|
||||
}
|
||||
out.write(page.toString());
|
||||
currentDataType = name;
|
||||
@@ -415,7 +434,10 @@ class ReportHTML implements TableReportModule {
|
||||
public void endDataType() {
|
||||
dataTypes.put(currentDataType, rowCount);
|
||||
try {
|
||||
out.write("</div>\n</body>\n</html>\n"); //NON-NLS
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(writePageFooter());
|
||||
builder.append("</div>\n</body>\n</html>\n"); //NON-NLS
|
||||
out.write(builder.toString());
|
||||
} catch (IOException ex) {
|
||||
logger.log(Level.SEVERE, "Failed to write end of HTML report.", ex); //NON-NLS
|
||||
} finally {
|
||||
@@ -430,6 +452,40 @@ class ReportHTML implements TableReportModule {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write HTML-formatted page header text based on the text provided in the
|
||||
* configuration panel.
|
||||
*
|
||||
* @return The HTML-formatted text.
|
||||
*/
|
||||
private String writePageHeader() {
|
||||
StringBuilder output = new StringBuilder();
|
||||
String pageHeader = configPanel.getHeader();
|
||||
if (pageHeader.isEmpty() == false) {
|
||||
output.append("<div id=\"pageHeaderFooter\">")
|
||||
.append(StringEscapeUtils.escapeHtml4(pageHeader))
|
||||
.append("</div>\n"); //NON-NLS
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write HTML-formatted page footer text based on the text provided in the
|
||||
* configuration panel.
|
||||
*
|
||||
* @return The HTML-formatted text.
|
||||
*/
|
||||
private String writePageFooter() {
|
||||
StringBuilder output = new StringBuilder();
|
||||
String pageFooter = configPanel.getFooter();
|
||||
if (pageFooter.isEmpty() == false) {
|
||||
output.append("<br/><div id=\"pageHeaderFooter\">")
|
||||
.append(StringEscapeUtils.escapeHtml4(pageFooter))
|
||||
.append("</div>"); //NON-NLS
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a new set under the current data type.
|
||||
@@ -860,6 +916,8 @@ class ReportHTML implements TableReportModule {
|
||||
+ //NON-NLS
|
||||
"#header {width:100%; padding: 10px; line-height: 25px; background: #07A; color: #FFF; font-size: 20px;}\n"
|
||||
+ //NON-NLS
|
||||
"#pageHeaderFooter {width: 100%; padding: 10px; line-height: 25px; text-align: center; font-size: 20px;}\n"
|
||||
+ //NON-NLS
|
||||
"h1 {font-size: 20px; font-weight: normal; color: #07A; padding: 0 0 7px 0; margin-top: 25px; border-bottom: 1px solid #D6D6D6;}\n"
|
||||
+ //NON-NLS
|
||||
"h2 {font-size: 20px; font-weight: bolder; color: #07A;}\n"
|
||||
@@ -1071,6 +1129,7 @@ class ReportHTML implements TableReportModule {
|
||||
NbBundle.getMessage(this.getClass(), "ReportHTML.writeSum.title")).append("</title>\n"); //NON-NLS
|
||||
head.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); //NON-NLS
|
||||
head.append("<style type=\"text/css\">\n"); //NON-NLS
|
||||
head.append("#pageHeaderFooter {width: 100%; padding: 10px; line-height: 25px; text-align: center; font-size: 20px;}\n"); //NON-NLS
|
||||
head.append("body { padding: 0px; margin: 0px; font: 13px/20px Arial, Helvetica, sans-serif; color: #535353; }\n"); //NON-NLS
|
||||
head.append("#wrapper { width: 90%; margin: 0px auto; margin-top: 35px; }\n"); //NON-NLS
|
||||
head.append("h1 { color: #07A; font-size: 36px; line-height: 42px; font-weight: normal; margin: 0px; border-bottom: 1px solid #81B9DB; }\n"); //NON-NLS
|
||||
@@ -1109,6 +1168,7 @@ class ReportHTML implements TableReportModule {
|
||||
final boolean generatorLogoSet = reportBranding.getGeneratorLogoPath() != null && !reportBranding.getGeneratorLogoPath().isEmpty();
|
||||
|
||||
summary.append("<div id=\"wrapper\">\n"); //NON-NLS
|
||||
summary.append(writePageHeader());
|
||||
summary.append("<h1>").append(reportTitle) //NON-NLS
|
||||
.append(running ? NbBundle.getMessage(this.getClass(), "ReportHTML.writeSum.warningMsg") : "")
|
||||
.append("</h1>\n"); //NON-NLS
|
||||
@@ -1129,6 +1189,7 @@ class ReportHTML implements TableReportModule {
|
||||
summary.append("<p class=\"subheadding\">").append(reportFooter).append("</p>\n"); //NON-NLS
|
||||
}
|
||||
summary.append("</div>\n"); //NON-NLS
|
||||
summary.append(writePageFooter());
|
||||
summary.append("</body></html>"); //NON-NLS
|
||||
output.write(summary.toString());
|
||||
} catch (FileNotFoundException ex) {
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||
<FontInfo relative="true">
|
||||
<Font bold="false" component="Form" property="font" relativeSize="false" size="11"/>
|
||||
</FontInfo>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="headerLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="footerLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="headerTextField" max="32767" attributes="0"/>
|
||||
<Component id="footerTextField" pref="371" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="headerLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="headerTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="footerTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="footerLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="188" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="headerLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportHTMLConfigurationPanel.headerLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="footerLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportHTMLConfigurationPanel.footerLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="headerTextField">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportHTMLConfigurationPanel.headerTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="footerTextField">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportHTMLConfigurationPanel.footerTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.report;
|
||||
|
||||
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
||||
|
||||
/**
|
||||
* The panel shown for all TableReportModules when configuring report modules.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class ReportHTMLConfigurationPanel extends javax.swing.JPanel {
|
||||
|
||||
/**
|
||||
* Creates new form DefaultReportConfigurationPanel
|
||||
*/
|
||||
ReportHTMLConfigurationPanel() {
|
||||
initComponents();
|
||||
|
||||
// Load settings
|
||||
String header = ModuleSettings.getConfigSetting("HTMLReport", "header"); //NON-NLS
|
||||
String footer = ModuleSettings.getConfigSetting("HTMLReport", "footer"); //NON-NLS
|
||||
|
||||
headerTextField.setText(header != null ? header : "");
|
||||
footerTextField.setText(footer != null ? footer : "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the header text.
|
||||
*
|
||||
* @return The header text.
|
||||
*/
|
||||
String getHeader() {
|
||||
return headerTextField.getText();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the footer text.
|
||||
*
|
||||
* @return The footer text.
|
||||
*/
|
||||
String getFooter() {
|
||||
return footerTextField.getText();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
headerLabel = new javax.swing.JLabel();
|
||||
footerLabel = new javax.swing.JLabel();
|
||||
headerTextField = new javax.swing.JTextField();
|
||||
footerTextField = new javax.swing.JTextField();
|
||||
|
||||
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(headerLabel, org.openide.util.NbBundle.getMessage(ReportHTMLConfigurationPanel.class, "ReportHTMLConfigurationPanel.headerLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(footerLabel, org.openide.util.NbBundle.getMessage(ReportHTMLConfigurationPanel.class, "ReportHTMLConfigurationPanel.footerLabel.text")); // NOI18N
|
||||
|
||||
headerTextField.setText(org.openide.util.NbBundle.getMessage(ReportHTMLConfigurationPanel.class, "ReportHTMLConfigurationPanel.headerTextField.text")); // NOI18N
|
||||
|
||||
footerTextField.setText(org.openide.util.NbBundle.getMessage(ReportHTMLConfigurationPanel.class, "ReportHTMLConfigurationPanel.footerTextField.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(headerLabel)
|
||||
.addComponent(footerLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(headerTextField)
|
||||
.addComponent(footerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 371, Short.MAX_VALUE))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(headerLabel)
|
||||
.addComponent(headerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(footerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(footerLabel))
|
||||
.addContainerGap(188, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel footerLabel;
|
||||
private javax.swing.JTextField footerTextField;
|
||||
private javax.swing.JLabel headerLabel;
|
||||
private javax.swing.JTextField headerTextField;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2012 Basis Technology Corp.
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
*
|
||||
* Copyright 2012 42six Solutions.
|
||||
* Contact: aebadirad <at> 42six <dot> com
|
||||
@@ -22,6 +22,8 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.report;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
/**
|
||||
* Interface for report modules that plug in to the reporting infrastructure.
|
||||
*/
|
||||
@@ -47,4 +49,15 @@ interface ReportModule {
|
||||
* module does not produce a report file.
|
||||
*/
|
||||
public String getRelativeFilePath();
|
||||
|
||||
/**
|
||||
* Returns the configuration panel for the report, which is displayed in the
|
||||
* report configuration step of the report wizard.
|
||||
*
|
||||
* @return Configuration panel or null if the module does not need
|
||||
* configuration.
|
||||
*/
|
||||
public default JPanel getConfigurationPanel() {
|
||||
return new DefaultReportConfigurationPanel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,18 +294,18 @@ final class ReportVisualPanel1 extends JPanel implements ListSelectionListener {
|
||||
// single selection, so max selection index is the only one selected.
|
||||
selectedIndex = m.getMaxSelectionIndex();
|
||||
|
||||
JPanel panel = new DefaultReportConfigurationPanel();
|
||||
ReportModule module = modules.get(selectedIndex);
|
||||
boolean generalModuleSelected = false;
|
||||
if (module instanceof GeneralReportModule) {
|
||||
JPanel generalPanel = ((GeneralReportModule) module).getConfigurationPanel();
|
||||
panel = (generalPanel == null) ? new JPanel() : generalPanel;
|
||||
generalModuleSelected = true;
|
||||
JPanel panel = module.getConfigurationPanel();
|
||||
if (panel == null) {
|
||||
panel = new JPanel();
|
||||
}
|
||||
|
||||
descriptionTextPane.setText(module.getDescription());
|
||||
configurationPanel.add(panel, BorderLayout.CENTER);
|
||||
configurationPanel.revalidate();
|
||||
configurationPanel.repaint();
|
||||
|
||||
boolean generalModuleSelected = (module instanceof GeneralReportModule);
|
||||
|
||||
wizPanel.setNext(!generalModuleSelected);
|
||||
wizPanel.setFinish(generalModuleSelected);
|
||||
|
||||
@@ -756,9 +756,12 @@ class TableReportGenerator {
|
||||
BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), currentList));
|
||||
}
|
||||
if (!keyword.equals(currentKeyword)) {
|
||||
// End the previous table if one exists.
|
||||
if (!currentKeyword.equals("")) {
|
||||
tableModule.endTable();
|
||||
}
|
||||
|
||||
// Prepare for a new table.
|
||||
currentKeyword = keyword;
|
||||
tableModule.addSetElement(currentKeyword);
|
||||
List<String> columnHeaderNames = new ArrayList<>();
|
||||
@@ -770,6 +773,11 @@ class TableReportGenerator {
|
||||
|
||||
tableModule.addRow(Arrays.asList(new String[]{preview, uniquePath, tagsList}));
|
||||
}
|
||||
|
||||
// End the previous table if one exists.
|
||||
if (!currentKeyword.isEmpty()) {
|
||||
tableModule.endTable();
|
||||
}
|
||||
|
||||
// Finish the current data type
|
||||
progressPanel.increment();
|
||||
|
||||
+11
-5
@@ -178,7 +178,7 @@ public class CentralRepoDatamodelTest extends TestCase {
|
||||
|
||||
@Override
|
||||
public void tearDown() {
|
||||
//
|
||||
//
|
||||
// // Restore the original properties
|
||||
// ModuleSettings.setConfigSettings(PROPERTIES_FILE, propertiesMap);
|
||||
//
|
||||
@@ -1172,8 +1172,10 @@ public class CentralRepoDatamodelTest extends TestCase {
|
||||
// DbManager.processInstanceTable(fileType, instancetableCallback);
|
||||
// int count1 = instancetableCallback.getCounter();
|
||||
// int count2 = instancetableCallback.getCounterNamingConvention();
|
||||
// assertEquals("Unexpected value for Process Instance count with filepath naming convention", 2, count2);
|
||||
// assertTrue("Unexpected value for Process Instance count with filepath without naming convention: " + count1 + " - expected greater than 0", count1 > 0);
|
||||
// //expects 2 rows to match the naming convention to of been processed, expects at least one row not matching the naming convention to be processed
|
||||
// //if the test code is changed to add additional Correlation Attributes which also have "processinstancecallback" in their path the first of these comparisons will need to change
|
||||
// assertEquals("Counter for items matching naming convention from AttributeInstaceTableCallback indicates an unexepected number of results when processed with DbManager.processInstanceTable", 2, count2);
|
||||
// assertTrue("Counter for items which do not match naming convention from AttributeInstaceTableCallback indicates an unexepected number of results when processed with DbManager.processInstanceTable. Count indicated: " + count1 + " - expected a number greater than 0", count1 > 0);
|
||||
// } catch (EamDbException | CorrelationAttributeNormalizationException ex) {
|
||||
// Exceptions.printStackTrace(ex);
|
||||
// Assert.fail("Error Exception thrown when calling processInstanceTable " + ex.getMessage());
|
||||
@@ -1193,14 +1195,18 @@ public class CentralRepoDatamodelTest extends TestCase {
|
||||
// CorrelationAttributeInstance attr1 = new CorrelationAttributeInstance(callbackTestFileHash, fileType, case1, dataSource1fromCase1, callbackTestFilePath1);
|
||||
// CorrelationAttributeInstance attr2 = new CorrelationAttributeInstance(callbackTestFileHash, fileType, case1, dataSource1fromCase1, callbackTestFilePath2);
|
||||
// EamDb DbManager = EamDb.getInstance();
|
||||
// //these redundant addArtifactInstance calls allow code to be rearranged if necessary
|
||||
// DbManager.addArtifactInstance(attr1);
|
||||
// DbManager.addArtifactInstance(attr2);
|
||||
// AttributeInstanceTableCallback instancetableCallback = new AttributeInstanceTableCallback();
|
||||
// DbManager.processInstanceTableWhere(fileType, "value='" + callbackTestFileHash + "'", instancetableCallback);
|
||||
// int count1 = instancetableCallback.getCounter();
|
||||
// //naming convention counts
|
||||
// int count2 = instancetableCallback.getCounterNamingConvention();
|
||||
// assertEquals("Unexpected value for Process Instance Where count with filepath naming convention", 2, count2);
|
||||
// assertTrue("Unexpected value for Process Instance Where count with filepath without naming convention: " + count1 + " - expected greater than 0", count1 > 0);
|
||||
// //this has only processed the rows where the value is equal to the specified value, which should only be the two rows with the naming convention checked for
|
||||
// //if the test code is changed to add additional Correlation Attributes with the same callbackTestFileHash value that is used here these comparisons will need to change
|
||||
// assertEquals("Counter for items matching naming convention from AttributeInstaceTableCallback indicates an unexepected number of results when processed with DbManager.processInstanceTableWhere", 2, count2);
|
||||
// assertEquals("Counter for items which do not match naming convention from AttributeInstaceTableCallback indicates an unexepected number of results when processed with DbManager.processInstanceTableWhere", 0, count1);
|
||||
// } catch (EamDbException | CorrelationAttributeNormalizationException ex) {
|
||||
// Exceptions.printStackTrace(ex);
|
||||
// Assert.fail("Error Exception thrown when calling processInstanceTableWhere " + ex.getMessage());
|
||||
|
||||
Reference in New Issue
Block a user