4961 add custom/windows-nt-registry MIME type and use it instead

This commit is contained in:
William Schaefer 2019-05-09 18:23:04 -04:00
parent 3e53741237
commit cc92182522
8 changed files with 81 additions and 85 deletions

View File

@ -52,6 +52,4 @@ interface FileTypeViewer {
* fine. Otherwise, it is ambiguous. * fine. Otherwise, it is ambiguous.
*/ */
void resetComponent(); void resetComponent();
boolean isSupported(AbstractFile file);
} }

View File

@ -18,6 +18,7 @@
*/ */
package org.sleuthkit.autopsy.contentviewers; package org.sleuthkit.autopsy.contentviewers;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import java.awt.Component; import java.awt.Component;
import java.util.HashMap; import java.util.HashMap;
@ -81,15 +82,11 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
* *
* @param mimeType * @param mimeType
* *
* @return FileTypeViewer, null if no known content viewer supports the * @return FileTypeViewer, null if no known content viewer supports the mimetype
* mimetype
*/ */
private FileTypeViewer getSupportingViewer(AbstractFile file) { private FileTypeViewer getSupportingViewer(String mimeType) {
FileTypeViewer viewer = mimeTypeToViewerMap.get(file.getMIMEType());
if (viewer == null || viewer.isSupported(file)) { return mimeTypeToViewerMap.get(mimeType);
return viewer;
}
return null;
} }
/** /**
@ -107,11 +104,12 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
@Override @Override
public void setNode(Node selectedNode) { public void setNode(Node selectedNode) {
resetComponent(); resetComponent();
if (selectedNode == null) { if (selectedNode == null) {
return; return;
} }
@ -127,22 +125,27 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
try { try {
FileTypeDetector fileTypeDetector = new FileTypeDetector(); FileTypeDetector fileTypeDetector = new FileTypeDetector();
mimeType = fileTypeDetector.getMIMEType(file); mimeType = fileTypeDetector.getMIMEType(file);
} catch (FileTypeDetector.FileTypeDetectorInitException ex) { }catch (FileTypeDetector.FileTypeDetectorInitException ex) {
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
return; return;
} }
} }
if (mimeType.equalsIgnoreCase("application/octet-stream")) {
return;
}
else {
FileTypeViewer viewer = getSupportingViewer(mimeType);
if (viewer != null) {
lastViewer = viewer;
FileTypeViewer viewer = getSupportingViewer(file); viewer.setFile(file);
if (viewer != null) { this.removeAll();
lastViewer = viewer; this.add(viewer.getComponent());
this.repaint();
viewer.setFile(file); }
this.removeAll();
this.add(viewer.getComponent());
this.repaint();
} }
} }
@Override @Override
@ -195,36 +198,44 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
try { try {
FileTypeDetector fileTypeDetector = new FileTypeDetector(); FileTypeDetector fileTypeDetector = new FileTypeDetector();
mimeType = fileTypeDetector.getMIMEType(aFile); mimeType = fileTypeDetector.getMIMEType(aFile);
} catch (FileTypeDetector.FileTypeDetectorInitException ex) { }catch (FileTypeDetector.FileTypeDetectorInitException ex) {
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
return false; return false;
} }
} }
return (getSupportingViewer(aFile) != null); if (mimeType.equalsIgnoreCase("application/octet-stream")) {
return false;
} else {
return (getSupportingViewer(mimeType) != null);
}
} }
@Override @Override
public int isPreferred(Node node) { public int isPreferred(Node node) {
AbstractFile file = node.getLookup().lookup(AbstractFile.class); AbstractFile file = node.getLookup().lookup(AbstractFile.class);
String mimeType = file.getMIMEType(); String mimeType = file.getMIMEType();
if (Strings.isNullOrEmpty(mimeType)) { if (Strings.isNullOrEmpty(mimeType)) {
LOGGER.log(Level.INFO, "Mimetype not known for file: {0}", file.getName()); //NON-NLS LOGGER.log(Level.INFO, "Mimetype not known for file: {0}", file.getName()); //NON-NLS
try { try {
FileTypeDetector fileTypeDetector = new FileTypeDetector(); FileTypeDetector fileTypeDetector = new FileTypeDetector();
mimeType = fileTypeDetector.getMIMEType(file); mimeType = fileTypeDetector.getMIMEType(file);
} catch (FileTypeDetector.FileTypeDetectorInitException ex) { }catch (FileTypeDetector.FileTypeDetectorInitException ex) {
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
return 0; return 0;
} }
} }
if (null != getSupportingViewer(file)) { if (mimeType.equalsIgnoreCase("application/octet-stream")) {
return CONFIDENCE_LEVEL; return 0;
} else {
if (null != getSupportingViewer(mimeType)) {
return CONFIDENCE_LEVEL;
}
} }
return 0; return 0;
} }
} }

View File

@ -37,28 +37,29 @@ final class HtmlViewer extends javax.swing.JPanel implements FileTypeViewer {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(HtmlViewer.class.getName()); private static final Logger logger = Logger.getLogger(HtmlViewer.class.getName());
private static final String[] SUPPORTED_MIMETYPES = new String[]{ private static final String[] SUPPORTED_MIMETYPES = new String[]{
"text/html", "text/html",
"application/xhtml+xml" "application/xhtml+xml"
}; };
/** /**
* Creates new form HtmlViewerPanel * Creates new form HtmlViewerPanel
*/ */
HtmlViewer() { HtmlViewer() {
initComponents(); initComponents();
} }
/** /**
* Retrieve the HTML text content from the supplied file. * Retrieve the HTML text content from the supplied file.
* *
* @param abstractFile The file to read. * @param abstractFile The file to read.
* *
* @return The text content of the file. * @return The text content of the file.
*/ */
@NbBundle.Messages({ @NbBundle.Messages({
"HtmlViewer_file_error=This file is missing or unreadable.",}) "HtmlViewer_file_error=This file is missing or unreadable.",
})
private String getHtmlText(AbstractFile abstractFile) { private String getHtmlText(AbstractFile abstractFile) {
try { try {
int fileSize = (int) abstractFile.getSize(); int fileSize = (int) abstractFile.getSize();
@ -127,9 +128,4 @@ final class HtmlViewer extends javax.swing.JPanel implements FileTypeViewer {
public void resetComponent() { public void resetComponent() {
htmlPanel.reset(); htmlPanel.reset();
} }
@Override
public boolean isSupported(AbstractFile file) {
return true;
}
} }

View File

@ -191,8 +191,4 @@ class MediaFileViewer extends javax.swing.JPanel implements FileTypeViewer {
boolean isSupported(AbstractFile file); boolean isSupported(AbstractFile file);
} }
@Override
public boolean isSupported(AbstractFile file){
return true;
}
} }

View File

@ -538,11 +538,6 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
} }
@Override
public boolean isSupported(AbstractFile file){
return true;
}
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton exportButton; private javax.swing.JButton exportButton;
private javax.swing.JPanel hdrPanel; private javax.swing.JPanel hdrPanel;

View File

@ -413,8 +413,8 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
currentTableHeader = new ArrayList<>(); currentTableHeader = new ArrayList<>();
viewReader.read(tableName); viewReader.read(tableName);
Map<String, Object> columnRow = new LinkedHashMap<>(); Map<String, Object> columnRow = new LinkedHashMap<>();
for (int i = 0; i < currentTableHeader.size(); i++) { for(int i = 0; i< currentTableHeader.size(); i++){
columnRow.put(currentTableHeader.get(i), ""); columnRow.put(currentTableHeader.get(i), "");
} }
selectedTableView.setupTable(Collections.singletonList(columnRow)); selectedTableView.setupTable(Collections.singletonList(columnRow));
} }
@ -617,9 +617,4 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
} }
}; };
} }
@Override
public boolean isSupported(AbstractFile file) {
return true;
}
} }

View File

@ -42,17 +42,15 @@ class WindowsRegistryViewer extends JPanel implements FileTypeViewer {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(WindowsRegistryViewer.class.getName()); private static final Logger logger = Logger.getLogger(WindowsRegistryViewer.class.getName());
private static final String[] SUPPORTED_MIMETYPES = new String[]{"application/octet-stream"}; private static final String[] SUPPORTED_MIMETYPES = new String[]{"custom/windows-nt-registry"};
private RejView regview; private RejView regview;
private AbstractFile lastFile; private AbstractFile lastFile;
WindowsRegistryViewer() { WindowsRegistryViewer() {
super(new BorderLayout()); super(new BorderLayout());
System.out.println("CREATED REGISTRY VIEWER");
} }
private void setDataView(Content content) { private void setDataView(Content content) {
System.out.println("setDataview called");
if (content == null) { if (content == null) {
this.resetComponent(); this.resetComponent();
return; return;
@ -60,7 +58,7 @@ class WindowsRegistryViewer extends JPanel implements FileTypeViewer {
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if (content.getSize() == 0) { if (content.getSize() <= 1024) {
return; return;
} }
@ -82,27 +80,24 @@ class WindowsRegistryViewer extends JPanel implements FileTypeViewer {
@Override @Override
public Component getComponent() { public Component getComponent() {
System.out.println("component GOTTEN");
return this; return this;
} }
@Override @Override
public void resetComponent() { public void resetComponent() {
System.out.println("RESETING COMP");
// cleanup anything // cleanup anything
if (this.regview != null) { if (this.regview != null) {
this.remove(this.regview); this.remove(this.regview);
this.regview = null; this.regview = null;
} }
lastFile = null;
} }
@Override private boolean isSupported(AbstractFile file) {
public boolean isSupported(AbstractFile file) {
System.out.println("IS THIS SUPPORTED?");
if (file == null) { if (file == null) {
return false; return false;
} }
if (file.getSize() == 0) { if (file.getSize() <= 1024) {
return false; return false;
} }
byte[] header = new byte[0x4000]; byte[] header = new byte[0x4000];
@ -117,23 +112,19 @@ class WindowsRegistryViewer extends JPanel implements FileTypeViewer {
RegistryHive hive = new RegistryHiveBuffer(buf); RegistryHive hive = new RegistryHiveBuffer(buf);
try { try {
hive.getHeader(); hive.getHeader();
System.out.println("is supported " + file.getName());
return true; return true;
} catch (RegistryParseException ex) { } catch (RegistryParseException ex) {
System.out.println("not supported "+ file.getName());
return false; return false;
} }
} }
@Override @Override
public List<String> getSupportedMIMETypes() { public List<String> getSupportedMIMETypes() {
System.out.println("GET SUPPORTED MIME TYPES");
return Arrays.asList(SUPPORTED_MIMETYPES); return Arrays.asList(SUPPORTED_MIMETYPES);
} }
@Override @Override
public void setFile(AbstractFile file) { public void setFile(AbstractFile file) {
System.out.println("SET THE FILE");
if (file == null) { if (file == null) {
resetComponent(); resetComponent();
return; return;

View File

@ -215,17 +215,20 @@ final class CustomFileTypesManager {
signatureList.add(new Signature(byteArray, 522L)); signatureList.add(new Signature(byteArray, 522L));
fileType = new FileType("image/x-pict", signatureList); //NON-NLS fileType = new FileType("image/x-pict", signatureList); //NON-NLS
autopsyDefinedFileTypes.add(fileType); autopsyDefinedFileTypes.add(fileType);
/* NOTE: see JIRA-4269. This MIME type seems to match a lot of random file types,
including ZIP archives. As a result those files get assigned this MIME type instead
of having their MIME type detected by Tika.
byteArray = DatatypeConverter.parseHexBinary("1100"); //NON-NLS
signatureList.clear();
signatureList.add(new Signature(byteArray, 522L));
fileType = new FileType("image/x-pict", signatureList); //NON-NLS
autopsyDefinedFileTypes.add(fileType);*/
/* /*
* NOTE: see JIRA-4269. This MIME type seems to match a lot of
* random file types, including ZIP archives. As a result those
* files get assigned this MIME type instead of having their MIME
* type detected by Tika. byteArray =
* DatatypeConverter.parseHexBinary("1100"); //NON-NLS
* signatureList.clear(); signatureList.add(new Signature(byteArray,
* 522L)); fileType = new FileType("image/x-pict", signatureList);
* //NON-NLS
autopsyDefinedFileTypes.add(fileType);
*/
/*
* Add type for pam. * Add type for pam.
*/ */
signatureList.clear(); signatureList.clear();
@ -305,7 +308,8 @@ final class CustomFileTypesManager {
autopsyDefinedFileTypes.add(fileType); autopsyDefinedFileTypes.add(fileType);
/* /*
* Add type for .tec files with leading End Of Image marker (JFIF JPEG) * Add type for .tec files with leading End Of Image marker (JFIF
* JPEG)
*/ */
byteArray = DatatypeConverter.parseHexBinary("FFD9FFD8"); //NON-NLS byteArray = DatatypeConverter.parseHexBinary("FFD9FFD8"); //NON-NLS
signatureList.clear(); signatureList.clear();
@ -313,6 +317,16 @@ final class CustomFileTypesManager {
fileType = new FileType("image/jpeg", signatureList); //NON-NLS fileType = new FileType("image/jpeg", signatureList); //NON-NLS
autopsyDefinedFileTypes.add(fileType); autopsyDefinedFileTypes.add(fileType);
/*
* Add type for Windows NT registry files with leading End Of Image marker (JFIF
* JPEG)
*/
byteArray = DatatypeConverter.parseHexBinary("72656766"); //NON-NLS
signatureList.clear();
signatureList.add(new Signature(byteArray, 0L));
fileType = new FileType("custom/windows-nt-registry", signatureList); //NON-NLS
autopsyDefinedFileTypes.add(fileType);
} catch (IllegalArgumentException ex) { } catch (IllegalArgumentException ex) {
/* /*
* parseHexBinary() throws this if the argument passed in is not hex * parseHexBinary() throws this if the argument passed in is not hex