HdXViewer capability has been added to the Hex Viewer

This commit is contained in:
U-BASIS\dsmyda 2018-12-31 14:47:39 -05:00
parent 5cc79ecce9
commit 490ea446cd
6 changed files with 105 additions and 48 deletions

View File

@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.core;
import java.nio.file.Paths;
import org.sleuthkit.autopsy.coreutils.TextConverter;
import java.util.prefs.BackingStoreException;
import org.sleuthkit.autopsy.events.MessageServiceConnectionInfo;
@ -75,6 +76,7 @@ public final class UserPreferences {
public static final String SHOW_ONLY_CURRENT_USER_TAGS = "ShowOnlyCurrentUserTags";
public static final String HIDE_CENTRAL_REPO_COMMENTS_AND_OCCURRENCES = "HideCentralRepoCommentsAndOccurrences";
public static final String DISPLAY_TRANSLATED_NAMES = "DisplayTranslatedNames";
public static final String HDX_EDITOR_PATH = "HdXEditorPath";
// Prevent instantiation.
private UserPreferences() {
@ -471,4 +473,20 @@ public final class UserPreferences {
public static void setLogFileCount(int count) {
preferences.putInt(MAX_NUM_OF_LOG_FILE, count);
}
/**
*
* @param executablePath
*/
public static void setHdXEditorPath(String executablePath) {
preferences.put(HDX_EDITOR_PATH, executablePath);
}
/**
*
* @return
*/
public static String getHdXEditorPath() {
return preferences.get(HDX_EDITOR_PATH, Paths.get("C:", "Program Files", "HxD", "HxD.exe").toString());
}
}

View File

@ -194,3 +194,33 @@ ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=For example, change fr
ViewPreferencesPanel.useBestViewerRadioButton.text=Change to the most specific file viewer
ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text=Add column in result viewer for file name translation
DataContentViewerHex.launchHxDButton.text=Launch in HxD
ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
ExternalViewerGlobalSettingsPanel.newRuleButton1.text=New Rule
ExternalViewerGlobalSettingsPanel.newRuleButton.text=New Rule
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
ExternalViewerGlobalSettingsPanel.jLabel2.text=Set launchable content viewer extensions
ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.editRuleButton.text=Edit Rule
ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=Delete Rule
ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Set aplication viewer to use for files with specific mime types/extensions:
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1=Application
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0=Mime type/Extension
AddExternalViewerRulePanel.nameLabel.text=MIME type or extension
AddExternalViewerRulePanel.browseButton.text=Browse
AddExternalViewerRulePanel.exePathTextField.text=
AddExternalViewerRulePanel.exePathLabel.text=Path of the program to use for files with this type or extension
AddExternalViewerRulePanel.extRadioButton.text=Extension
AddExternalViewerRulePanel.mimeRadioButton.text=MIME type
AddExternalViewerRulePanel.nameTextField.text=
ExternalViewerGlobalSettingsPanel.jButton2.text_1=jButton2
ExternalViewerGlobalSettingsPanel.newRuleButton1.text_1=New Rule
ExternalViewerGlobalSettingsPanel.newRuleButton.text_1=New Rule
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text_1=Browse
ExternalViewerGlobalSettingsPanel.jLabel2.text_1=Set launchable content viewer extensions
ExternalViewerGlobalSettingsPanel.jLabel1.text_1=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.HxDPath.text=C:/Program Files/HxD/HxD.exe
ExternalViewerGlobalSettingsPanel.editRuleButton.text_1=Edit Rule
ExternalViewerGlobalSettingsPanel.deleteRuleButton.text_1=Delete Rule
ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text_1=Set aplication viewer to use for files with specific mime types/extensions:
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1_1=Application
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0_1=Mime type/Extension

View File

@ -32,13 +32,12 @@ import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;
import org.openide.modules.InstalledFileLocator;
import org.openide.nodes.Node;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
import org.sleuthkit.autopsy.coreutils.ExecUtil;
import org.sleuthkit.autopsy.datamodel.ContentUtils;
import org.sleuthkit.autopsy.datamodel.DataConversion;
import org.sleuthkit.datamodel.Content;
@ -356,22 +355,33 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
private void launchHxDButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_launchHxDButtonActionPerformed
try {
File HdXExecutable = new File(UserPreferences.getHdXEditorPath());
if(!HdXExecutable.exists() || !HdXExecutable.canExecute()) {
JOptionPane.showMessageDialog(null, "Unable to launch HxD Editor. "
+ "Please set-up the HdX install location in Tools -> "
+ "Options -> External Viewer");
return;
}
String tempDirectory = Case.getCurrentCaseThrows().getTempDirectory();
File dataSourceInTempDirectory = Paths.get(tempDirectory, dataSource.getId() + dataSource.getName()).toFile();
ContentUtils.writeToFile(dataSource, dataSourceInTempDirectory);
String HdXExecutableToFind = Paths.get("HxD", "HxD64.exe").toString();
File HdXExecutable = InstalledFileLocator.getDefault().locate(HdXExecutableToFind, DataContentViewerHex.class.getPackage().getName(), false);
if (null == HdXExecutable) {
throw new IOException(String.format("Could not find HdXExecutable at %s", HdXExecutableToFind));
try {
ProcessBuilder launchHdXExecutable = new ProcessBuilder();
launchHdXExecutable.command(String.format("\"%s\" \"%s\"",
HdXExecutable.getAbsolutePath(),
dataSourceInTempDirectory.getAbsolutePath()));
launchHdXExecutable.start();
} catch (IOException ex) {
JOptionPane.showMessageDialog(null, "Unable to launch HxD Editor. "
+ "Please set-up the HdX install location in Tools -> "
+ "Options -> External Viewer");
dataSourceInTempDirectory.delete();
}
ProcessBuilder launchHdXExecutable = new ProcessBuilder();
launchHdXExecutable.command(String.format("%s \"%s\"", HdXExecutable.getAbsolutePath(), dataSourceInTempDirectory.getAbsolutePath()));
ExecUtil.execute(launchHdXExecutable);
} catch (NoCurrentCaseException | IOException ex) {
logger.log(Level.SEVERE, "Unable to launch HxD Editor", ex);
//TODO - Make pop-up appear saying there were problems attempting to launch editor
logger.log(Level.SEVERE, "Unable to copy file into temp directory", ex);
//Should we add a pop-up for this?
}
}//GEN-LAST:event_launchHxDButtonActionPerformed
@ -546,6 +556,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
goToPageLabel.setVisible(isVisible);
goToOffsetTextField.setVisible(isVisible);
goToOffsetLabel.setVisible(isVisible);
launchHxDButton.setVisible(isVisible);
}
@Override

View File

@ -124,12 +124,9 @@ ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title2_1=Title 3
ExternalViewerGlobalSettingsPanel.newRuleButton1.text=New Rule
ExternalViewerGlobalSettingsPanel.editRuleButton.text=Edit Rule
ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=Delete Rule
ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Set aplication viewer to use for files with specific mime types/extensions:
ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Add your custom rules for external viewers:
ExternalViewerGlobalSettingsPanel.newRuleButton.text=New Rule
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1=Application
ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0=Mime type/Extension
ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
ExternalViewerGlobalSettingsPanel.jLabel2.text=Set launchable content viewer extensions
ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
ExternalViewerGlobalSettingsPanel.HxDPath.text=C:/Program Files/HxD/HxD.exe
ExternalViewerGlobalSettingsPanel.jLabel2.text=Add content viewer extensions:

View File

@ -282,9 +282,6 @@
<Component class="javax.swing.JTextField" name="HxDPath">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/directorytree/Bundle.properties" key="ExternalViewerGlobalSettingsPanel.HxDPath.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabel1">

View File

@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.directorytree;
import java.awt.Color;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFileChooser;
@ -27,7 +28,7 @@ import javax.swing.table.AbstractTableModel;
import org.openide.util.NbBundle;
import org.netbeans.spi.options.OptionsPanelController;
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
import org.sleuthkit.autopsy.core.UserPreferences;
/**
* An options panel for the user to create, edit, and delete associations for
@ -39,8 +40,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
private RulesTableModel rulesTableModel;
private java.util.List<ExternalViewerRule> rules;
private static final String MODULE_NAME = ExternalViewerGlobalSettingsPanel.class.getName();
private static final String HXD_PATH_NAME = "HxDExecutablePath";
/**
* Creates new form ExternalViewerGlobalSettingsPanel
@ -171,7 +170,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
);
HxDPath.setEditable(false);
HxDPath.setText(org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, "ExternalViewerGlobalSettingsPanel.HxDPath.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, "ExternalViewerGlobalSettingsPanel.jLabel1.text")); // NOI18N
@ -245,25 +243,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
);
}// </editor-fold>//GEN-END:initComponents
private void browseHxDDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseHxDDirectoryActionPerformed
JFileChooser fileWindow = new JFileChooser();
fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
GeneralFilter exeFilter = new GeneralFilter(GeneralFilter.EXECUTABLE_EXTS, GeneralFilter.EXECUTABLE_DESC);
File HxDPathFile = new File(HxDPath.getText());
if(HxDPathFile.exists() && HxDPathFile.canExecute()) {
fileWindow.setCurrentDirectory(new File(HxDPath.getText()));
}
fileWindow.setDragEnabled(false);
fileWindow.setFileFilter(exeFilter);
fileWindow.setMultiSelectionEnabled(false);
int returnVal = fileWindow.showSaveDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File HxDExecutable = fileWindow.getSelectedFile();
HxDPath.setText(HxDExecutable.getAbsolutePath());
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
}//GEN-LAST:event_browseHxDDirectoryActionPerformed
private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
AddExternalViewerRuleDialog dialog = new AddExternalViewerRuleDialog();
AddExternalViewerRuleDialog.BUTTON_PRESSED result = dialog.getResult();
@ -321,17 +300,42 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}//GEN-LAST:event_deleteRuleButtonActionPerformed
private void browseHxDDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseHxDDirectoryActionPerformed
JFileChooser fileWindow = new JFileChooser();
fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
GeneralFilter exeFilter = new GeneralFilter(GeneralFilter.EXECUTABLE_EXTS, GeneralFilter.EXECUTABLE_DESC);
File HxDPathFile = new File(HxDPath.getText());
if(HxDPathFile.exists() && HxDPathFile.canExecute()) {
fileWindow.setCurrentDirectory(new File(HxDPath.getText()));
}
fileWindow.setDragEnabled(false);
fileWindow.setFileFilter(exeFilter);
fileWindow.setMultiSelectionEnabled(false);
int returnVal = fileWindow.showSaveDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File HxDExecutable = fileWindow.getSelectedFile();
HxDPath.setForeground(Color.BLACK);
HxDPath.setText(HxDExecutable.getAbsolutePath());
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
}//GEN-LAST:event_browseHxDDirectoryActionPerformed
@Override
public void store() {
ExternalViewerRulesManager.getInstance().setUserRules(rules);
ModuleSettings.setConfigSetting(MODULE_NAME, HXD_PATH_NAME, HxDPath.getText());
UserPreferences.setHdXEditorPath(HxDPath.getText());
}
@Override
public void load() {
rules = ExternalViewerRulesManager.getInstance().getUserRules();
if(ModuleSettings.settingExists(MODULE_NAME, HXD_PATH_NAME)) {
HxDPath.setText(ModuleSettings.getConfigSetting(MODULE_NAME, HXD_PATH_NAME));
String editorPath = UserPreferences.getHdXEditorPath();
File HdXExecutable = new File(editorPath);
if(HdXExecutable.exists() || HdXExecutable.canExecute()) {
HxDPath.setText(editorPath);
} else {
HxDPath.setForeground(Color.RED);
HxDPath.setText(editorPath);
}
rulesTableModel.fireTableDataChanged();
checkButtons();