Use @Messages and fix logic

This commit is contained in:
Joe Ho 2019-05-08 10:16:27 -04:00
parent 2dba2e9f38
commit 3b51bb15a4
4 changed files with 119 additions and 141 deletions

View File

@ -245,12 +245,4 @@ LogicalImagerPanel.jLabel6.text=Or, pick a folder
LogicalImagerPanel.browseButton.text=Browse LogicalImagerPanel.browseButton.text=Browse
LogicalImagerPanel.topLabel.text=Import Autopsy Imager Results LogicalImagerPanel.topLabel.text=Import Autopsy Imager Results
LogicalImagerPanel.selectDriveLabel.text=Select Drive LogicalImagerPanel.selectDriveLabel.text=Select Drive
LogicalImagerPanel.selectAcquisitionFromDriveLabel.text=Select acquisition from Drive
LogicalImagerPanel.imageTable.columnModel.title0=Hostname
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
LogicalImagerPanel.messageLabel.text=Error/Status message LogicalImagerPanel.messageLabel.text=Error/Status message
LogicalImagerPanel.messageLabel.clickScanOrBrowse=Click SCAN or BROWSE button to find images
LogicalImagerPanel.messageLabel.noExternalDriveFound=No external drive found
LogicalImagerPanel.messageLabel.scanningExternalDrives=Scanning external drives for sparse_image.vhd ...
LogicalImagerPanel.messageLabel.selectedImage=Selected image
LogicalImagerPanel.messageLabel.noImageSelected=No image selected

View File

@ -168,8 +168,14 @@ LogicalEvidenceFilePanel.validatePanel.nonL01Error.text=Only files with the .l01
LogicalFilesDspPanel.subTypeComboBox.l01FileOption.text=Logical evidence file (L01) LogicalFilesDspPanel.subTypeComboBox.l01FileOption.text=Logical evidence file (L01)
LogicalFilesDspPanel.subTypeComboBox.localFilesOption.text=Local files and folders LogicalFilesDspPanel.subTypeComboBox.localFilesOption.text=Local files and folders
LogicalImagerDSProcessor.dataSourceType=Logical Imager LogicalImagerDSProcessor.dataSourceType=Logical Imager
LogicalImagerPanel.moduleErr=Module Error LogicalImagerPanel.imageTable.columnModel.title0=Hostname
LogicalImagerPanel.moduleErr.msg=A module caused an error listening to LogicalImagerPanel updates. See log to determine which module. Some data could be incomplete.\n LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
LogicalImagerPanel.messageLabel.clickScanOrBrowse=Click SCAN or BROWSE button to find images
LogicalImagerPanel.messageLabel.noExternalDriveFound=No external drive found
LogicalImagerPanel.messageLabel.noImageSelected=No image selected
LogicalImagerPanel.messageLabel.scanningExternalDrives=Scanning external drives for sparse_image.vhd ...
LogicalImagerPanel.messageLabel.selectedImage=Selected image
LogicalImagerPanel.selectAcquisitionFromDriveLabel.text=Select acquisition from Drive
Menu/Case/OpenRecentCase=Open Recent Case Menu/Case/OpenRecentCase=Open Recent Case
CTL_CaseDeleteAction=Delete Case CTL_CaseDeleteAction=Delete Case
OpenIDE-Module-Name=Case OpenIDE-Module-Name=Case
@ -435,12 +441,4 @@ LogicalImagerPanel.jLabel6.text=Or, pick a folder
LogicalImagerPanel.browseButton.text=Browse LogicalImagerPanel.browseButton.text=Browse
LogicalImagerPanel.topLabel.text=Import Autopsy Imager Results LogicalImagerPanel.topLabel.text=Import Autopsy Imager Results
LogicalImagerPanel.selectDriveLabel.text=Select Drive LogicalImagerPanel.selectDriveLabel.text=Select Drive
LogicalImagerPanel.selectAcquisitionFromDriveLabel.text=Select acquisition from Drive
LogicalImagerPanel.imageTable.columnModel.title0=Hostname
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
LogicalImagerPanel.messageLabel.text=Error/Status message LogicalImagerPanel.messageLabel.text=Error/Status message
LogicalImagerPanel.messageLabel.clickScanOrBrowse=Click SCAN or BROWSE button to find images
LogicalImagerPanel.messageLabel.noExternalDriveFound=No external drive found
LogicalImagerPanel.messageLabel.scanningExternalDrives=Scanning external drives for sparse_image.vhd ...
LogicalImagerPanel.messageLabel.selectedImage=Selected image
LogicalImagerPanel.messageLabel.noImageSelected=No image selected

View File

@ -24,51 +24,45 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="-2" pref="104" max="-2" attributes="0"/>
<Component id="topLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="messageLabel" max="32767" attributes="0"/> <Component id="messageLabel" pref="653" max="32767" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="28" max="-2" attributes="0"/> <EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="1" attributes="0">
<Component id="jLabel1" alignment="1" min="-2" pref="258" max="-2" attributes="0"/>
<Component id="scanButton" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" alignment="0" min="-2" pref="218" max="-2" attributes="0"/>
</Group>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Component id="scanButton" alignment="0" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <Component id="selectDriveLabel" min="-2" max="-2" attributes="0"/>
<Component id="jLabel6" max="32767" attributes="0"/> <Component id="jLabel1" min="-2" pref="194" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="45" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="browseButton" min="-2" max="-2" attributes="0"/>
<Component id="jLabel6" min="-2" pref="154" max="-2" attributes="0"/>
</Group>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="13" max="-2" attributes="0"/> <Component id="jScrollPane1" min="-2" pref="211" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="28" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="imageScrollPane" min="-2" pref="305" max="-2" attributes="0"/> <Component id="selectAcquisitionFromDriveLabel" min="-2" pref="305" max="-2" attributes="0"/>
<Component id="selectAcquisitionFromDriveLabel" min="-2" max="-2" attributes="0"/> <Component id="imageScrollPane" min="-2" pref="346" max="-2" attributes="0"/>
<Component id="browseButton" alignment="0" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace min="0" pref="8" max="32767" attributes="0"/>
</Group>
</Group>
</Group>
<Group type="102" attributes="0">
<Component id="selectDriveLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="150" max="-2" attributes="0"/>
<Component id="topLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
@ -86,16 +80,16 @@
<Component id="browseButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="browseButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace min="-2" pref="26" max="-2" attributes="0"/> <EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="selectAcquisitionFromDriveLabel" alignment="1" min="-2" max="-2" attributes="0"/> <Component id="selectDriveLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="selectDriveLabel" min="-2" max="-2" attributes="0"/> <Component id="selectAcquisitionFromDriveLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0"> <Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="imageScrollPane" pref="0" max="32767" attributes="0"/> <Component id="imageScrollPane" pref="0" max="32767" attributes="0"/>
<Component id="jScrollPane1" pref="118" max="32767" attributes="0"/> <Component id="jScrollPane1" pref="194" max="32767" attributes="0"/>
</Group> </Group>
<EmptySpace min="-2" pref="102" max="-2" attributes="0"/> <EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
<Component id="messageLabel" min="-2" max="-2" attributes="0"/> <Component id="messageLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="154" max="-2" attributes="0"/> <EmptySpace min="-2" pref="154" max="-2" attributes="0"/>
</Group> </Group>

View File

@ -34,25 +34,33 @@ import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileSystemView; import javax.swing.filechooser.FileSystemView;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel; import javax.swing.table.TableModel;
import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
/** /**
* Panel for adding an logical image file from drive letters. Allows the user * Panel for adding an logical image file from drive letters. Allows the user
* to select a file. * to select a file.
*/ */
@Messages({
"LogicalImagerPanel.messageLabel.selectedImage=Selected image",
"LogicalImagerPanel.messageLabel.noImageSelected=No image selected",
"LogicalImagerPanel.selectAcquisitionFromDriveLabel.text=Select acquisition from Drive"
})
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
public class LogicalImagerPanel extends JPanel implements DocumentListener { public class LogicalImagerPanel extends JPanel implements DocumentListener {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final String SELECTED_IMAGE_STR = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageLabel.selectedImage"); private static final String SPARSE_IMAGE_VHD = "sparse_image.vhd"; //NON-NLS
private static final String NO_IMAGE_SELECTED_STR = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageLabel.noImageSelected"); private static final String TSK_LOGICAL_IMAGER_EXE = "tsk_logical_imager.exe"; //NON-NLS
private static final String SELECTED_IMAGE_STR = Bundle.LogicalImagerPanel_messageLabel_selectedImage();
private static final String NO_IMAGE_SELECTED_STR = Bundle.LogicalImagerPanel_messageLabel_noImageSelected();
private static final String[] EMPTY_LIST_DATA = {}; private static final String[] EMPTY_LIST_DATA = {};
private final JFileChooser fileChooser = new JFileChooser(); private final JFileChooser fileChooser = new JFileChooser();
private final String contextName;
private final Pattern regex = Pattern.compile("Logical_Imager_(.+)_(\\d{4})(\\d{2})(\\d{2})_(\\d{2})_(\\d{2})_(\\d{2})"); private final Pattern regex = Pattern.compile("Logical_Imager_(.+)_(\\d{4})(\\d{2})(\\d{2})_(\\d{2})_(\\d{2})_(\\d{2})");
private Path choosenImagePath; private Path choosenImagePath;
private TableModel imageTableModel; private TableModel imageTableModel;
private final String contextName;
/** /**
* Creates new form LogicalImagerPanel * Creates new form LogicalImagerPanel
* *
@ -69,16 +77,16 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
* *
* @param context A string context name used to read/store last * @param context A string context name used to read/store last
* used settings. * used settings.
* @param fileChooserFilters A list of filters to be used with the
* FileChooser.
* *
* @return instance of the LogicalImagerPanel * @return instance of the LogicalImagerPanel
*/ */
@Messages({
"LogicalImagerPanel.messageLabel.clickScanOrBrowse=Click SCAN or BROWSE button to find images"
})
public static synchronized LogicalImagerPanel createInstance(String context) { public static synchronized LogicalImagerPanel createInstance(String context) {
LogicalImagerPanel instance = new LogicalImagerPanel(context); LogicalImagerPanel instance = new LogicalImagerPanel(context);
// post-constructor initialization of listener support without leaking references of uninitialized objects // post-constructor initialization of listener support without leaking references of uninitialized objects
String label = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageLabel.clickScanOrBrowse"); instance.messageLabel.setText(Bundle.LogicalImagerPanel_messageLabel_clickScanOrBrowse());
instance.messageLabel.setText(label);
return instance; return instance;
} }
@ -176,38 +184,34 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(104, 104, 104)
.addComponent(topLabel)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addComponent(messageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(messageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 653, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGap(28, 28, 28) .addGap(28, 28, 28)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 258, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(scanButton, javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addComponent(scanButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(13, 13, 13)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 305, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(selectAcquisitionFromDriveLabel)
.addComponent(browseButton))
.addGap(0, 8, Short.MAX_VALUE))))
.addGroup(layout.createSequentialGroup()
.addComponent(selectDriveLabel) .addComponent(selectDriveLabel)
.addGap(0, 0, Short.MAX_VALUE))))) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(45, 45, 45)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(browseButton)
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(28, 28, 28)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(selectAcquisitionFromDriveLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 305, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE))))))
.addContainerGap()) .addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(150, 150, 150)
.addComponent(topLabel)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -222,14 +226,14 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
.addComponent(scanButton) .addComponent(scanButton)
.addComponent(browseButton)) .addComponent(browseButton))
.addGap(26, 26, 26) .addGap(26, 26, 26)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(selectAcquisitionFromDriveLabel, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(selectDriveLabel)
.addComponent(selectDriveLabel)) .addComponent(selectAcquisitionFromDriveLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE))
.addGap(102, 102, 102) .addGap(26, 26, 26)
.addComponent(messageLabel) .addComponent(messageLabel)
.addGap(154, 154, 154)) .addGap(154, 154, 154))
); );
@ -237,21 +241,25 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
public static String humanReadableByteCount(long bytes, boolean si) { public static String humanReadableByteCount(long bytes, boolean si) {
int unit = si ? 1000 : 1024; int unit = si ? 1000 : 1024;
if (bytes < unit) return bytes + " B"; if (bytes < unit) return bytes + " B"; //NON-NLS
int exp = (int) (Math.log(bytes) / Math.log(unit)); int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); //NON-NLS
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); //NON-NLS
} }
@Messages({
"LogicalImagerPanel.messageLabel.scanningExternalDrives=Scanning external drives for sparse_image.vhd ...",
"LogicalImagerPanel.messageLabel.noExternalDriveFound=No external drive found"
})
private void scanButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scanButtonActionPerformed private void scanButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scanButtonActionPerformed
// Scan external drives for sparse_image.vhd // Scan external drives for sparse_image.vhd
messageLabel.setText(NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageLabel.scanningExternalDrives")); messageLabel.setText(Bundle.LogicalImagerPanel_messageLabel_scanningExternalDrives());
Vector<String> listData = new Vector<>(); Vector<String> listData = new Vector<>();
File[] paths = File.listRoots(); File[] paths = File.listRoots();
// for each pathname in pathname array // for each pathname in pathname array
for (File path : paths) { for (File path : paths) {
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(path); String description = FileSystemView.getFileSystemView().getSystemTypeDescription(path);
Path tskLogicalImagerExe = Paths.get(path.toString(), "tsk_logical_imager.exe"); Path tskLogicalImagerExe = Paths.get(path.toString(), TSK_LOGICAL_IMAGER_EXE);
File f = tskLogicalImagerExe.toFile(); File f = tskLogicalImagerExe.toFile();
if (f.exists() && f.isFile() && f.canExecute()) { if (f.exists() && f.isFile() && f.canExecute()) {
long spaceInBytes = path.getTotalSpace(); long spaceInBytes = path.getTotalSpace();
@ -265,7 +273,7 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
driveList.setSelectedIndex(0); driveList.setSelectedIndex(0);
driveListMouseClicked(null); driveListMouseClicked(null);
} else { } else {
messageLabel.setText(NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageLabel.noExternalDriveFound")); messageLabel.setText(Bundle.LogicalImagerPanel_messageLabel_noExternalDriveFound());
} }
}//GEN-LAST:event_scanButtonActionPerformed }//GEN-LAST:event_scanButtonActionPerformed
@ -296,20 +304,22 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
private void driveListSelect() { private void driveListSelect() {
String selectedStr = driveList.getSelectedValue(); String selectedStr = driveList.getSelectedValue();
String choosenDriveLetter = selectedStr.substring(0, 3); String driveLetter = selectedStr.substring(0, 3);
// Logical_Imager_DESKTOP-O71K0LB_20190506_18_46_54 File directory = new File(driveLetter);
File directory = new File(choosenDriveLetter);
// Get all files from a directory.
File[] fList = directory.listFiles(); File[] fList = directory.listFiles();
if (fList != null) { if (fList != null) {
imageTableModel = new ImageTableModel(); imageTableModel = new ImageTableModel();
int row = 0; int row = 0;
// Find all directories with name like Logical_Imager_HOSTNAME_20190506_18_46_54
// and has a sparse_image.vhd file in it
for (File file : fList) { for (File file : fList) {
if (file.isDirectory()) { if (file.isDirectory()
&& Paths.get(driveLetter, file.getName(), SPARSE_IMAGE_VHD).toFile().exists()) {
String dir = file.getName(); String dir = file.getName();
Matcher m = regex.matcher(dir); Matcher m = regex.matcher(dir);
if (m.find()) { if (m.find()) {
String imagePath = choosenDriveLetter + dir + "/sparse_image.vhd"; String imagePath = driveLetter + dir + "/" + SPARSE_IMAGE_VHD;
String hostname = m.group(1); String hostname = m.group(1);
String year = m.group(2); String year = m.group(2);
String month = m.group(3); String month = m.group(3);
@ -326,9 +336,8 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
} }
} }
} }
String label = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.selectAcquisitionFromDriveLabel.text") selectAcquisitionFromDriveLabel.setText(Bundle.LogicalImagerPanel_selectAcquisitionFromDriveLabel_text()
+ " " + choosenDriveLetter; + " " + driveLetter);
selectAcquisitionFromDriveLabel.setText(label);
imageTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); imageTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
imageTable.setModel(imageTableModel); imageTable.setModel(imageTableModel);
// If there are any images, let's select the first one // If there are any images, let's select the first one
@ -378,11 +387,7 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
* @return true if a proper image has been selected, false otherwise * @return true if a proper image has been selected, false otherwise
*/ */
public boolean validatePanel() { public boolean validatePanel() {
if (choosenImagePath != null && choosenImagePath.toFile().exists()) { return choosenImagePath != null && choosenImagePath.toFile().exists();
return true;
} else {
return false;
}
} }
public void storeSettings() { public void storeSettings() {
@ -391,33 +396,6 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
public void readSettings() { public void readSettings() {
} }
@Override
public void insertUpdate(DocumentEvent e) {
updateHelper();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateHelper();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateHelper();
}
/**
* Update functions are called by the pathTextField which has this set as
* it's DocumentEventListener. Each update function fires a property change
* to be caught by the parent panel. Additionally, the hash values will be
* enabled or disabled depending on the pathTextField input.
*/
@NbBundle.Messages({"LogicalImagerPanel.moduleErr=Module Error",
"LogicalImagerPanel.moduleErr.msg=A module caused an error listening to LogicalImagerPanel updates."
+ " See log to determine which module. Some data could be incomplete.\n"})
private void updateHelper() {
}
/** /**
* Set the focus to the pathTextField. * Set the focus to the pathTextField.
*/ */
@ -428,10 +406,22 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
return choosenImagePath; return choosenImagePath;
} }
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
private class ImageTableModel extends AbstractTableModel { private class ImageTableModel extends AbstractTableModel {
private List<String> hostnames = new ArrayList<>(); private final List<String> hostnames = new ArrayList<>();
private List<String> extractDates = new ArrayList<>(); private final List<String> extractDates = new ArrayList<>();
private List<String> imagePaths = new ArrayList<>(); private final List<String> imagePaths = new ArrayList<>();
@Override @Override
public int getRowCount() { public int getRowCount() {
@ -443,15 +433,19 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
return 2; return 2;
} }
@Messages({
"LogicalImagerPanel.imageTable.columnModel.title0=Hostname",
"LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date"
})
@Override @Override
public String getColumnName(int column) { public String getColumnName(int column) {
String colName = null; String colName = null;
switch (column) { switch (column) {
case 0: case 0:
colName = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.imageTable.columnModel.title0"); colName = Bundle.LogicalImagerPanel_imageTable_columnModel_title0();
break; break;
case 1: case 1:
colName = NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.imageTable.columnModel.title1"); colName = Bundle.LogicalImagerPanel_imageTable_columnModel_title1();
break; break;
default: default:
break; break;
@ -473,7 +467,7 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
ret = imagePaths.get(rowIndex); ret = imagePaths.get(rowIndex);
break; break;
default: default:
throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); //NON-NLS
} }
return ret; return ret;
} }
@ -496,7 +490,7 @@ public class LogicalImagerPanel extends JPanel implements DocumentListener {
imagePaths.add((String) aValue); imagePaths.add((String) aValue);
break; break;
default: default:
throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); //NON-NLS
} }
// Only show the hostname and extractDates column // Only show the hostname and extractDates column
if (columnIndex < 2) { if (columnIndex < 2) {