Autopsy  4.21.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
AddFileTypeSignaturePanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2020 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.modules.filetypeid;
20 
21 import java.io.UnsupportedEncodingException;
22 import java.nio.charset.Charset;
23 import javax.swing.DefaultComboBoxModel;
24 import javax.swing.JOptionPane;
25 import org.apache.commons.codec.DecoderException;
26 import org.apache.commons.codec.binary.Hex;
27 import org.openide.util.NbBundle;
28 import org.openide.util.NbBundle.Messages;
30 
34 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
35 class AddFileTypeSignaturePanel extends javax.swing.JPanel {
36 
37  private static final String RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem");
38  private static final String START_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem");
39  private static final String END_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem");
40  private static final String ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem");
41 
45  AddFileTypeSignaturePanel() {
46  initComponents();
47  customizeComponents();
48  }
49 
55  AddFileTypeSignaturePanel(Signature toEdit) {
56  this();
57  this.setComponentValues(toEdit);
58  }
59 
63  private void customizeComponents() {
64  setSignatureTypeComboBoxModel();
65  setOffsetRealtiveToComboBoxModel();
66  }
67 
71  private void setSignatureTypeComboBoxModel() {
72  DefaultComboBoxModel<String> sigTypeComboBoxModel = new DefaultComboBoxModel<>();
73  sigTypeComboBoxModel.addElement(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
74  sigTypeComboBoxModel.addElement(ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
75  signatureTypeComboBox.setModel(sigTypeComboBoxModel);
76  signatureTypeComboBox.setSelectedItem(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
77  }
78 
82  private void setOffsetRealtiveToComboBoxModel() {
83  DefaultComboBoxModel<String> offsetRelComboBoxModel = new DefaultComboBoxModel<>();
84  offsetRelComboBoxModel.addElement(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
85  offsetRelComboBoxModel.addElement(END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
86  offsetRelativeToComboBox.setModel(offsetRelComboBoxModel);
87  offsetRelativeToComboBox.setSelectedItem(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
88  }
89 
95  @Messages({"AddFileTypeSignaturePanel.signatureStringFail.text=Couldn't get signatures string"})
96  private void setComponentValues(Signature toEdit) {
97  if (toEdit.isRelativeToStart()) {
98  this.offsetRelativeToComboBox.setSelectedIndex(0);
99  } else {
100  this.offsetRelativeToComboBox.setSelectedIndex(1);
101  }
102  this.offsetTextField.setText(toEdit.getOffset() + "");
103  if (Signature.Type.RAW == toEdit.getType()) {
104  this.signatureTypeComboBox.setSelectedIndex(0);
105  this.signatureTextField.setText(Hex.encodeHexString(toEdit.getSignatureBytes()));
106  } else {
107  this.signatureTypeComboBox.setSelectedIndex(1);
108  try {
109  this.signatureTextField.setText(new String(toEdit.getSignatureBytes(), "UTF-8"));
110  } catch (UnsupportedEncodingException ex) {
111  JOptionPane.showMessageDialog(this,
112  ex.getLocalizedMessage(),
113  Bundle.AddFileTypeSignaturePanel_signatureStringFail_text(),
114  JOptionPane.ERROR_MESSAGE);
115  }
116  }
117  }
118 
126  Signature getSignature() {
127 
131  FileType.Signature.Type sigType = signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM ? FileType.Signature.Type.RAW : FileType.Signature.Type.ASCII;
132 
136  String sigString = signatureTextField.getText();
137 
138  if (sigString.isEmpty()) {
139  JOptionPane.showMessageDialog(this,
140  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message"),
141  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title"),
142  JOptionPane.ERROR_MESSAGE);
143 
144  return null;
145  }
146  byte[] signatureBytes;
147  if (FileType.Signature.Type.RAW == sigType) {
148  try {
149  sigString = sigString.replaceAll("\\s", ""); //NON-NLS
150  signatureBytes = Hex.decodeHex(sigString);
151  } catch (DecoderException ex) {
152  JOptionPane.showMessageDialog(this,
153  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message"),
154  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title"),
155  JOptionPane.ERROR_MESSAGE);
156  return null;
157  }
158  } else {
159  signatureBytes = sigString.getBytes(Charset.forName("UTF-8"));
160  }
161 
165  long offset;
166  boolean isRelativeToStart = offsetRelativeToComboBox.getSelectedItem() == START_OFFSET_RELATIVE_COMBO_BOX_ITEM;
167 
168  try {
169  offset = Long.parseUnsignedLong(offsetTextField.getText());
170  if (!isRelativeToStart && signatureBytes.length > offset + 1) {
171  JOptionPane.showMessageDialog(this,
172  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length"),
173  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
174  JOptionPane.ERROR_MESSAGE);
175  return null;
176  }
177  } catch (NumberFormatException ex) {
178  JOptionPane.showMessageDialog(this,
179  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message"),
180  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
181  JOptionPane.ERROR_MESSAGE);
182  return null;
183  }
184 
191  FileType.Signature signature = new FileType.Signature(signatureBytes, offset, sigType, isRelativeToStart);
192  return signature;
193  }
194 
200  @SuppressWarnings("unchecked")
201  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
202  private void initComponents() {
203 
204  offsetLabel = new javax.swing.JLabel();
205  offsetTextField = new javax.swing.JTextField();
206  offsetRelativeToComboBox = new javax.swing.JComboBox<>();
207  offsetRelativeToLabel = new javax.swing.JLabel();
208  hexPrefixLabel = new javax.swing.JLabel();
209  signatureTypeComboBox = new javax.swing.JComboBox<>();
210  signatureLabel = new javax.swing.JLabel();
211  signatureTypeLabel = new javax.swing.JLabel();
212  signatureTextField = new javax.swing.JTextField();
213 
214  org.openide.awt.Mnemonics.setLocalizedText(offsetLabel, org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.offsetLabel.text")); // NOI18N
215 
216  offsetTextField.setText(org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.offsetTextField.text")); // NOI18N
217 
218  org.openide.awt.Mnemonics.setLocalizedText(offsetRelativeToLabel, org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.offsetRelativeToLabel.text")); // NOI18N
219 
220  org.openide.awt.Mnemonics.setLocalizedText(hexPrefixLabel, org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.hexPrefixLabel.text")); // NOI18N
221 
222  signatureTypeComboBox.addActionListener(new java.awt.event.ActionListener() {
223  public void actionPerformed(java.awt.event.ActionEvent evt) {
224  signatureTypeComboBoxActionPerformed(evt);
225  }
226  });
227 
228  org.openide.awt.Mnemonics.setLocalizedText(signatureLabel, org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.signatureLabel.text")); // NOI18N
229 
230  org.openide.awt.Mnemonics.setLocalizedText(signatureTypeLabel, org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.signatureTypeLabel.text")); // NOI18N
231 
232  signatureTextField.setText(org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class, "AddFileTypeSignaturePanel.signatureTextField.text")); // NOI18N
233  signatureTextField.addActionListener(new java.awt.event.ActionListener() {
234  public void actionPerformed(java.awt.event.ActionEvent evt) {
235  signatureTextFieldActionPerformed(evt);
236  }
237  });
238 
239  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
240  this.setLayout(layout);
241  layout.setHorizontalGroup(
242  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
243  .addGroup(layout.createSequentialGroup()
244  .addContainerGap()
245  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
246  .addGroup(layout.createSequentialGroup()
247  .addComponent(signatureTypeLabel)
248  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
249  .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
250  .addGroup(layout.createSequentialGroup()
251  .addComponent(signatureLabel)
252  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
253  .addComponent(hexPrefixLabel)
254  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
255  .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
256  .addGroup(layout.createSequentialGroup()
257  .addComponent(offsetLabel)
258  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
259  .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE))
260  .addGroup(layout.createSequentialGroup()
261  .addComponent(offsetRelativeToLabel)
262  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
263  .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
264  .addContainerGap(46, Short.MAX_VALUE))
265  );
266  layout.setVerticalGroup(
267  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
268  .addGroup(layout.createSequentialGroup()
269  .addContainerGap()
270  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
271  .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
272  .addComponent(signatureTypeLabel))
273  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
274  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
275  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
276  .addComponent(hexPrefixLabel)
277  .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
278  .addComponent(signatureLabel))
279  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
280  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
281  .addComponent(offsetLabel)
282  .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
283  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
284  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
285  .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
286  .addComponent(offsetRelativeToLabel))
287  .addContainerGap())
288  );
289  }// </editor-fold>//GEN-END:initComponents
290 
291  private void signatureTypeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_signatureTypeComboBoxActionPerformed
292  if (signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM) {
293  hexPrefixLabel.setVisible(true);
294  signatureTextField.setText("0000");
295  } else {
296  hexPrefixLabel.setVisible(false);
297  signatureTextField.setText("");
298  }
299  }//GEN-LAST:event_signatureTypeComboBoxActionPerformed
300 
301  private void signatureTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_signatureTextFieldActionPerformed
302  // TODO add your handling code here:
303  }//GEN-LAST:event_signatureTextFieldActionPerformed
304 
305 
306  // Variables declaration - do not modify//GEN-BEGIN:variables
307  private javax.swing.JLabel hexPrefixLabel;
308  private javax.swing.JLabel offsetLabel;
309  private javax.swing.JComboBox<String> offsetRelativeToComboBox;
310  private javax.swing.JLabel offsetRelativeToLabel;
311  private javax.swing.JTextField offsetTextField;
312  private javax.swing.JLabel signatureLabel;
313  private javax.swing.JTextField signatureTextField;
314  private javax.swing.JComboBox<String> signatureTypeComboBox;
315  private javax.swing.JLabel signatureTypeLabel;
316  // End of variables declaration//GEN-END:variables
317 }

Copyright © 2012-2022 Basis Technology. Generated on: Tue Feb 6 2024
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.