Autopsy  4.5.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
ManageTagsDialog.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2015-2017 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
20 
21 import java.awt.Cursor;
22 import java.awt.Dimension;
23 import java.awt.Toolkit;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.logging.Level;
28 import java.util.stream.Collectors;
29 import javax.swing.JFrame;
30 import javax.swing.table.DefaultTableModel;
31 import javax.swing.event.TableModelEvent;
32 import javax.swing.event.TableModelListener;
33 import javax.swing.JOptionPane;
34 import org.openide.util.NbBundle.Messages;
35 import org.openide.windows.WindowManager;
43 import org.sleuthkit.datamodel.TskCoreException;
44 import org.sleuthkit.datamodel.BlackboardArtifactTag;
45 import org.sleuthkit.datamodel.TagName;
46 import org.sleuthkit.datamodel.ContentTag;
47 import org.sleuthkit.datamodel.TskData;
48 
54 final class ManageTagsDialog extends javax.swing.JDialog {
55 
56  private static final Logger LOGGER = Logger.getLogger(ManageTagsDialog.class.getName());
57 
63  @Messages({"ManageTagDialog.title=Manage Tags",
64  "ManageTagDialog.tagInfo.text=Select the tags that cause files and results to be recorded in the central repository. Additional tags can be created in the Tags options panel."})
65  ManageTagsDialog() {
66  super((JFrame) WindowManager.getDefault().getMainWindow(),
67  Bundle.ManageTagDialog_title(),
68  true); // NON-NLS
69  initComponents();
70  customizeComponents();
71  setupHelpTextArea();
72  display();
73  }
74 
75 
76  @Messages({"ManageTagsDialog.init.failedConnection.msg=Cannot connect to central cepository.",
77  "ManageTagsDialog.init.failedGettingTags.msg=Unable to retrieve list of tags.",
78  "ManageTagsDialog.tagColumn.header.text=Tags",
79  "ManageTagsDialog.notableColumn.header.text=Notable"})
80  private void setupHelpTextArea() {
81  helpTextArea.setText(Bundle.ManageTagDialog_tagInfo_text());
82  }
83 
84  private void customizeComponents() {
85  lbWarnings.setText("");
86  EamDb dbManager;
87  try {
88  dbManager = EamDb.getInstance();
89  } catch (EamDbException ex) {
90  LOGGER.log(Level.SEVERE, "Failed to connect to central repository database.");
91  lbWarnings.setText(Bundle.ManageTagsDialog_init_failedConnection_msg());
92  return;
93  }
94  List<String> badTags = dbManager.getBadTags();
95 
96  List<String> tagNames = new ArrayList<>(badTags);
97  try {
98  tagNames.addAll(
99  TagsManager.getTagDisplayNames()
100  .stream()
101  .filter(tagName -> !badTags.contains(tagName))
102  .collect(Collectors.toList()));
103  } catch (TskCoreException ex) {
104  LOGGER.log(Level.WARNING, "Could not get list of tags in case", ex);
105  lbWarnings.setText(Bundle.ManageTagsDialog_init_failedGettingTags_msg());
106  }
107 
108  Collections.sort(tagNames);
109 
110  DefaultTableModel model = (DefaultTableModel) tblTagNames.getModel();
111  model.setColumnIdentifiers(new String[] {Bundle.ManageTagsDialog_tagColumn_header_text(), Bundle.ManageTagsDialog_notableColumn_header_text()});
112  for (String tagName : tagNames) {
113  boolean enabled = badTags.contains(tagName);
114  model.addRow(new Object[]{tagName, enabled});
115  }
116  CheckBoxModelListener listener = new CheckBoxModelListener(this);
117  model.addTableModelListener(listener);
118  }
119 
120  private void display() {
121  Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
122  setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
123  setVisible(true);
124  }
125 
131  @SuppressWarnings({"unchecked", "rawtypes"})
132  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
133  private void initComponents() {
134 
135  buttonGroup1 = new javax.swing.ButtonGroup();
136  okButton = new javax.swing.JButton();
137  cancelButton = new javax.swing.JButton();
138  tagScrollArea = new javax.swing.JScrollPane();
139  tblTagNames = new javax.swing.JTable();
140  lbWarnings = new javax.swing.JLabel();
141  helpScrollPane = new javax.swing.JScrollPane();
142  helpTextArea = new javax.swing.JTextArea();
143 
144  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
145 
146  org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(ManageTagsDialog.class, "ManageTagsDialog.okButton.text")); // NOI18N
147  okButton.addActionListener(new java.awt.event.ActionListener() {
148  public void actionPerformed(java.awt.event.ActionEvent evt) {
149  okButtonActionPerformed(evt);
150  }
151  });
152 
153  org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(ManageTagsDialog.class, "ManageTagsDialog.cancelButton.text")); // NOI18N
154  cancelButton.addActionListener(new java.awt.event.ActionListener() {
155  public void actionPerformed(java.awt.event.ActionEvent evt) {
156  cancelButtonActionPerformed(evt);
157  }
158  });
159 
160  tblTagNames.setModel(new javax.swing.table.DefaultTableModel(
161  new Object [][] {
162 
163  },
164  new String [] {
165  "", ""
166  }
167  ) {
168  Class[] types = new Class [] {
169  java.lang.Object.class, java.lang.Boolean.class
170  };
171  boolean[] canEdit = new boolean [] {
172  false, true
173  };
174 
175  public Class getColumnClass(int columnIndex) {
176  return types [columnIndex];
177  }
178 
179  public boolean isCellEditable(int rowIndex, int columnIndex) {
180  return canEdit [columnIndex];
181  }
182  });
183  tagScrollArea.setViewportView(tblTagNames);
184 
185  helpScrollPane.setBorder(null);
186 
187  helpTextArea.setEditable(false);
188  helpTextArea.setBackground(new java.awt.Color(240, 240, 240));
189  helpTextArea.setColumns(20);
190  helpTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
191  helpTextArea.setLineWrap(true);
192  helpTextArea.setRows(3);
193  helpTextArea.setWrapStyleWord(true);
194  helpTextArea.setBorder(null);
195  helpTextArea.setFocusable(false);
196  helpScrollPane.setViewportView(helpTextArea);
197 
198  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
199  getContentPane().setLayout(layout);
200  layout.setHorizontalGroup(
201  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
202  .addGroup(layout.createSequentialGroup()
203  .addContainerGap()
204  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
205  .addGroup(layout.createSequentialGroup()
206  .addGap(0, 0, Short.MAX_VALUE)
207  .addComponent(okButton)
208  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
209  .addComponent(cancelButton))
210  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
211  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
212  .addComponent(helpScrollPane, javax.swing.GroupLayout.Alignment.LEADING)
213  .addComponent(tagScrollArea, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
214  .addComponent(lbWarnings, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
215  .addGap(2, 2, 2)))
216  .addContainerGap())
217  );
218 
219  layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelButton, okButton});
220 
221  layout.setVerticalGroup(
222  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
223  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
224  .addContainerGap()
225  .addComponent(helpScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
226  .addGap(0, 0, 0)
227  .addComponent(tagScrollArea, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE)
228  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
229  .addComponent(lbWarnings, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
230  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
231  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
232  .addComponent(okButton)
233  .addComponent(cancelButton))
234  .addContainerGap())
235  );
236 
237  pack();
238  }// </editor-fold>//GEN-END:initComponents
239 
240  private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
241  dispose();
242  }//GEN-LAST:event_cancelButtonActionPerformed
243 
244 
245  private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
246  if (setBadTags()) {
247  dispose();
248  }
249  }//GEN-LAST:event_okButtonActionPerformed
250 
251  private boolean setBadTags() {
252  List<String> badTags = new ArrayList<>();
253 
254  DefaultTableModel model = (DefaultTableModel) tblTagNames.getModel();
255  for (int i = 0; i < model.getRowCount(); ++i) {
256  String tagName = (String) model.getValueAt(i, 0);
257  boolean enabled = (boolean) model.getValueAt(i, 1);
258 
259  if (enabled) {
260  badTags.add(tagName);
261  }
262  }
263  try {
264  EamDb dbManager = EamDb.getInstance();
265  dbManager.setBadTags(badTags);
266  dbManager.saveSettings();
267  } catch (EamDbException ex) {
268  LOGGER.log(Level.SEVERE, "Failed to connect to central repository database."); // NON-NLS
269  lbWarnings.setText(Bundle.ManageTagsDialog_init_failedConnection_msg());
270  return false;
271  }
272  return true;
273  }
274 
279  public class CheckBoxModelListener implements TableModelListener {
280  @Messages({"ManageTagsDialog.updateCurrentCase.msg=Mark as notable any files/results in the current case that have this tag?",
281  "ManageTagsDialog.updateCurrentCase.title=Update current case?",
282  "ManageTagsDialog.updateCurrentCase.error=Error updating existing central repository entries"})
283 
284  javax.swing.JDialog dialog;
285  public CheckBoxModelListener(javax.swing.JDialog dialog){
286  this.dialog = dialog;
287  }
288 
289  @Override
290  public void tableChanged(TableModelEvent e) {
291  int row = e.getFirstRow();
292  int column = e.getColumn();
293  if (column == 1) {
294  DefaultTableModel model = (DefaultTableModel) e.getSource();
295  String tagName = (String) model.getValueAt(row, 0);
296  Boolean checked = (Boolean) model.getValueAt(row, column);
297  if (checked) {
298 
299  // Don't do anything if there's no case open
300  if(Case.isCaseOpen()){
301  int dialogButton = JOptionPane.YES_NO_OPTION;
302  int dialogResult = JOptionPane.showConfirmDialog (
303  null,
304  Bundle.ManageTagsDialog_updateCurrentCase_msg(),
305  Bundle.ManageTagsDialog_updateCurrentCase_title(),
306  dialogButton);
307  if(dialogResult == JOptionPane.YES_OPTION){
308  try{
309  dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
310  setArtifactsKnownBadByTag(tagName, Case.getCurrentCase());
311  } catch (EamDbException ex) {
312  LOGGER.log(Level.SEVERE, "Failed to apply notable status to artifacts in current case", ex);
313  JOptionPane.showMessageDialog(null, Bundle.ManageTagsDialog_updateCurrentCase_error());
314  } finally {
315  dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
316  }
317  }
318  }
319  }
320  }
321  }
322  }
323 
331  public void setArtifactsKnownBadByTag(String tagNameString, Case curCase) throws EamDbException{
332  try{
333  TagName tagName = curCase.getServices().getTagsManager().getDisplayNamesToTagNamesMap().get(tagNameString);
334 
335  // First find any matching artifacts
336  List<BlackboardArtifactTag> artifactTags = curCase.getSleuthkitCase().getBlackboardArtifactTagsByTagName(tagName);
337 
338  for(BlackboardArtifactTag bbTag:artifactTags){
339  List<CorrelationAttribute> convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbTag.getArtifact(), true, true);
340  for (CorrelationAttribute eamArtifact : convertedArtifacts) {
341  EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact,TskData.FileKnown.BAD);
342  }
343  }
344 
345  // Now search for files
346  List<ContentTag> fileTags = curCase.getSleuthkitCase().getContentTagsByTagName(tagName);
347  for(ContentTag contentTag:fileTags){
348  final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(),
349  TskData.FileKnown.BAD, "");
350  if(eamArtifact != null){
351  EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, TskData.FileKnown.BAD);
352  }
353  }
354  } catch (TskCoreException ex){
355  throw new EamDbException("Error updating artifacts", ex);
356  }
357 
358  }
359 
360  // Variables declaration - do not modify//GEN-BEGIN:variables
361  private javax.swing.ButtonGroup buttonGroup1;
362  private javax.swing.JButton cancelButton;
363  private javax.swing.JScrollPane helpScrollPane;
364  private javax.swing.JTextArea helpTextArea;
365  private javax.swing.JLabel lbWarnings;
366  private javax.swing.JButton okButton;
367  private javax.swing.JScrollPane tagScrollArea;
368  private javax.swing.JTable tblTagNames;
369  // End of variables declaration//GEN-END:variables
370 }
void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus)
static List< CorrelationAttribute > getCorrelationAttributeFromBlackboardArtifact(BlackboardArtifact bbArtifact, boolean addInstanceDetails, boolean checkEnabled)

Copyright © 2012-2016 Basis Technology. Generated on: Mon Nov 20 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.