diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index ceb69170559084ca3cb5fb459e4ac69e81f9a333..c290733f232e82057cdcc2460b09c87fdb37ff1e 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -127,6 +127,14 @@ TskAutoDbJava::initializeJni(JNIEnv * jniEnv, jobject jobj) { return TSK_ERR; } + //(JJLjava/lang/String;Ljava/lang/String;)J + m_getParentIdMethodID = m_jniEnv->GetMethodID(m_callbackClass, "findParentObjId", "(JJLjava/lang/String;Ljava/lang/String;)J"); + if (m_getParentIdMethodID == NULL) { + printf("#### Error loading m_getParentIdMethodID\n"); + fflush(stdout); + return TSK_ERR; + } + printf("\n#### Yay found method IDs!\n"); fflush(stdout); return TSK_OK; @@ -585,33 +593,6 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, return TSK_ERR; } - /* - zSQL = sqlite3_mprintf( - "INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension) " - "VALUES (" - "%" PRId64 ",%" PRId64 "," - "%" PRId64 "," - "%d," - "%d,%d,'%q'," - "%" PRIuINUM ",%d," - "%d,%d,%d,%d," - "%" PRId64 "," - "%llu,%llu,%llu,%llu," - "%d,%d,%d,%Q,%d," - "'%q','%q')", - fsObjId, objId, // done - dataSourceObjId, // done - TSK_DB_FILES_TYPE_FS, // dont' need type - type, idx, name, // attrType, attrId, name done - fs_file->name->meta_addr, fs_file->name->meta_seq, // done - fs_file->name->type, meta_type, fs_file->name->flags, meta_flags, // used meta_flags - size, // done - (unsigned long long)crtime, (unsigned long long)ctime, (unsigned long long) atime, (unsigned long long) mtime, - meta_mode, gid, uid, md5TextPtr, known, - escaped_path, extension); - */ - - /* if (!TSK_FS_ISDOT(name)) { @@ -642,7 +623,6 @@ if (!TSK_FS_ISDOT(name)) storeObjId(fsObjId, fs_file, fullPath.c_str(), objId); } - /* // Add entry for the slack space. // Current conditions for creating a slack file: // - File name is not empty, "." or ".." @@ -659,49 +639,32 @@ if (!TSK_FS_ISDOT(name)) if (strlen(extension) > 0) { strncat(extension, "-slack", 6); } - TSK_OFF_T slackSize = fs_attr->nrd.allocsize - fs_attr->nrd.initsize; + jstring slackNamej = m_jniEnv->NewStringUTF(name); // TODO free? - if (addObject(TSK_DB_OBJECT_TYPE_FILE, parObjId, objId)) { - free(name); - free(escaped_path); - return 1; - } + TSK_OFF_T slackSize = fs_attr->nrd.allocsize - fs_attr->nrd.initsize; - // Run the same insert with the new name, size, and type - zSQL = sqlite3_mprintf( - "INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path,extension) " - "VALUES (" - "%" PRId64 ",%" PRId64 "," - "%" PRId64 "," - "%d," - "%d,%d,'%q'," - "%" PRIuINUM ",%d," - "%d,%d,%d,%d," - "%" PRId64 "," - "%llu,%llu,%llu,%llu," - "%d,%d,%d,NULL,%d," - "'%q','%q')", - fsObjId, objId, + // "INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, + // type, attr_type, attr_id, name, + // meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, + // size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension) " + jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addFileMethodID, + parObjId, fsObjId, dataSourceObjId, TSK_DB_FILES_TYPE_SLACK, - type, idx, name, - fs_file->name->meta_addr, fs_file->name->meta_seq, - TSK_FS_NAME_TYPE_REG, TSK_FS_META_TYPE_REG, fs_file->name->flags, meta_flags, + type, idx, slackNamej, + fs_file->name->meta_addr, (uint64_t)fs_file->name->meta_seq, + fs_file->name->type, meta_type, fs_file->name->flags, meta_flags, slackSize, (unsigned long long)crtime, (unsigned long long)ctime, (unsigned long long) atime, (unsigned long long) mtime, - meta_mode, gid, uid, known, - escaped_path, extension); + meta_mode, gid, uid, // md5TextPtr, known, + pathj, extj); + int64_t slackObjId = (int64_t)objIdj; - if (attempt_exec(zSQL, "TskDbSqlite::addFile: Error adding data to tsk_files table: %s\n")) { - free(name); - free(escaped_path); - sqlite3_free(zSQL); - return 1; + if (slackObjId < 0) { + return TSK_ERR; } } - sqlite3_free(zSQL);*/ - free(name); free(escaped_path); @@ -898,10 +861,25 @@ TskAutoDbJava::findParObjId(const TSK_FS_FILE* fs_file, const char* parentPath, return -1; } - // TODO TODO DATABASE CALL - printf("#### SKIPPING PAR OBJ ID DATABASE LOOKUP TODO \n"); + int64_t parObjId; + + if (m_getParentIdMethodID == NULL) { + printf("#### Yikes m_addFileSystemMethodID is null...\n"); + return TSK_ERR; + } + + jstring jpath = m_jniEnv->NewStringUTF(parent_path); // TODO free? + jstring jname = m_jniEnv->NewStringUTF(parent_name); // TODO free? + + jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_getParentIdMethodID, + fs_file->name->par_addr, fsObjId, jpath, jname); + int64_t objId = (int64_t)objIdj; + printf("#### Looked up parent object ID: %lld\n", objId); fflush(stdout); - int64_t parObjId = 2; + + if (objId < 0) { + return -1; + } return parObjId; } diff --git a/bindings/java/jni/auto_db_java.h b/bindings/java/jni/auto_db_java.h index 1837c987b07e093c892eed82e592255422073286..b8049de22a1ce97f81e34bb9ce22f6b6ccef7ddd 100644 --- a/bindings/java/jni/auto_db_java.h +++ b/bindings/java/jni/auto_db_java.h @@ -161,6 +161,7 @@ class TskAutoDbJava :public TskAuto { jmethodID m_addPoolMethodID = NULL; jmethodID m_addFileSystemMethodID = NULL; jmethodID m_addFileMethodID = NULL; + jmethodID m_getParentIdMethodID = NULL; // prevent copying until we add proper logic to handle it diff --git a/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java b/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java index 2e413c2bccae1548e43ae279b73ddfcfaa0d7802..f5589f93988a4302a6378e386635746e8b029a0c 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java +++ b/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java @@ -136,7 +136,7 @@ long addFile(long parentObjId, try { return caseDb.addFileSystemFileJNI(parentObjId, fsObjId, dataSourceObjId, - fsType, // TSK_DB_FILES_TYPE_FS, + fsType, attrType, attrId, name, metaAddr, metaSeq, dirType, metaType, dirFlags, metaFlags, @@ -151,4 +151,13 @@ long addFile(long parentObjId, } } + long findParentObjId(long metaAddr, long fsobjId, String path, String name) { + try { + return caseDb.findParentObjIdJNI(metaAddr, fsobjId, path, name, trans); + } catch (TskCoreException ex) { + ex.printStackTrace(); + return -1; + } + } + } diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index 16df7aac0b93f54361520171479ff4f725c44ca5..8e070c0c342b25cb8dfdc9e18de5a78ea0e9f12f 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -10983,7 +10983,6 @@ long addImageJNI(TskData.TSK_IMG_TYPE_ENUM type, long sectorSize, long size, String deviceId, CaseDbTransaction transaction) throws TskCoreException { acquireSingleUserCaseWriteLock(); - Statement statement = null; try { // Insert a row for the Image into the tsk_objects table. CaseDbConnection connection = transaction.getConnection(); @@ -11008,7 +11007,6 @@ long addImageJNI(TskData.TSK_IMG_TYPE_ENUM type, long sectorSize, long size, // Add a row to data_source_info preparedStatement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_DATA_SOURCE_INFO); - statement = connection.createStatement(); preparedStatement.setLong(1, newObjId); preparedStatement.setString(2, deviceId); preparedStatement.setString(3, timezone); @@ -11018,7 +11016,6 @@ long addImageJNI(TskData.TSK_IMG_TYPE_ENUM type, long sectorSize, long size, } catch (SQLException ex) { throw new TskCoreException(String.format("Error adding image to database"), ex); } finally { - closeStatement(statement); releaseSingleUserCaseWriteLock(); } } @@ -11026,7 +11023,6 @@ long addImageJNI(TskData.TSK_IMG_TYPE_ENUM type, long sectorSize, long size, void addImageNameJNI(long objId, String name, long sequence, CaseDbTransaction transaction) throws TskCoreException { acquireSingleUserCaseWriteLock(); - Statement statement = null; try { CaseDbConnection connection = transaction.getConnection(); PreparedStatement preparedStatement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_IMAGE_NAME); @@ -11038,14 +11034,38 @@ void addImageNameJNI(long objId, String name, long sequence, } catch (SQLException ex) { throw new TskCoreException(String.format("Error adding image name %s to image with object ID %d", name, objId), ex); } finally { - closeStatement(statement); releaseSingleUserCaseWriteLock(); } } + long findParentObjIdJNI(long metaAddr, long fsObjId, String path, String name, CaseDbTransaction transaction) throws TskCoreException { + acquireSingleUserCaseReadLock(); + ResultSet resultSet = null; + try { + CaseDbConnection connection = transaction.getConnection(); + PreparedStatement preparedStatement = connection.getPreparedStatement(PREPARED_STATEMENT.SELECT_OBJ_ID_BY_META_ADDR_AND_PATH); + preparedStatement.clearParameters(); + preparedStatement.setLong(1, metaAddr); + preparedStatement.setLong(2, fsObjId); + preparedStatement.setString(3, path); + preparedStatement.setString(4, name); + resultSet = connection.executeQuery(preparedStatement); + if (resultSet.next()) { + return resultSet.getLong("obj_id"); + } else { + throw new TskCoreException(String.format("Error looking up parent meta addr %d", metaAddr)); + } + } catch (SQLException ex) { + throw new TskCoreException(String.format("Error looking up parent meta addr %d", metaAddr), ex); + } finally { + closeResultSet(resultSet); + releaseSingleUserCaseReadLock(); + } + } + long addFileSystemFileJNI(long parentObjId, long fsObjId, long dataSourceObjId, - int fsType, // TSK_DB_FILES_TYPE_FS, + int fsType, int attrType, int attrId, String name, long metaAddr, long metaSeq, int dirType, int metaType, int dirFlags, int metaFlags, @@ -11066,14 +11086,14 @@ long addFileSystemFileJNI(long parentObjId, // INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, // dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, - // mode, gid, uid, md5, known, parent_path, extension + // mode, gid, uid, md5, known, parent_path, extension) PreparedStatement statement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_FILE_SYSTEM_FILE_All_FIELDS); statement.clearParameters(); - statement.setLong(1, fsObjId); // fs_obj_id - statement.setLong(2, objectId); // obj_id - statement.setLong(3, dataSourceObjId); // data_source_obj_id - statement.setShort(4, TskData.TSK_DB_FILES_TYPE_ENUM.FS.getFileType()); // type - statement.setShort(5, (short) attrType); // attr_type + statement.setLong(1, fsObjId); // fs_obj_id + statement.setLong(2, objectId); // obj_id + statement.setLong(3, dataSourceObjId); // data_source_obj_id + statement.setShort(4, (short)fsType); // type + statement.setShort(5, (short)attrType); // attr_type statement.setInt(6, attrId); // attr_id statement.setString(7, name); // name statement.setLong(8, metaAddr); // meta_addr @@ -11096,6 +11116,19 @@ long addFileSystemFileJNI(long parentObjId, statement.setString(25, extension); // extension connection.executeUpdate(statement); + if (TskData.TSK_DB_FILES_TYPE_ENUM.SLACK.getFileType() != fsType + && (!name.equals(".")) && (!name.equals(".."))) { + TimelineManager timelineManager = getTimelineManager(); + DerivedFile derivedFile = new DerivedFile(this, objectId, dataSourceObjId, name, + TSK_FS_NAME_TYPE_ENUM.valueOf((short)dirType), + TSK_FS_META_TYPE_ENUM.valueOf((short)metaType), + TSK_FS_NAME_FLAG_ENUM.valueOf(dirFlags), + (short)metaFlags, + size, ctime, crtime, atime, mtime, null, null, escaped_path, null, parentObjId, null, null, extension); + + timelineManager.addEventsForNewFile(derivedFile, connection); + } + return objectId; } catch (SQLException ex) { throw new TskCoreException("Failed to add file system file", ex); @@ -11318,7 +11351,8 @@ private enum PREPARED_STATEMENT { INSERT_VS_PART_POSTGRESQL("INSERT INTO tsk_vs_parts (obj_id, addr, start, length, descr, flags) VALUES (?, ?, ?, ?, ?, ?)"), INSERT_POOL_INFO("INSERT INTO tsk_pool_info (obj_id, pool_type) VALUES (?, ?)"), INSERT_FS_INFO("INSERT INTO tsk_fs_info (obj_id, img_offset, fs_type, block_size, block_count, root_inum, first_inum, last_inum, display_name)" - + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"), + SELECT_OBJ_ID_BY_META_ADDR_AND_PATH("SELECT obj_id FROM tsk_files WHERE meta_addr = ? AND fs_obj_id = ? AND parent_path = ? AND name = ?"); private final String sql;