diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index 2be9a9b447..bf4d5dc3c1 100644 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -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()); + } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 38f8388cc4..d91a751a1a 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -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 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java index 8d855b7aa0..ddc6c8f43b 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java @@ -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 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties index 5857deb2b9..22ad15405a 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties @@ -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: diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form index b3d33e0b2b..5ca99ba3bf 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form @@ -282,9 +282,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java index 1903729ec5..4df9b933fd 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java @@ -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 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 ); }// //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,18 +300,43 @@ 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(); }