19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
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;
54 final class ManageTagsDialog
extends javax.swing.JDialog {
56 private static final Logger LOGGER = Logger.getLogger(ManageTagsDialog.class.getName());
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."})
66 super((JFrame) WindowManager.getDefault().getMainWindow(),
67 Bundle.ManageTagDialog_title(),
70 customizeComponents();
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());
84 private void customizeComponents() {
85 lbWarnings.setText(
"");
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());
94 List<String> badTags = dbManager.getBadTags();
96 List<String> tagNames =
new ArrayList<>(badTags);
99 TagsManager.getTagDisplayNames()
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());
108 Collections.sort(tagNames);
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});
116 CheckBoxModelListener listener =
new CheckBoxModelListener(
this);
117 model.addTableModelListener(listener);
120 private void display() {
121 Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
122 setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
131 @SuppressWarnings({
"unchecked",
"rawtypes"})
133 private void initComponents() {
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();
144 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
146 org.openide.awt.Mnemonics.setLocalizedText(okButton,
org.openide.util.NbBundle.getMessage(ManageTagsDialog.class,
"ManageTagsDialog.okButton.text"));
147 okButton.addActionListener(
new java.awt.event.ActionListener() {
148 public void actionPerformed(java.awt.event.ActionEvent evt) {
149 okButtonActionPerformed(evt);
153 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(ManageTagsDialog.class,
"ManageTagsDialog.cancelButton.text"));
154 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
155 public void actionPerformed(java.awt.event.ActionEvent evt) {
156 cancelButtonActionPerformed(evt);
160 tblTagNames.setModel(
new javax.swing.table.DefaultTableModel(
168 Class[] types =
new Class [] {
169 java.lang.Object.class, java.lang.Boolean.class
171 boolean[] canEdit =
new boolean [] {
175 public Class getColumnClass(
int columnIndex) {
176 return types [columnIndex];
179 public boolean isCellEditable(
int rowIndex,
int columnIndex) {
180 return canEdit [columnIndex];
183 tagScrollArea.setViewportView(tblTagNames);
185 helpScrollPane.setBorder(null);
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));
191 helpTextArea.setLineWrap(
true);
192 helpTextArea.setRows(3);
193 helpTextArea.setWrapStyleWord(
true);
194 helpTextArea.setBorder(null);
195 helpTextArea.setFocusable(
false);
196 helpScrollPane.setViewportView(helpTextArea);
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()
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))
219 layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {cancelButton, okButton});
221 layout.setVerticalGroup(
222 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
223 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
225 .addComponent(helpScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
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))
240 private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
245 private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
251 private boolean setBadTags() {
252 List<String> badTags =
new ArrayList<>();
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);
260 badTags.add(tagName);
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.");
269 lbWarnings.setText(Bundle.ManageTagsDialog_init_failedConnection_msg());
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"})
284 javax.swing.JDialog dialog;
286 this.dialog = dialog;
291 int row = e.getFirstRow();
292 int column = e.getColumn();
294 DefaultTableModel model = (DefaultTableModel) e.getSource();
295 String tagName = (String) model.getValueAt(row, 0);
296 Boolean checked = (Boolean) model.getValueAt(row, column);
301 int dialogButton = JOptionPane.YES_NO_OPTION;
302 int dialogResult = JOptionPane.showConfirmDialog (
304 Bundle.ManageTagsDialog_updateCurrentCase_msg(),
305 Bundle.ManageTagsDialog_updateCurrentCase_title(),
307 if(dialogResult == JOptionPane.YES_OPTION){
309 dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
312 LOGGER.log(Level.SEVERE,
"Failed to apply notable status to artifacts in current case", ex);
313 JOptionPane.showMessageDialog(null, Bundle.ManageTagsDialog_updateCurrentCase_error());
315 dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
331 public void setArtifactsKnownBadByTag(String tagNameString,
Case curCase)
throws EamDbException{
333 TagName tagName = curCase.getServices().getTagsManager().getDisplayNamesToTagNamesMap().get(tagNameString);
336 List<BlackboardArtifactTag> artifactTags = curCase.getSleuthkitCase().getBlackboardArtifactTagsByTagName(tagName);
338 for(BlackboardArtifactTag bbTag:artifactTags){
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);
354 }
catch (TskCoreException ex){
355 throw new EamDbException(
"Error updating artifacts", ex);
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;
void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus)
static EamDb getInstance()
static Case getCurrentCase()
static boolean isCaseOpen()
static List< CorrelationAttribute > getCorrelationAttributeFromBlackboardArtifact(BlackboardArtifact bbArtifact, boolean addInstanceDetails, boolean checkEnabled)