19 package org.sleuthkit.autopsy.modules.android;
22 import java.sql.Connection;
23 import java.sql.DriverManager;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.sql.Statement;
27 import java.util.List;
28 import java.util.logging.Level;
29 import org.openide.util.NbBundle;
30 import org.openide.util.NbBundle.Messages;
48 class WWFMessageAnalyzer {
50 private static final String moduleName = AndroidModuleFactory.getModuleName();
51 private static final Logger logger = Logger.getLogger(WWFMessageAnalyzer.class.getName());
52 private static Blackboard blackboard;
54 public static void findWWFMessages(Content dataSource, FileManager fileManager,
55 IngestJobContext context) {
56 List<AbstractFile> absFiles;
57 blackboard = Case.getCurrentCase().getServices().getBlackboard();
59 absFiles = fileManager.findFiles(dataSource,
"WordsFramework");
61 for (AbstractFile abstractFile : absFiles) {
63 File jFile =
new File(Case.getCurrentCase().getTempDirectory(), abstractFile.getName());
64 ContentUtils.writeToFile(abstractFile, jFile, context::dataSourceIngestIsCancelled);
66 findWWFMessagesInDB(jFile.toString(), abstractFile);
67 }
catch (Exception e) {
68 logger.log(Level.SEVERE,
"Error parsing WWF messages", e);
71 }
catch (TskCoreException e) {
72 logger.log(Level.SEVERE,
"Error finding WWF messages", e);
76 @Messages({
"WWFMessageAnalyzer.indexError.message=Failed to index WWF message artifact for keyword search."})
77 private static void findWWFMessagesInDB(String DatabasePath, AbstractFile f) {
78 Connection connection = null;
79 ResultSet resultSet = null;
80 Statement statement = null;
82 if (DatabasePath == null || DatabasePath.isEmpty()) {
86 Class.forName(
"org.sqlite.JDBC");
87 connection = DriverManager.getConnection(
"jdbc:sqlite:" + DatabasePath);
88 statement = connection.createStatement();
89 }
catch (ClassNotFoundException | SQLException e) {
90 logger.log(Level.SEVERE,
"Error opening database", e);
95 resultSet = statement.executeQuery(
96 "SELECT message,strftime('%s' ,created_at) as datetime,user_id,game_id FROM chat_messages ORDER BY game_id DESC, created_at DESC;");
102 while (resultSet.next()) {
103 message = resultSet.getString(
"message");
104 Long created_at = resultSet.getLong(
"datetime");
105 user_id = resultSet.getString(
"user_id");
106 game_id = resultSet.getString(
"game_id");
108 BlackboardArtifact bba = f.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE);
109 bba.addAttribute(
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, moduleName, created_at));
110 bba.addAttribute(
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, moduleName, user_id));
111 bba.addAttribute(
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID, moduleName, game_id));
112 bba.addAttribute(
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT, moduleName, message));
113 bba.addAttribute(
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE, moduleName,
114 NbBundle.getMessage(WWFMessageAnalyzer.class,
115 "WWFMessageAnalyzer.bbAttribute.wordsWithFriendsMsg")));
119 blackboard.indexArtifact(bba);
120 }
catch (Blackboard.BlackboardException ex) {
121 logger.log(Level.SEVERE,
"Unable to index blackboard artifact " + bba.getArtifactID(), ex);
122 MessageNotifyUtil.Notify.error(
123 Bundle.WWFMessageAnalyzer_indexError_message(), bba.getDisplayName());
126 }
catch (Exception e) {
127 logger.log(Level.SEVERE,
"Error parsing WWF messages to the Blackboard", e);
130 if (resultSet != null) {
135 }
catch (Exception e) {
136 logger.log(Level.SEVERE,
"Error closing database", e);