19 package org.sleuthkit.autopsy.modules.filetypeid;
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;
34 @SuppressWarnings(
"PMD.SingularField")
35 class AddFileTypeSignaturePanel extends javax.swing.JPanel {
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");
45 AddFileTypeSignaturePanel() {
47 customizeComponents();
55 AddFileTypeSignaturePanel(Signature toEdit) {
57 this.setComponentValues(toEdit);
63 private void customizeComponents() {
64 setSignatureTypeComboBoxModel();
65 setOffsetRealtiveToComboBoxModel();
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);
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);
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);
100 this.offsetRelativeToComboBox.setSelectedIndex(1);
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()));
107 this.signatureTypeComboBox.setSelectedIndex(1);
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);
126 Signature getSignature() {
131 FileType.Signature.Type sigType = signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM ? FileType.Signature.Type.RAW : FileType.Signature.Type.ASCII;
136 String sigString = signatureTextField.getText();
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);
146 byte[] signatureBytes;
147 if (FileType.Signature.Type.RAW == sigType) {
149 sigString = sigString.replaceAll(
"\\s",
"");
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);
159 signatureBytes = sigString.getBytes(Charset.forName(
"UTF-8"));
166 boolean isRelativeToStart = offsetRelativeToComboBox.getSelectedItem() == START_OFFSET_RELATIVE_COMBO_BOX_ITEM;
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);
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);
191 FileType.Signature signature =
new FileType.Signature(signatureBytes, offset, sigType, isRelativeToStart);
200 @SuppressWarnings(
"unchecked")
202 private
void initComponents() {
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();
214 org.openide.awt.Mnemonics.setLocalizedText(offsetLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetLabel.text"));
216 offsetTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetTextField.text"));
218 org.openide.awt.Mnemonics.setLocalizedText(offsetRelativeToLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetRelativeToLabel.text"));
220 org.openide.awt.Mnemonics.setLocalizedText(hexPrefixLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.hexPrefixLabel.text"));
222 signatureTypeComboBox.addActionListener(
new java.awt.event.ActionListener() {
223 public void actionPerformed(java.awt.event.ActionEvent evt) {
224 signatureTypeComboBoxActionPerformed(evt);
228 org.openide.awt.Mnemonics.setLocalizedText(signatureLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureLabel.text"));
230 org.openide.awt.Mnemonics.setLocalizedText(signatureTypeLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTypeLabel.text"));
232 signatureTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTextField.text"));
233 signatureTextField.addActionListener(
new java.awt.event.ActionListener() {
234 public void actionPerformed(java.awt.event.ActionEvent evt) {
235 signatureTextFieldActionPerformed(evt);
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()
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))
266 layout.setVerticalGroup(
267 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
268 .addGroup(layout.createSequentialGroup()
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))
291 private void signatureTypeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
292 if (signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM) {
293 hexPrefixLabel.setVisible(
true);
294 signatureTextField.setText(
"0000");
296 hexPrefixLabel.setVisible(
false);
297 signatureTextField.setText(
"");
301 private void signatureTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
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;