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 javax.xml.bind.DatatypeConverter;
26 import org.openide.util.NbBundle;
27 import org.openide.util.NbBundle.Messages;
33 class AddFileTypeSignaturePanel
extends javax.swing.JPanel {
35 private static final String RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem");
36 private static final String START_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem");
37 private static final String END_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem");
38 private static final String ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem");
43 AddFileTypeSignaturePanel() {
45 customizeComponents();
53 AddFileTypeSignaturePanel(Signature toEdit) {
55 this.setComponentValues(toEdit);
61 private void customizeComponents() {
62 setSignatureTypeComboBoxModel();
63 setOffsetRealtiveToComboBoxModel();
69 private void setSignatureTypeComboBoxModel() {
70 DefaultComboBoxModel<String> sigTypeComboBoxModel =
new DefaultComboBoxModel<>();
71 sigTypeComboBoxModel.addElement(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
72 sigTypeComboBoxModel.addElement(ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
73 signatureTypeComboBox.setModel(sigTypeComboBoxModel);
74 signatureTypeComboBox.setSelectedItem(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
80 private void setOffsetRealtiveToComboBoxModel() {
81 DefaultComboBoxModel<String> offsetRelComboBoxModel =
new DefaultComboBoxModel<>();
82 offsetRelComboBoxModel.addElement(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
83 offsetRelComboBoxModel.addElement(END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
84 offsetRelativeToComboBox.setModel(offsetRelComboBoxModel);
85 offsetRelativeToComboBox.setSelectedItem(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
93 @Messages({
"AddFileTypeSignaturePanel.signatureStringFail.text=Couldn't get signatures string"})
94 private void setComponentValues(Signature toEdit) {
95 if (toEdit.isRelativeToStart()) {
96 this.offsetRelativeToComboBox.setSelectedIndex(0);
98 this.offsetRelativeToComboBox.setSelectedIndex(1);
100 this.offsetTextField.setText(toEdit.getOffset() +
"");
101 if (Signature.Type.RAW == toEdit.getType()) {
102 this.signatureTypeComboBox.setSelectedIndex(0);
103 this.signatureTextField.setText(DatatypeConverter.printHexBinary(toEdit.getSignatureBytes()));
105 this.signatureTypeComboBox.setSelectedIndex(1);
107 this.signatureTextField.setText(
new String(toEdit.getSignatureBytes(),
"UTF-8"));
108 }
catch (UnsupportedEncodingException ex) {
109 JOptionPane.showMessageDialog(null,
110 ex.getLocalizedMessage(),
111 Bundle.AddFileTypeSignaturePanel_signatureStringFail_text(),
112 JOptionPane.ERROR_MESSAGE);
124 Signature getSignature() {
129 FileType.Signature.Type sigType = signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM ? FileType.Signature.Type.RAW : FileType.Signature.Type.ASCII;
134 String sigString = signatureTextField.getText();
136 if (sigString.isEmpty()) {
137 JOptionPane.showMessageDialog(null,
138 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message"),
139 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title"),
140 JOptionPane.ERROR_MESSAGE);
144 byte[] signatureBytes;
145 if (FileType.Signature.Type.RAW == sigType) {
147 sigString = sigString.replaceAll(
"\\s",
"");
148 signatureBytes = DatatypeConverter.parseHexBinary(sigString);
149 }
catch (IllegalArgumentException ex) {
150 JOptionPane.showMessageDialog(null,
151 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message"),
152 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title"),
153 JOptionPane.ERROR_MESSAGE);
157 signatureBytes = sigString.getBytes(Charset.forName(
"UTF-8"));
164 boolean isRelativeToStart = offsetRelativeToComboBox.getSelectedItem() == START_OFFSET_RELATIVE_COMBO_BOX_ITEM;
167 offset = Long.parseUnsignedLong(offsetTextField.getText());
168 if (!isRelativeToStart && signatureBytes.length > offset + 1) {
169 JOptionPane.showMessageDialog(null,
170 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length"),
171 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
172 JOptionPane.ERROR_MESSAGE);
175 }
catch (NumberFormatException ex) {
176 JOptionPane.showMessageDialog(null,
177 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message"),
178 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
179 JOptionPane.ERROR_MESSAGE);
189 FileType.Signature signature =
new FileType.Signature(signatureBytes, offset, sigType, isRelativeToStart);
198 @SuppressWarnings(
"unchecked")
200 private
void initComponents() {
202 offsetLabel =
new javax.swing.JLabel();
203 offsetTextField =
new javax.swing.JTextField();
204 offsetRelativeToComboBox =
new javax.swing.JComboBox<String>();
205 offsetRelativeToLabel =
new javax.swing.JLabel();
206 hexPrefixLabel =
new javax.swing.JLabel();
207 signatureTypeComboBox =
new javax.swing.JComboBox<String>();
208 signatureLabel =
new javax.swing.JLabel();
209 signatureTypeLabel =
new javax.swing.JLabel();
210 signatureTextField =
new javax.swing.JTextField();
212 offsetLabel.setFont(offsetLabel.getFont().deriveFont(offsetLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
213 org.openide.awt.Mnemonics.setLocalizedText(offsetLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetLabel.text"));
215 offsetTextField.setFont(offsetTextField.getFont().deriveFont(offsetTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
216 offsetTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetTextField.text"));
218 offsetRelativeToComboBox.setFont(offsetRelativeToComboBox.getFont().deriveFont(offsetRelativeToComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
220 offsetRelativeToLabel.setFont(offsetRelativeToLabel.getFont().deriveFont(offsetRelativeToLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
221 org.openide.awt.Mnemonics.setLocalizedText(offsetRelativeToLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetRelativeToLabel.text"));
223 hexPrefixLabel.setFont(hexPrefixLabel.getFont().deriveFont(hexPrefixLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
224 org.openide.awt.Mnemonics.setLocalizedText(hexPrefixLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.hexPrefixLabel.text"));
226 signatureTypeComboBox.setFont(signatureTypeComboBox.getFont().deriveFont(signatureTypeComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
227 signatureTypeComboBox.addActionListener(
new java.awt.event.ActionListener() {
228 public void actionPerformed(java.awt.event.ActionEvent evt) {
229 signatureTypeComboBoxActionPerformed(evt);
233 signatureLabel.setFont(signatureLabel.getFont().deriveFont(signatureLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
234 org.openide.awt.Mnemonics.setLocalizedText(signatureLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureLabel.text"));
236 signatureTypeLabel.setFont(signatureTypeLabel.getFont().deriveFont(signatureTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
237 org.openide.awt.Mnemonics.setLocalizedText(signatureTypeLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTypeLabel.text"));
239 signatureTextField.setFont(signatureTextField.getFont().deriveFont(signatureTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
240 signatureTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTextField.text"));
241 signatureTextField.addActionListener(
new java.awt.event.ActionListener() {
242 public void actionPerformed(java.awt.event.ActionEvent evt) {
243 signatureTextFieldActionPerformed(evt);
247 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
248 this.setLayout(layout);
249 layout.setHorizontalGroup(
250 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
251 .addGroup(layout.createSequentialGroup()
253 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
254 .addGroup(layout.createSequentialGroup()
255 .addComponent(signatureTypeLabel)
256 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
257 .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE))
258 .addGroup(layout.createSequentialGroup()
259 .addComponent(signatureLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
260 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
261 .addComponent(hexPrefixLabel)
262 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
263 .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
264 .addGroup(layout.createSequentialGroup()
265 .addComponent(offsetLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
266 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
267 .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE))
268 .addGroup(layout.createSequentialGroup()
269 .addComponent(offsetRelativeToLabel)
270 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
271 .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
272 .addContainerGap(26, Short.MAX_VALUE))
274 layout.setVerticalGroup(
275 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
276 .addGroup(layout.createSequentialGroup()
278 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
279 .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
280 .addComponent(signatureTypeLabel))
281 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
282 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
283 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
284 .addComponent(hexPrefixLabel)
285 .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
286 .addComponent(signatureLabel))
287 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
288 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
289 .addComponent(offsetLabel)
290 .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
291 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
292 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
293 .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
294 .addComponent(offsetRelativeToLabel))
295 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
299 private void signatureTypeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
300 if (signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM) {
301 hexPrefixLabel.setVisible(
true);
302 signatureTextField.setText(
"0000");
304 hexPrefixLabel.setVisible(
false);
305 signatureTextField.setText(
"");
309 private void signatureTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
315 private javax.swing.JLabel hexPrefixLabel;
316 private javax.swing.JLabel offsetLabel;
317 private javax.swing.JComboBox<String> offsetRelativeToComboBox;
318 private javax.swing.JLabel offsetRelativeToLabel;
319 private javax.swing.JTextField offsetTextField;
320 private javax.swing.JLabel signatureLabel;
321 private javax.swing.JTextField signatureTextField;
322 private javax.swing.JComboBox<String> signatureTypeComboBox;
323 private javax.swing.JLabel signatureTypeLabel;