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 @SuppressWarnings(
"PMD.SingularField")
34 class AddFileTypeSignaturePanel extends javax.swing.JPanel {
36 private static final String RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem");
37 private static final String START_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem");
38 private static final String END_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem");
39 private static final String ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem");
44 AddFileTypeSignaturePanel() {
46 customizeComponents();
54 AddFileTypeSignaturePanel(Signature toEdit) {
56 this.setComponentValues(toEdit);
62 private void customizeComponents() {
63 setSignatureTypeComboBoxModel();
64 setOffsetRealtiveToComboBoxModel();
70 private void setSignatureTypeComboBoxModel() {
71 DefaultComboBoxModel<String> sigTypeComboBoxModel =
new DefaultComboBoxModel<>();
72 sigTypeComboBoxModel.addElement(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
73 sigTypeComboBoxModel.addElement(ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
74 signatureTypeComboBox.setModel(sigTypeComboBoxModel);
75 signatureTypeComboBox.setSelectedItem(RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
81 private void setOffsetRealtiveToComboBoxModel() {
82 DefaultComboBoxModel<String> offsetRelComboBoxModel =
new DefaultComboBoxModel<>();
83 offsetRelComboBoxModel.addElement(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
84 offsetRelComboBoxModel.addElement(END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
85 offsetRelativeToComboBox.setModel(offsetRelComboBoxModel);
86 offsetRelativeToComboBox.setSelectedItem(START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
94 @Messages({
"AddFileTypeSignaturePanel.signatureStringFail.text=Couldn't get signatures string"})
95 private void setComponentValues(Signature toEdit) {
96 if (toEdit.isRelativeToStart()) {
97 this.offsetRelativeToComboBox.setSelectedIndex(0);
99 this.offsetRelativeToComboBox.setSelectedIndex(1);
101 this.offsetTextField.setText(toEdit.getOffset() +
"");
102 if (Signature.Type.RAW == toEdit.getType()) {
103 this.signatureTypeComboBox.setSelectedIndex(0);
104 this.signatureTextField.setText(DatatypeConverter.printHexBinary(toEdit.getSignatureBytes()));
106 this.signatureTypeComboBox.setSelectedIndex(1);
108 this.signatureTextField.setText(
new String(toEdit.getSignatureBytes(),
"UTF-8"));
109 }
catch (UnsupportedEncodingException ex) {
110 JOptionPane.showMessageDialog(
this,
111 ex.getLocalizedMessage(),
112 Bundle.AddFileTypeSignaturePanel_signatureStringFail_text(),
113 JOptionPane.ERROR_MESSAGE);
125 Signature getSignature() {
130 FileType.Signature.Type sigType = signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM ? FileType.Signature.Type.RAW : FileType.Signature.Type.ASCII;
135 String sigString = signatureTextField.getText();
137 if (sigString.isEmpty()) {
138 JOptionPane.showMessageDialog(
this,
139 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message"),
140 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title"),
141 JOptionPane.ERROR_MESSAGE);
145 byte[] signatureBytes;
146 if (FileType.Signature.Type.RAW == sigType) {
148 sigString = sigString.replaceAll(
"\\s",
"");
149 signatureBytes = DatatypeConverter.parseHexBinary(sigString);
150 }
catch (IllegalArgumentException ex) {
151 JOptionPane.showMessageDialog(
this,
152 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message"),
153 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title"),
154 JOptionPane.ERROR_MESSAGE);
158 signatureBytes = sigString.getBytes(Charset.forName(
"UTF-8"));
165 boolean isRelativeToStart = offsetRelativeToComboBox.getSelectedItem() == START_OFFSET_RELATIVE_COMBO_BOX_ITEM;
168 offset = Long.parseUnsignedLong(offsetTextField.getText());
169 if (!isRelativeToStart && signatureBytes.length > offset + 1) {
170 JOptionPane.showMessageDialog(
this,
171 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length"),
172 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
173 JOptionPane.ERROR_MESSAGE);
176 }
catch (NumberFormatException ex) {
177 JOptionPane.showMessageDialog(
this,
178 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message"),
179 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
180 JOptionPane.ERROR_MESSAGE);
190 FileType.Signature signature =
new FileType.Signature(signatureBytes, offset, sigType, isRelativeToStart);
199 @SuppressWarnings(
"unchecked")
201 private
void initComponents() {
203 offsetLabel =
new javax.swing.JLabel();
204 offsetTextField =
new javax.swing.JTextField();
205 offsetRelativeToComboBox =
new javax.swing.JComboBox<>();
206 offsetRelativeToLabel =
new javax.swing.JLabel();
207 hexPrefixLabel =
new javax.swing.JLabel();
208 signatureTypeComboBox =
new javax.swing.JComboBox<>();
209 signatureLabel =
new javax.swing.JLabel();
210 signatureTypeLabel =
new javax.swing.JLabel();
211 signatureTextField =
new javax.swing.JTextField();
213 offsetLabel.setFont(offsetLabel.getFont().deriveFont(offsetLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
214 org.openide.awt.Mnemonics.setLocalizedText(offsetLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetLabel.text"));
216 offsetTextField.setFont(offsetTextField.getFont().deriveFont(offsetTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
217 offsetTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetTextField.text"));
219 offsetRelativeToComboBox.setFont(offsetRelativeToComboBox.getFont().deriveFont(offsetRelativeToComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
221 offsetRelativeToLabel.setFont(offsetRelativeToLabel.getFont().deriveFont(offsetRelativeToLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
222 org.openide.awt.Mnemonics.setLocalizedText(offsetRelativeToLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.offsetRelativeToLabel.text"));
224 hexPrefixLabel.setFont(hexPrefixLabel.getFont().deriveFont(hexPrefixLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
225 org.openide.awt.Mnemonics.setLocalizedText(hexPrefixLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.hexPrefixLabel.text"));
227 signatureTypeComboBox.setFont(signatureTypeComboBox.getFont().deriveFont(signatureTypeComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
228 signatureTypeComboBox.addActionListener(
new java.awt.event.ActionListener() {
229 public void actionPerformed(java.awt.event.ActionEvent evt) {
230 signatureTypeComboBoxActionPerformed(evt);
234 signatureLabel.setFont(signatureLabel.getFont().deriveFont(signatureLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
235 org.openide.awt.Mnemonics.setLocalizedText(signatureLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureLabel.text"));
237 signatureTypeLabel.setFont(signatureTypeLabel.getFont().deriveFont(signatureTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
238 org.openide.awt.Mnemonics.setLocalizedText(signatureTypeLabel,
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTypeLabel.text"));
240 signatureTextField.setFont(signatureTextField.getFont().deriveFont(signatureTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
241 signatureTextField.setText(
org.openide.util.NbBundle.getMessage(AddFileTypeSignaturePanel.class,
"AddFileTypeSignaturePanel.signatureTextField.text"));
242 signatureTextField.addActionListener(
new java.awt.event.ActionListener() {
243 public void actionPerformed(java.awt.event.ActionEvent evt) {
244 signatureTextFieldActionPerformed(evt);
248 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
249 this.setLayout(layout);
250 layout.setHorizontalGroup(
251 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
252 .addGroup(layout.createSequentialGroup()
254 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
255 .addGroup(layout.createSequentialGroup()
256 .addComponent(signatureTypeLabel)
257 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
258 .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
259 .addGroup(layout.createSequentialGroup()
260 .addComponent(signatureLabel)
261 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
262 .addComponent(hexPrefixLabel)
263 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
264 .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
265 .addGroup(layout.createSequentialGroup()
266 .addComponent(offsetLabel)
267 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
268 .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE))
269 .addGroup(layout.createSequentialGroup()
270 .addComponent(offsetRelativeToLabel)
271 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
272 .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
273 .addContainerGap(46, Short.MAX_VALUE))
275 layout.setVerticalGroup(
276 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
277 .addGroup(layout.createSequentialGroup()
279 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
280 .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
281 .addComponent(signatureTypeLabel))
282 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
283 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
284 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
285 .addComponent(hexPrefixLabel)
286 .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
287 .addComponent(signatureLabel))
288 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
289 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
290 .addComponent(offsetLabel)
291 .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
292 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
293 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
294 .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
295 .addComponent(offsetRelativeToLabel))
296 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
300 private void signatureTypeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
301 if (signatureTypeComboBox.getSelectedItem() == RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM) {
302 hexPrefixLabel.setVisible(
true);
303 signatureTextField.setText(
"0000");
305 hexPrefixLabel.setVisible(
false);
306 signatureTextField.setText(
"");
310 private void signatureTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
316 private javax.swing.JLabel hexPrefixLabel;
317 private javax.swing.JLabel offsetLabel;
318 private javax.swing.JComboBox<String> offsetRelativeToComboBox;
319 private javax.swing.JLabel offsetRelativeToLabel;
320 private javax.swing.JTextField offsetTextField;
321 private javax.swing.JLabel signatureLabel;
322 private javax.swing.JTextField signatureTextField;
323 private javax.swing.JComboBox<String> signatureTypeComboBox;
324 private javax.swing.JLabel signatureTypeLabel;