diff --git a/thunderbirdparser/nbproject/project.xml b/thunderbirdparser/nbproject/project.xml index 950a9d78b0..c31a584419 100644 --- a/thunderbirdparser/nbproject/project.xml +++ b/thunderbirdparser/nbproject/project.xml @@ -6,6 +6,14 @@ org.sleuthkit.autopsy.thunderbirdparser + + org.openide.util + + + + 8.25.1 + + org.sleuthkit.autopsy.core diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties index c94d63cf4f..ddbf65245e 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties @@ -4,3 +4,24 @@ OpenIDE-Module-Long-Description=\ The module extracts Thunderbird e-mail folder hierarchy from the ingested disk image and posts the folder hierarchy and e-mail messages found as results. OpenIDE-Module-Name=ThunderbirdParser OpenIDE-Module-Short-Description=Thunderbird Parser e-mail extractor ingest module +MboxParser.parse.errMsg.failedToReadFile=Failed to read mbox file from disk. +MboxParser.parse.errMsg.couldntFindCharset=Couldn't find appropriate charset encoder. +MboxParser.parse.errMsg.failedToParseNMsgs=Failed to extract {0} email messages. +MboxParser.handleAttch.errMsg.failedToCreateOnDisk=Failed to extract attachment to disk\: {0} +MboxParser.handleAttch.failedWriteToDisk=Failed to extract attachment to disk\: {0} +PstParser.parse.errMsg.failedToParseNMsgs=Failed to extract {0} email messages. +PstParser.extractAttch.errMsg.failedToExtractToDisk=Failed to extract attachment to disk\: {0} +ThunderbirdMboxFileIngestModule.moduleName=Email Parser +ThunderbirdMboxFileIngestModule.hashDbModuleName=Hash Lookup +ThunderbirdMboxFileIngestModule.processPst.errMsg.outOfDiskSpace=Out of disk space. Can''t copy {0} to parse. +ThunderbirdMboxFileIngestModule.encryptionFileLevel=File-level Encryption +ThunderbirdMboxFileIngestModule.processPst.errProcFile.msg=Error while processing {0} +ThunderbirdMboxFileIngestModule.processPst.errProcFile.details=Only files from Outlook 2003 and later are supported. +ThunderbirdMboxFileIngestModule.processPst.errProcFile.msg2=Error while processing {0} +ThunderbirdMboxFileIngestModule.processMBox.errProcFile.msg=Error while processing {0} +ThunderbirdMboxFileIngestModule.processMBox.errProfFile.details=Out of disk space. Can't copy file to parse. +ThunderbirdMboxFileIngestModule.processMBox.errProcFile.msg2=Error while processing {0} +ThunderbirdMboxFileIngestModule.getDesc.text=This module detects and parses mbox and pst/ost files and populates email artifacts in the blackboard. +ThunderbirdMboxFileIngestModule.handleAttch.errMsg=Error processing {0} +ThunderbirdMboxFileIngestModule.handleAttch.errMsg.details=Failed to add attachment named {0} to the case. +ThunderbirdMboxFileIngestModule.notAvail=Not available diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle_ja.properties b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle_ja.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MboxParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MboxParser.java index 05086b1ee6..f30b9ce27c 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MboxParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MboxParser.java @@ -54,6 +54,7 @@ import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.stream.MimeConfig; import org.apache.tika.parser.txt.CharsetDetector; import org.apache.tika.parser.txt.CharsetMatch; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.ingest.IngestServices; /** @@ -116,14 +117,14 @@ import org.sleuthkit.autopsy.ingest.IngestServices; // Not the right encoder } catch (IOException ex) { logger.log(Level.WARNING, "couldn't find mbox file.", ex); - addErrorMessage("Failed to read mbox file from disk."); + addErrorMessage(NbBundle.getMessage(this.getClass(), "MboxParser.parse.errMsg.failedToReadFile")); return Collections.EMPTY_LIST; } } // If no encoders work, post an error message and return. if (mboxIterator == null || theEncoder == null) { - addErrorMessage("Couldn't find appropriate charset encoder."); + addErrorMessage(NbBundle.getMessage(this.getClass(), "MboxParser.parse.errMsg.couldntFindCharset")); return Collections.EMPTY_LIST; } @@ -142,7 +143,8 @@ import org.sleuthkit.autopsy.ingest.IngestServices; } if (failCount > 0) { - addErrorMessage("Failed to extract " + failCount + " email messages."); + addErrorMessage( + NbBundle.getMessage(this.getClass(), "MboxParser.parse.errMsg.failedToParseNMsgs", failCount)); } return emails; } @@ -255,7 +257,9 @@ import org.sleuthkit.autopsy.ingest.IngestServices; try { fos = new FileOutputStream(outPath); } catch (FileNotFoundException ex) { - addErrorMessage("Failed to extract attachment to disk: " + filename); + addErrorMessage( + NbBundle.getMessage(this.getClass(), + "MboxParser.handleAttch.errMsg.failedToCreateOnDisk", filename)); logger.log(Level.INFO, "Failed to create file output stream for: " + outPath, ex); return; } @@ -270,7 +274,7 @@ import org.sleuthkit.autopsy.ingest.IngestServices; } } catch (IOException ex) { logger.log(Level.INFO, "Failed to write mbox email attachment to disk.", ex); - addErrorMessage("Failed to extract attachment to disk: " + filename); + addErrorMessage(NbBundle.getMessage(this.getClass(), "MboxParser.handleAttch.failedWriteToDisk", filename)); return; } finally { try { diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java index a43aef5dc9..566ab3eb48 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java @@ -33,6 +33,8 @@ import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; + +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.ingest.IngestServices; import static org.sleuthkit.autopsy.thunderbirdparser.ThunderbirdMboxFileIngestModule.getRelModuleOutputPath; import org.sleuthkit.datamodel.AbstractFile; @@ -80,7 +82,8 @@ class PstParser { pstFile = new PSTFile(file); failures = processFolder(pstFile.getRootFolder(), "\\", true); if (failures > 0) { - addErrorMessage("Failed to extract " + failures + " email messages."); + addErrorMessage( + NbBundle.getMessage(this.getClass(), "PstParser.parse.errMsg.failedToParseNMsgs", failures)); } return ParseResult.OK; } catch (PSTException | IOException ex) { @@ -219,7 +222,9 @@ class PstParser { attachment.setSize(attach.getFilesize()); email.addAttachment(attachment); } catch (PSTException | IOException ex) { - addErrorMessage("Failed to extract attachment to disk: " + filename); + addErrorMessage( + NbBundle.getMessage(this.getClass(), "PstParser.extractAttch.errMsg.failedToExtractToDisk", + filename)); logger.log(Level.WARNING, "Failed to extract attachment from pst file.", ex); } } diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java index 82a4ffcb6e..b6ae70ba60 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; + +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.coreutils.Logger; @@ -53,8 +55,10 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { private static final Logger logger = Logger.getLogger(ThunderbirdMboxFileIngestModule.class.getName()); private static ThunderbirdMboxFileIngestModule instance = null; private IngestServices services; - private static final String MODULE_NAME = "Email Parser"; - private final String hashDBModuleName = "Hash Lookup"; + private static final String MODULE_NAME = NbBundle.getMessage(ThunderbirdMboxFileIngestModule.class, + "ThunderbirdMboxFileIngestModule.moduleName"); + private final String hashDBModuleName = NbBundle.getMessage(ThunderbirdMboxFileIngestModule.class, + "ThunderbirdMboxFileIngestModule.hashDbModuleName"); final public static String MODULE_VERSION = Version.getVersion(); private int messageId = 0; private FileManager fileManager; @@ -132,7 +136,10 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { if (abstractFile.getSize() >= services.getFreeDiskSpace()) { logger.log(Level.WARNING, "Not enough disk space to write file to disk."); - IngestMessage msg = IngestMessage.createErrorMessage(messageId++, this, getName(), "Out of disk space. Can't copy " + abstractFile.getName() + " to parse."); + IngestMessage msg = IngestMessage.createErrorMessage(messageId++, this, getName(), + NbBundle.getMessage(this.getClass(), + "ThunderbirdMboxFileIngestModule.processPst.errMsg.outOfDiskSpace", + abstractFile.getName())); services.postMessage(msg); return ProcessResult.OK; } @@ -155,14 +162,18 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { try { BlackboardArtifact generalInfo = abstractFile.getGenInfoArtifact(); generalInfo.addAttribute(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID(), - MODULE_NAME, "File-level Encryption")); + MODULE_NAME, + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.encryptionFileLevel"))); } catch (TskCoreException ex) { logger.log(Level.INFO, "Failed to add encryption attribute to file: " + abstractFile.getName()); } } else { // parsing error: log message - postErrorMessage("Error while processing " + abstractFile.getName(), - "Only files from Outlook 2003 and later are supported."); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.processPst.errProcFile.msg", + abstractFile.getName()), + NbBundle.getMessage(this.getClass(), + "ThunderbirdMboxFileIngestModule.processPst.errProcFile.details")); logger.log(Level.INFO, "PSTParser failed to parse " + abstractFile.getName()); return ProcessResult.ERROR; } @@ -173,7 +184,9 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { String errors = parser.getErrors(); if (errors.isEmpty() == false) { - postErrorMessage("Error while processing " + abstractFile.getName(), errors); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.processPst.errProcFile.msg2", + abstractFile.getName()), errors); } return ProcessResult.OK; @@ -206,8 +219,11 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { if (abstractFile.getSize() >= services.getFreeDiskSpace()) { logger.log(Level.WARNING, "Not enough disk space to write file to disk."); - postErrorMessage("Error while processing " + abstractFile.getName(), - "Out of disk space. Can't copy file to parse."); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.processMBox.errProcFile.msg", + abstractFile.getName()), + NbBundle.getMessage(this.getClass(), + "ThunderbirdMboxFileIngestModule.processMBox.errProfFile.details")); return ProcessResult.OK; } @@ -229,7 +245,9 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { String errors = parser.getErrors(); if (errors.isEmpty() == false) { - postErrorMessage("Error while processing " + abstractFile.getName(), errors); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.processMBox.errProcFile.msg2", + abstractFile.getName()), errors); } return ProcessResult.OK; @@ -275,7 +293,7 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { @Override public String getDescription() { - return "This module detects and parses mbox and pst/ost files and populates email artifacts in the blackboard."; + return NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.getDesc.text"); } @Override @@ -347,8 +365,11 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { MODULE_NAME, MODULE_VERSION, ""); files.add(df); } catch (TskCoreException ex) { - postErrorMessage("Error processing " + abstractFile.getName(), - "Failed to add attachment named " + filename + " to the case."); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.handleAttch.errMsg", + abstractFile.getName()), + NbBundle.getMessage(this.getClass(), + "ThunderbirdMboxFileIngestModule.handleAttch.errMsg.details", filename)); logger.log(Level.INFO, "", ex); } } @@ -399,7 +420,8 @@ public class ThunderbirdMboxFileIngestModule extends IngestModuleAbstractFile { if (rtf.isEmpty() == false) { bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF.getTypeID(), MODULE_NAME, rtf)); } - bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_MSG_ID.getTypeID(), MODULE_NAME, ((id < 0L) ? "Not available" : String.valueOf(id)))); + bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_MSG_ID.getTypeID(), MODULE_NAME, ((id < 0L) ? NbBundle + .getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.notAvail") : String.valueOf(id)))); if (subject.isEmpty() == false) { bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_SUBJECT.getTypeID(), MODULE_NAME, subject)); }