/* * Autopsy Forensic Browser * * Copyright 2011 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.ingest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JMenuItem; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import org.openide.util.Lookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.corecomponentinterfaces.BlackboardResultViewer; import org.sleuthkit.autopsy.ingest.IngestMessagePanel.IngestMessageGroup; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM; import org.sleuthkit.datamodel.TskException; /** * Details panel within IngestMessagePanel */ class IngestMessageDetailsPanel extends javax.swing.JPanel { private IngestMessageMainPanel mainPanel; /** * Creates new form IngestMessageDetailsPanel */ IngestMessageDetailsPanel(IngestMessageMainPanel mainPanel) { this.mainPanel = mainPanel; initComponents(); customizeComponents(); } private void customizeComponents() { messageDetailsPane.setContentType("text/html"); //NON-NLS viewArtifactButton.setEnabled(false); viewContentButton.setEnabled(false); HTMLEditorKit kit = new HTMLEditorKit(); messageDetailsPane.setEditorKit(kit); StyleSheet styleSheet = kit.getStyleSheet(); /* * I tried to define the font-size only on body to have it inherit, it * didn't work in all cases. */ styleSheet.addRule("body {font-family:Arial;font-size:10pt;}"); //NON-NLS styleSheet.addRule("p {font-family:Arial;font-size:10pt;}"); //NON-NLS styleSheet.addRule("li {font-family:Arial;font-size:10pt;}"); //NON-NLS styleSheet.addRule("table {table-layout:fixed;}"); //NON-NLS styleSheet.addRule("td {white-space:pre-wrap;overflow:hidden;}"); //NON-NLS styleSheet.addRule("th {font-weight:bold;}"); //NON-NLS BlackboardResultViewer v = Lookup.getDefault().lookup(BlackboardResultViewer.class); v.addOnFinishedListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(BlackboardResultViewer.FINISHED_DISPLAY_EVT)) { artifactViewerFinished(); } } }); //right click messageDetailsPane.setComponentPopupMenu(rightClickMenu); ActionListener actList = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JMenuItem jmi = (JMenuItem) e.getSource(); if (jmi.equals(copyMenuItem)) { messageDetailsPane.copy(); } else if (jmi.equals(selectAllMenuItem)) { messageDetailsPane.selectAll(); } } }; copyMenuItem.addActionListener(actList); selectAllMenuItem.addActionListener(actList); } /** * 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() { rightClickMenu = new javax.swing.JPopupMenu(); copyMenuItem = new javax.swing.JMenuItem(); selectAllMenuItem = new javax.swing.JMenuItem(); jScrollPane1 = new javax.swing.JScrollPane(); messageDetailsPane = new javax.swing.JTextPane(); jToolBar1 = new javax.swing.JToolBar(); backButton = new javax.swing.JButton(); filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); viewArtifactButton = new javax.swing.JButton(); viewContentButton = new javax.swing.JButton(); copyMenuItem.setText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.copyMenuItem.text")); // NOI18N rightClickMenu.add(copyMenuItem); selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); messageDetailsPane.setEditable(false); messageDetailsPane.setBackground(new java.awt.Color(221, 221, 235)); messageDetailsPane.setBorder(null); messageDetailsPane.setContentType(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.messageDetailsPane.contentType")); // NOI18N messageDetailsPane.setFont(messageDetailsPane.getFont().deriveFont(messageDetailsPane.getFont().getStyle() & ~java.awt.Font.BOLD, 10)); messageDetailsPane.setToolTipText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.messageDetailsPane.toolTipText")); // NOI18N jScrollPane1.setViewportView(messageDetailsPane); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); backButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/ingest/btn_step_back.png"))); // NOI18N backButton.setText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.backButton.text")); // NOI18N backButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); backButton.setMargin(new java.awt.Insets(2, 2, 2, 2)); backButton.setMaximumSize(new java.awt.Dimension(23, 23)); backButton.setMinimumSize(new java.awt.Dimension(23, 23)); backButton.setPreferredSize(new java.awt.Dimension(23, 23)); backButton.setPressedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/ingest/btn_step_back_hover.png"))); // NOI18N backButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/ingest/btn_step_back_hover.png"))); // NOI18N backButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { backButtonActionPerformed(evt); } }); jToolBar1.add(backButton); jToolBar1.add(filler1); viewArtifactButton.setFont(viewArtifactButton.getFont().deriveFont(viewArtifactButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); viewArtifactButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/ingest/goto_res.png"))); // NOI18N viewArtifactButton.setText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.viewArtifactButton.text")); // NOI18N viewArtifactButton.setIconTextGap(2); viewArtifactButton.setPreferredSize(new java.awt.Dimension(93, 23)); viewArtifactButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { viewArtifactButtonActionPerformed(evt); } }); jToolBar1.add(viewArtifactButton); viewContentButton.setFont(viewContentButton.getFont().deriveFont(viewContentButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); viewContentButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/ingest/goto_dir.png"))); // NOI18N viewContentButton.setText(org.openide.util.NbBundle.getMessage(IngestMessageDetailsPanel.class, "IngestMessageDetailsPanel.viewContentButton.text")); // NOI18N viewContentButton.setIconTextGap(2); viewContentButton.setPreferredSize(new java.awt.Dimension(111, 23)); viewContentButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { viewContentButtonActionPerformed(evt); } }); jToolBar1.add(viewContentButton); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 429, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 429, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void viewContentButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewContentButtonActionPerformed viewContent(evt); }//GEN-LAST:event_viewContentButtonActionPerformed private void viewArtifactButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewArtifactButtonActionPerformed viewArtifact(evt); }//GEN-LAST:event_viewArtifactButtonActionPerformed private void backButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backButtonActionPerformed mainPanel.showMessages(); }//GEN-LAST:event_backButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton backButton; private javax.swing.JMenuItem copyMenuItem; private javax.swing.Box.Filler filler1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JTextPane messageDetailsPane; private javax.swing.JPopupMenu rightClickMenu; private javax.swing.JMenuItem selectAllMenuItem; private javax.swing.JButton viewArtifactButton; private javax.swing.JButton viewContentButton; // End of variables declaration//GEN-END:variables private void viewArtifact(java.awt.event.ActionEvent evt) { artifactViewerInvoked(); final IngestMessageGroup messageGroup = mainPanel.getMessagePanel().getSelectedMessage(); if (messageGroup != null) { BlackboardArtifact art = messageGroup.getData(); if (art != null) { BlackboardResultViewer v = Lookup.getDefault().lookup(BlackboardResultViewer.class); v.viewArtifact(art); } } } private void viewContent(java.awt.event.ActionEvent evt) { artifactViewerInvoked(); final IngestMessageGroup messageGroup = mainPanel.getMessagePanel().getSelectedMessage(); if (messageGroup != null) { BlackboardArtifact art = messageGroup.getData(); if (art != null) { BlackboardResultViewer v = Lookup.getDefault().lookup(BlackboardResultViewer.class); v.viewArtifactContent(art); } } } private void artifactViewerInvoked() { //viewArtifactButton.setEnabled(false); //viewContentButton.setEnabled(false); messageDetailsPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } private void artifactViewerFinished() { //viewArtifactButton.setEnabled(true); //viewContentButton.setEnabled(true); messageDetailsPane.setCursor(null); } /** * Display the details of a given message * * @param rowNumber index to the message to display */ void showDetails(int rowNumber) { final IngestMessageGroup messageGroup = mainPanel.getMessagePanel().getMessageGroup(rowNumber); if (messageGroup != null) { String details = messageGroup.getDetails(); if (details != null) { StringBuilder b = new StringBuilder(); if (details.startsWith("<html><body>") == false) { //NON-NLS b.append("<html><body>"); //NON-NLS b.append(details); b.append("</body></html>"); //NON-NLS } else { b.append(details); } this.messageDetailsPane.setText(b.toString()); } else { this.messageDetailsPane.setText(""); } //show artifact/content only for a message group with a single message BlackboardArtifact artifact = messageGroup.getData();; if (artifact != null && messageGroup.getCount() == 1) { viewArtifactButton.setEnabled(true); //check file type long objId = artifact.getObjectID(); AbstractFile file = null; try { file = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId); } catch (TskException ex) { } if (file == null) { viewContentButton.setEnabled(false); } else if (!file.getType().equals(TSK_DB_FILES_TYPE_ENUM.FS)) { viewContentButton.setEnabled(false); } else { viewContentButton.setEnabled(true); } } else { viewArtifactButton.setEnabled(false); viewContentButton.setEnabled(false); } } else { viewArtifactButton.setEnabled(false); viewContentButton.setEnabled(false); messageDetailsPane.setText(""); } } }