19 package org.sleuthkit.autopsy.modules.filetypeid;
21 import java.util.ArrayList;
22 import java.util.List;
23 import javax.swing.DefaultListModel;
24 import javax.swing.JOptionPane;
25 import javax.swing.event.ListSelectionEvent;
26 import javax.swing.event.ListSelectionListener;
27 import org.apache.commons.lang.ArrayUtils;
28 import org.apache.commons.lang3.StringUtils;
29 import org.openide.util.NbBundle;
30 import org.openide.util.NbBundle.Messages;
38 @Messages(
"AddFileTypePanel.mimeFormatLabel.text=Form of MIME type should be: media type/media subtype")
39 @SuppressWarnings(
"PMD.SingularField")
40 class AddFileTypePanel extends javax.swing.JPanel {
42 private static final long serialVersionUID = 1L;
44 private AddFileTypeSignatureDialog addSigDialog;
45 private DefaultListModel<FileType.Signature> signaturesListModel;
52 this.signaturesListModel =
new DefaultListModel<>();
53 this.signatureList.setModel(signaturesListModel);
54 this.addTypeListSelectionListener();
67 AddFileTypePanel(FileType toEdit) {
69 this.setComponentValues(toEdit);
77 private void setComponentValues(FileType toEdit) {
78 this.mimeTypeTextField.setText(toEdit.getMimeType());
79 for (Signature sig : toEdit.getSignatures()) {
80 this.signaturesListModel.addElement(sig);
91 @Messages({
"AddMimeTypePanel.emptySigList.message=Must have at least one signature.",
92 "AddMimeTypePanel.emptySigList.title=Invalid Signature List",
93 "AddMimeTypePanel.emptySetName.message=Interesting files set name is required if alert is requested.",
94 "AddMimeTypePanel.emptySetName.title=Missing Interesting Files Set Name",
95 "# {0} - media subtype",
96 "AddFileTypePanel.nonStandardMIMEType.message="
97 +
"MIME type must be of form: media type/media subtype. Custom/{0} has been suggested instead.",
99 "AddFileTypePanel.containsIllegalCharacter.message=Invalid character in MIME type, {0} has been suggested instead",
100 "AddFileTypePanel.containsIllegalCharacter.title=Invalid Character in MIME Type",
101 "AddFileTypePanel.nonStandardMIMEType.title=Non-standard MIME Type"})
103 FileType getFileType() {
104 String typeName = mimeTypeTextField.getText();
107 if (typeName.isEmpty()) {
108 JOptionPane.showMessageDialog(
this,
109 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message"),
110 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title"),
111 JOptionPane.ERROR_MESSAGE);
115 if (typeName.contains(
"\'")) {
116 typeName = typeName.replaceAll(
"[\\']",
"");
117 JOptionPane.showMessageDialog(
this,
118 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.containsIllegalCharacter.message", typeName),
119 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.containsIllegalCharacter.title"),
120 JOptionPane.WARNING_MESSAGE);
121 mimeTypeTextField.setText(typeName);
126 String[] splitName = typeName.split(
"/");
127 if (splitName.length < 2 || splitName[0].isEmpty()) {
128 JOptionPane.showMessageDialog(
this,
129 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.nonStandardMIMEType.message", typeName),
130 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.nonStandardMIMEType.title"),
131 JOptionPane.WARNING_MESSAGE);
132 mimeTypeTextField.setText(
"custom/" + typeName);
138 if (!StringUtils.join(ArrayUtils.subarray(splitName, 0, splitName.length),
"/").equals(typeName)) {
139 String rejoinedMimeType = StringUtils.join(ArrayUtils.subarray(splitName, 0, splitName.length),
"/");
140 JOptionPane.showMessageDialog(
this,
141 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.nonStandardMIMEType.message", rejoinedMimeType),
142 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"AddFileTypePanel.nonStandardMIMEType.title"),
143 JOptionPane.WARNING_MESSAGE);
144 mimeTypeTextField.setText(rejoinedMimeType);
147 if (this.signaturesListModel.isEmpty()) {
148 JOptionPane.showMessageDialog(
this,
149 Bundle.AddMimeTypePanel_emptySigList_message(),
150 Bundle.AddMimeTypePanel_emptySigList_title(),
151 JOptionPane.ERROR_MESSAGE);
154 List<Signature> sigList =
new ArrayList<>();
155 for (
int i = 0; i < this.signaturesListModel.getSize(); i++) {
156 sigList.add(this.signaturesListModel.elementAt(i));
160 if (this.postHitCheckBox.isSelected()) {
161 if (this.setNameTextField.getText().isEmpty()) {
162 JOptionPane.showMessageDialog(
this,
163 Bundle.AddMimeTypePanel_emptySetName_message(),
164 Bundle.AddMimeTypePanel_emptySetName_title(),
165 JOptionPane.ERROR_MESSAGE);
169 setName = this.setNameTextField.getText();
171 return new FileType(typeName, sigList, this.postHitCheckBox.isSelected(), setName);
178 private void addTypeListSelectionListener() {
179 this.signatureList.addListSelectionListener(
new ListSelectionListener() {
181 public void valueChanged(ListSelectionEvent e) {
182 if (e.getValueIsAdjusting() ==
false) {
194 private void enableButtons() {
195 if (signatureList.getSelectedIndex() == -1) {
196 editSigButton.setEnabled(
false);
197 deleteSigButton.setEnabled(
false);
199 editSigButton.setEnabled(
true);
200 deleteSigButton.setEnabled(
true);
204 boolean hasSignature() {
205 return !this.signaturesListModel.isEmpty();
213 @SuppressWarnings(
"unchecked")
215 private
void initComponents() {
217 editSigButton =
new javax.swing.JButton();
218 deleteSigButton =
new javax.swing.JButton();
219 mimeTypeLabel =
new javax.swing.JLabel();
220 jScrollPane1 =
new javax.swing.JScrollPane();
221 signatureList =
new javax.swing.JList<>();
222 mimeTypeTextField =
new javax.swing.JTextField();
223 addSigButton =
new javax.swing.JButton();
224 jLabel1 =
new javax.swing.JLabel();
225 postHitCheckBox =
new javax.swing.JCheckBox();
226 setNameLabel =
new javax.swing.JLabel();
227 setNameTextField =
new javax.swing.JTextField();
228 mimeFormatLabel =
new javax.swing.JLabel();
230 editSigButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png")));
231 org.openide.awt.Mnemonics.setLocalizedText(editSigButton,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.editSigButton.text"));
232 editSigButton.addActionListener(
new java.awt.event.ActionListener() {
233 public void actionPerformed(java.awt.event.ActionEvent evt) {
234 editSigButtonActionPerformed(evt);
238 deleteSigButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
239 org.openide.awt.Mnemonics.setLocalizedText(deleteSigButton,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.deleteSigButton.text"));
240 deleteSigButton.addActionListener(
new java.awt.event.ActionListener() {
241 public void actionPerformed(java.awt.event.ActionEvent evt) {
242 deleteSigButtonActionPerformed(evt);
246 mimeTypeLabel.setFont(mimeTypeLabel.getFont().deriveFont(mimeTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
247 org.openide.awt.Mnemonics.setLocalizedText(mimeTypeLabel,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.mimeTypeLabel.text"));
249 signatureList.setModel(
new javax.swing.AbstractListModel<FileType.Signature>() {
250 Signature[] signatures = {};
251 public int getSize() {
return signatures.length; }
252 public Signature getElementAt(
int i) {
return signatures[i]; }
254 jScrollPane1.setViewportView(signatureList);
256 mimeTypeTextField.setFont(mimeTypeTextField.getFont().deriveFont(mimeTypeTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
257 mimeTypeTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.mimeTypeTextField.text"));
259 addSigButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
260 org.openide.awt.Mnemonics.setLocalizedText(addSigButton,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.addSigButton.text"));
261 addSigButton.addActionListener(
new java.awt.event.ActionListener() {
262 public void actionPerformed(java.awt.event.ActionEvent evt) {
263 addSigButtonActionPerformed(evt);
267 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.jLabel1.text"));
269 org.openide.awt.Mnemonics.setLocalizedText(postHitCheckBox,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.postHitCheckBox.text"));
270 postHitCheckBox.addActionListener(
new java.awt.event.ActionListener() {
271 public void actionPerformed(java.awt.event.ActionEvent evt) {
272 postHitCheckBoxActionPerformed(evt);
276 org.openide.awt.Mnemonics.setLocalizedText(setNameLabel,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.setNameLabel.text"));
277 setNameLabel.setEnabled(postHitCheckBox.isSelected());
279 setNameTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.setNameTextField.text"));
280 setNameTextField.setEnabled(postHitCheckBox.isSelected());
282 org.openide.awt.Mnemonics.setLocalizedText(mimeFormatLabel,
org.openide.util.NbBundle.getMessage(AddFileTypePanel.class,
"AddFileTypePanel.mimeFormatLabel.text"));
284 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
285 this.setLayout(layout);
286 layout.setHorizontalGroup(
287 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
288 .addGroup(layout.createSequentialGroup()
290 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
291 .addGroup(layout.createSequentialGroup()
292 .addComponent(mimeTypeLabel)
294 .addComponent(mimeTypeTextField))
295 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
296 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
298 .addComponent(addSigButton)
299 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
300 .addComponent(editSigButton)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
302 .addComponent(deleteSigButton))
303 .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 393, javax.swing.GroupLayout.PREFERRED_SIZE))
304 .addGroup(layout.createSequentialGroup()
306 .addComponent(setNameLabel)
307 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
308 .addComponent(setNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)))
309 .addGroup(layout.createSequentialGroup()
310 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
311 .addComponent(jLabel1)
312 .addComponent(postHitCheckBox))
313 .addGap(0, 0, Short.MAX_VALUE))
314 .addGroup(layout.createSequentialGroup()
316 .addComponent(mimeFormatLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
319 layout.setVerticalGroup(
320 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
321 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
323 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
324 .addComponent(mimeTypeLabel)
325 .addComponent(mimeTypeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
326 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
327 .addComponent(mimeFormatLabel)
328 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
329 .addComponent(jLabel1)
331 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
332 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
333 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
334 .addComponent(addSigButton)
335 .addComponent(editSigButton)
336 .addComponent(deleteSigButton))
337 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
338 .addComponent(postHitCheckBox)
339 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
340 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
341 .addComponent(setNameLabel)
342 .addComponent(setNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
343 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
347 private void editSigButtonActionPerformed(java.awt.event.ActionEvent evt) {
348 if (evt.getSource().equals(this.editSigButton) && this.signatureList.getSelectedValue() != null) {
349 int selected = this.signatureList.getSelectedIndex();
350 this.addSigDialog =
new AddFileTypeSignatureDialog(this.signatureList.getSelectedValue());
351 if (addSigDialog.getResult() == BUTTON_PRESSED.OK) {
352 signaturesListModel.removeElementAt(selected);
353 this.signaturesListModel.add(selected, this.addSigDialog.getSignature());
358 private void deleteSigButtonActionPerformed(java.awt.event.ActionEvent evt) {
359 if (this.signatureList.getSelectedIndex() != -1) {
360 signaturesListModel.removeElementAt(this.signatureList.getSelectedIndex());
361 if (!this.signaturesListModel.isEmpty()) {
362 signatureList.setSelectedIndex(0);
364 firePropertyChange(SIG_LIST_CHANGED.toString(), null, null);
368 private void addSigButtonActionPerformed(java.awt.event.ActionEvent evt) {
369 if (evt.getSource().equals(this.addSigButton)) {
370 this.addSigDialog =
new AddFileTypeSignatureDialog();
371 if (addSigDialog.getResult() == AddFileTypeSignatureDialog.BUTTON_PRESSED.OK) {
372 signaturesListModel.addElement(this.addSigDialog.getSignature());
374 firePropertyChange(SIG_LIST_CHANGED.toString(), null, null);
378 private void postHitCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
379 if (evt.getSource().equals(postHitCheckBox)) {
380 this.setNameLabel.setEnabled(postHitCheckBox.isSelected());
381 this.setNameTextField.setEnabled(postHitCheckBox.isSelected());
387 private javax.swing.JButton addSigButton;
388 private javax.swing.JButton deleteSigButton;
389 private javax.swing.JButton editSigButton;
390 private javax.swing.JLabel jLabel1;
391 private javax.swing.JScrollPane jScrollPane1;
392 private javax.swing.JLabel mimeFormatLabel;
393 private javax.swing.JLabel mimeTypeLabel;
394 private javax.swing.JTextField mimeTypeTextField;
395 private javax.swing.JCheckBox postHitCheckBox;
396 private javax.swing.JLabel setNameLabel;
397 private javax.swing.JTextField setNameTextField;
398 private javax.swing.JList<FileType.Signature> signatureList;