diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index 51c20ab84a70c72a5fee69b06176e6d9e74cce05..47c7303e06007839e2b652995030fcb395292da5 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -274,7 +274,7 @@ JNIEXPORT jint JNICALL TSK_TCHAR pathT[1024]; toTCHAR(env, pathT, 1024, pathJ); - TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_IDXONLY; + TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_TRY; TSK_HDB_INFO * tempdb = tsk_hdb_open(pathT, flags); if(tempdb == NULL) @@ -302,7 +302,7 @@ JNIEXPORT jint JNICALL TSK_TCHAR pathT[1024]; toTCHAR(env, pathT, 1024, pathJ); - TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_IDXONLY; + TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_TRY; TSK_HDB_INFO * temp = tsk_hdb_open(pathT, flags); if(temp == NULL) @@ -415,14 +415,39 @@ JNIEXPORT jboolean JNICALL return retval; } +/* + * Test for index only (no original Db file) legacy (IDX format). + * @param env pointer to java environment this was called from + * @param obj the java object this was called from + * @param dbHandle Which DB. + * @return true if index only AND is legacy + */ +JNIEXPORT jboolean JNICALL + Java_org_sleuthkit_datamodel_SleuthkitJNI_isIdxOnlyHashDbNat(JNIEnv * env, + jclass obj, jint dbHandle) +{ + bool retval = false; + + if((size_t) dbHandle > m_knownbads.size()) { + setThrowTskCoreError(env, "Invalid database handle"); + } else { + TSK_HDB_INFO * db = m_knownbads.at(dbHandle-1); + + if(db != NULL) { + retval = (tsk_hdb_is_idxonly(db) == 1) ? true : false; + } + } + return retval; +} + /* * Get the name of the database pointed to by path * @param env pointer to java environment this was called from * @param obj the java object this was called from - * @param pathJ the path to the database + * @param pathJ the path to the database (expects the actual database path, not an index path) */ JNIEXPORT jstring JNICALL - Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName(JNIEnv * env, + Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbNameByPath(JNIEnv * env, jclass obj, jstring pathJ) { TSK_HDB_OPEN_ENUM flags; @@ -449,6 +474,30 @@ JNIEXPORT jstring JNICALL return jname; } +/* + * Get the name of the database pointed to by path + * @param env pointer to java environment this was called from + * @param obj the java object this was called from + * @param dbHandle Which DB. + */ +JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName + (JNIEnv * env, jclass obj, jint dbHandle) +{ + if((size_t) dbHandle > m_knownbads.size()) { + setThrowTskCoreError(env, "Invalid database handle"); + return env->NewStringUTF("-1"); + } else { + TSK_HDB_INFO * temp = m_knownbads.at(dbHandle-1); + if (temp == NULL) { + setThrowTskCoreError(env, "Error: database object is null"); + return env->NewStringUTF("-1"); + } + + + jstring jname = env->NewStringUTF(temp->db_name); + return jname; + } +} JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeDbLookupsNat(JNIEnv * env, @@ -1493,7 +1542,7 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexNat (JNIEnv * env, } else { TSK_HDB_INFO * temp = m_knownbads.at(dbHandle-1); if (temp == NULL) { - setThrowTskCoreError(env, "Error opening database to create index"); + setThrowTskCoreError(env, "Error: database object is null"); return; } @@ -1516,7 +1565,6 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexNat (JNIEnv * env, setThrowTskCoreError(env, "Error creating index"); } - tsk_hdb_close(temp); return; } } @@ -1559,7 +1607,6 @@ JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_lookupIndex uint8_t retval = tsk_hdb_hasindex(temp, TSK_HDB_HTYPE_MD5_ID); - tsk_hdb_close(temp); return (jboolean) retval == 1; } } diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h index 2cfae3cd7c3385c3de5d1c51d88c5f40e7acb114..e8a7dc7009677df8dc1770da825997988d830f37 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.h +++ b/bindings/java/jni/dataModel_SleuthkitJNI.h @@ -93,14 +93,28 @@ JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_isUpdateableDbKnownBadNat(JNIEnv * env, jclass obj, jint dbHandle); + +JNIEXPORT jboolean JNICALL + Java_org_sleuthkit_datamodel_SleuthkitJNI_isIdxOnlyHashDbNat(JNIEnv * env, + jclass obj, jint dbHandle); + + /* * Class: org_sleuthkit_datamodel_SleuthkitJNI * Method: getDbName * Signature: (Ljava/lang/String;)Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName +JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbNameByPath (JNIEnv *, jclass, jstring); +/* + * Class: org_sleuthkit_datamodel_SleuthkitJNI + * Method: getHashDbName + * Signature: + */ +JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName + (JNIEnv *, jclass, jint dbHandle); + /* * Class: org_sleuthkit_datamodel_SleuthkitJNI * Method: closeDbLookupsNat diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index bd72353594018f0d274cf1642ed8d91833738a0b..ef91dc53db0776af21eb059ad6a48aded4f93e23 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -60,7 +60,9 @@ public class SleuthkitJNI { private static native boolean isUpdateableDbKnownBadNat(int dbHandle); - private static native String getDbName(String hashDbPath) throws TskCoreException; + private static native String getDbNameByPath(String hashDbPath) throws TskCoreException; + + private static native String getDbName(int dbHandle) throws TskCoreException; private static native void closeDbLookupsNat() throws TskCoreException; @@ -121,7 +123,7 @@ public class SleuthkitJNI { private static native boolean lookupIndexExistsNat(int dbHandle) throws TskCoreException; - + private static native boolean isIdxOnlyHashDbNat(int dbHandle) throws TskCoreException; //util functions private static native long findDeviceSizeNat(String devicePath) throws TskCoreException; @@ -644,7 +646,7 @@ public static boolean lookupIndexExists(String dbPath) throws TskCoreException { * @return true if index exists * @throws TskCoreException if a critical error occurs within TSK core */ - public static boolean lookupIndexForHashDatabaseExists(int dbHandle) throws TskCoreException { + public static boolean hashDatabaseHasLookupIndex(int dbHandle) throws TskCoreException { return lookupIndexExistsNat(dbHandle); } @@ -714,10 +716,24 @@ public static void closeHashDatabases() throws TskCoreException { * @throws TskCoreException if a critical error occurs within TSK core */ // BC: Used by HasDBAddDatabaseDialog an HashDBXML + //use getHashDatabaseName instead + @Deprecated public static String getDatabaseName(String path) throws TskCoreException { - return getDbName(path); + return getDbNameByPath(path); } + + /** + * Get the name of the database + * + * @param dbHandle previously opened hash db handle + * @throws TskCoreException if a critical error occurs within TSK core + */ + public static String getHashDatabaseName(int dbHandle) throws TskCoreException { + return getDbName(dbHandle); + } + + /** * Look up the given hash in the NSRL database * @@ -729,10 +745,10 @@ public static String getDatabaseName(String path) throws TskCoreException { // use lookupNSRLDatabase instead @Deprecated public static TskData.FileKnown nsrlHashLookup(String hash) throws TskCoreException { - return lookupNSRLDatabase(hash); + return lookupInNSRLDatabase(hash); } - public static TskData.FileKnown lookupNSRLDatabase(String hash) throws TskCoreException { + public static TskData.FileKnown lookupInNSRLDatabase(String hash) throws TskCoreException { return TskData.FileKnown.valueOf((byte) nsrlDbLookup(hash)); } @@ -745,13 +761,13 @@ public static TskData.FileKnown lookupNSRLDatabase(String hash) throws TskCoreEx * @throws TskCoreException if a critical error occurs within TSK core */ // BC: Called by SleuthkitCase -> Deprecated - // use lookupHashDatabse instead + // use lookupInHashDatabase instead @Deprecated public static TskData.FileKnown knownBadHashLookup(String hash, int dbHandle) throws TskCoreException { - return lookupHashDatabase(hash, dbHandle); + return lookupInHashDatabase(hash, dbHandle); } - public static TskData.FileKnown lookupHashDatabase(String hash, int dbHandle) throws TskCoreException { + public static TskData.FileKnown lookupInHashDatabase(String hash, int dbHandle) throws TskCoreException { return TskData.FileKnown.valueOf((byte) knownBadDbLookup(hash, dbHandle)); } @@ -773,6 +789,10 @@ public static boolean isUpdateableHashDatabase(int dbHandle) throws TskCoreExcep return isUpdateableDbKnownBadNat(dbHandle); } + public boolean hashDatabaseHasLegacyLookupIndexOnly(int dbHandle) throws TskCoreException { + return isIdxOnlyHashDbNat(dbHandle); + } + /** * Get the size of the index of the given database * diff --git a/tsk/hashdb/binsrch_index.c b/tsk/hashdb/binsrch_index.c index 59b0874b987c68ac1b3b5fc7dfb102747a1d3420..24f618037f20c0bc07458114120207f79d23071e 100644 --- a/tsk/hashdb/binsrch_index.c +++ b/tsk/hashdb/binsrch_index.c @@ -686,7 +686,7 @@ binsrch_lookup_raw(TSK_HDB_INFO * hdb_info, uint8_t * hash, uint8_t len, } int8_t -binsrch_get_updateable(TSK_HDB_INFO * hdb_info) +binsrch_get_properties(TSK_HDB_INFO * hdb_info) { // Always false hdb_info->idx_info->updateable = 0; diff --git a/tsk/hashdb/hdb_index.cpp b/tsk/hashdb/hdb_index.cpp index 9372fad9155df49bdb667bce294c6189921e51b7..6827c1223a5549504f6ef388f219c064249bd318 100644 --- a/tsk/hashdb/hdb_index.cpp +++ b/tsk/hashdb/hdb_index.cpp @@ -161,18 +161,37 @@ tsk_idx_open(TSK_HDB_INFO * hdb_info, uint8_t htype, uint8_t create) // Try opening an old format index file - // Change the filename to the old format - switch (htype) { - case TSK_HDB_HTYPE_MD5_ID: - TSNPRINTF(idx_info->idx_fname, flen, - _TSK_T("%s-%") PRIcTSK _TSK_T(".idx"), - hdb_info->db_fname, TSK_HDB_HTYPE_MD5_STR); - break; - case TSK_HDB_HTYPE_SHA1_ID: - TSNPRINTF(idx_info->idx_fname, flen, - _TSK_T("%s-%") PRIcTSK _TSK_T(".idx"), - hdb_info->db_fname, TSK_HDB_HTYPE_SHA1_STR); - break; + // Clear index filename + free(idx_info->idx_fname); + idx_info->idx_fname = (TSK_TCHAR *) tsk_malloc(flen * sizeof(TSK_TCHAR)); + if (idx_info->idx_fname == NULL) { + free(idx_info); + // @@@ ERROR INFO NEEDED + return NULL; + } + + // Check if it already has an .idx extension + TSK_TCHAR * c; + c = TSTRRCHR(hdb_info->db_fname, _TSK_T('.')); + if ((c != NULL) && (TSTRLEN(c) >= 4) + && (TSTRCMP(c, _TSK_T(".idx")) == 0)) { + + // Use given db filename as the index filename + TSTRNCPY(idx_info->idx_fname, hdb_info->db_fname, TSTRLEN(hdb_info->db_fname)); + } else { + // Change the filename to the old format + switch (htype) { + case TSK_HDB_HTYPE_MD5_ID: + TSNPRINTF(idx_info->idx_fname, flen, + _TSK_T("%s-%") PRIcTSK _TSK_T(".idx"), + hdb_info->db_fname, TSK_HDB_HTYPE_MD5_STR); + break; + case TSK_HDB_HTYPE_SHA1_ID: + TSNPRINTF(idx_info->idx_fname, flen, + _TSK_T("%s-%") PRIcTSK _TSK_T(".idx"), + hdb_info->db_fname, TSK_HDB_HTYPE_SHA1_STR); + break; + } } idx = tsk_idx_open_file(idx_info->idx_fname); @@ -205,7 +224,7 @@ tsk_idx_open(TSK_HDB_INFO * hdb_info, uint8_t htype, uint8_t create) idx_info->finalize = binsrch_finalize; idx_info->lookup_str = binsrch_lookup_str; idx_info->lookup_raw = binsrch_lookup_raw; - idx_info->get_updateable = binsrch_get_updateable; + idx_info->get_properties = binsrch_get_properties; } else { tsk_error_reset(); @@ -249,7 +268,7 @@ tsk_idx_open(TSK_HDB_INFO * hdb_info, uint8_t htype, uint8_t create) idx_info->finalize = sqlite_v1_finalize; idx_info->lookup_str = sqlite_v1_lookup_str; idx_info->lookup_raw = sqlite_v1_lookup_raw; - idx_info->get_updateable = sqlite_v1_get_updateable; + idx_info->get_properties = sqlite_v1_get_properties; } tsk_idx_close_file(idx); @@ -259,7 +278,7 @@ tsk_idx_open(TSK_HDB_INFO * hdb_info, uint8_t htype, uint8_t create) if (create == 1) { idx_info->updateable = 1; } else { - idx_info->get_updateable(hdb_info); + idx_info->get_properties(hdb_info); } return idx_info; @@ -471,7 +490,24 @@ tsk_hdb_hasindex(TSK_HDB_INFO * hdb_info, uint8_t htype) } } - +/** + * \ingroup hashdblib + * Test for index only (legacy) + * Assumes that the db was opened using the TSK_HDB_OPEN_TRY option. + * + * @param hdb_info Hash database to consider + * + * @return 1 if there is only a legacy index AND no db, 0 otherwise + */ +uint8_t +tsk_hdb_is_idxonly(TSK_HDB_INFO * hdb_info) +{ + if (hdb_info->db_type == TSK_HDB_DBTYPE_IDXONLY_ID) { + return (hdb_info->idx_info->index_type == TSK_HDB_ITYPE_BINSRCH) ? 1 : 0; + } else { + return 0; + } +} /** * \ingroup hashdblib diff --git a/tsk/hashdb/hdb_open.cpp b/tsk/hashdb/hdb_open.cpp index 5c90dd19c45d38b349c729e01254e693ea8450b0..7c86ae748cab6acd9e5989abc96e0cc6bf92fb1c 100644 --- a/tsk/hashdb/hdb_open.cpp +++ b/tsk/hashdb/hdb_open.cpp @@ -35,6 +35,19 @@ tsk_hdb_open(TSK_TCHAR * db_file, TSK_HDB_OPEN_ENUM flags) FILE *hDb; uint8_t dbtype = 0; + if (flags == TSK_HDB_OPEN_TRY) { + TSK_HDB_OPEN_ENUM tryflag = TSK_HDB_OPEN_NONE; + + if ((hdb_info = tsk_hdb_open(db_file, tryflag)) != NULL) { + // success (and there is a src db file existent) + return hdb_info; + } else { + // if null then maybe it's IDX only + flags = TSK_HDB_OPEN_IDXONLY; + // continue this function in IDXONLY mode + } + } + if ((flags & TSK_HDB_OPEN_IDXONLY) == 0) { /* Open the database file */ #ifdef TSK_WIN32 @@ -141,8 +154,8 @@ tsk_hdb_open(TSK_TCHAR * db_file, TSK_HDB_OPEN_ENUM flags) free(hdb_info); return NULL; } - TSTRNCPY(hdb_info->db_fname, db_file, flen); + TSTRNCPY(hdb_info->db_fname, db_file, flen); hdb_info->hash_type = static_cast<TSK_HDB_HTYPE_ENUM>(0); hdb_info->hash_len = 0; @@ -185,6 +198,7 @@ tsk_hdb_open(TSK_TCHAR * db_file, TSK_HDB_OPEN_ENUM flags) break; default: + free(hdb_info); return NULL; } diff --git a/tsk/hashdb/sqlite_index.cpp b/tsk/hashdb/sqlite_index.cpp index b48139b106a037c72dd649526473e3a3377845fb..7652a38cc37ae25d303f70983379bf066f0799f5 100644 --- a/tsk/hashdb/sqlite_index.cpp +++ b/tsk/hashdb/sqlite_index.cpp @@ -26,7 +26,7 @@ static bool need_SQL_index = false; /** * Prototypes */ -int8_t sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info); +int8_t sqlite_v1_get_properties(TSK_HDB_INFO * hdb_info); static int attempt(int resultCode, int expectedResultCode, @@ -501,7 +501,7 @@ sqlite_v1_lookup_raw(TSK_HDB_INFO * hdb_info, uint8_t * hash, uint8_t len, * @return -1 on error, 0 on success. */ int8_t -sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info) +sqlite_v1_get_properties(TSK_HDB_INFO * hdb_info) { int8_t ret = 0; sqlite3_stmt* stmt = NULL; @@ -516,7 +516,7 @@ sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info) const char* value = (const char *)sqlite3_column_text(stmt, 0); if (value == NULL) { - tsk_error_set_errstr2("sqlite_v1_get_updateable: null value"); + tsk_error_set_errstr2("sqlite_v1_get_properties: null value"); ret = -1; } else { // Set the updateable flag @@ -525,7 +525,7 @@ sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info) } } } else { - tsk_error_set_errstr2("sqlite_v1_get_updateable"); + tsk_error_set_errstr2("sqlite_v1_get_properties"); ret = -1; } @@ -535,6 +535,9 @@ sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info) finalize_stmt(stmt); } + + ///@todo load db name property as well? + tsk_release_lock(&hdb_info->lock); return ret; diff --git a/tsk/hashdb/tsk_hashdb.h b/tsk/hashdb/tsk_hashdb.h index 0d33a672d27488668df1cd8e7065dfd7c59a8575..e3059edd117909d9ed6492a7d3974900d2e00756 100644 --- a/tsk/hashdb/tsk_hashdb.h +++ b/tsk/hashdb/tsk_hashdb.h @@ -166,7 +166,7 @@ extern "C" { TSK_HDB_LOOKUP_FN, void *); int8_t(*lookup_raw) (TSK_HDB_INFO *, uint8_t *, uint8_t, TSK_HDB_FLAG_ENUM, TSK_HDB_LOOKUP_FN, void *); - int8_t(*get_updateable) (TSK_HDB_INFO *); + int8_t(*get_properties) (TSK_HDB_INFO *); void(*close) (TSK_IDX_INFO *); }; @@ -201,7 +201,8 @@ extern "C" { */ enum TSK_HDB_OPEN_ENUM { TSK_HDB_OPEN_NONE = 0, ///< No special flags - TSK_HDB_OPEN_IDXONLY = (0x1 << 0) ///< Open only the index -- do not look for the original DB + TSK_HDB_OPEN_IDXONLY = (0x1 << 0), ///< Open only the index -- do not look for the original DB + TSK_HDB_OPEN_TRY = (0x1 << 1) ///< Try to open original db. If that fails, try TSK_HDB_OPEN_IDXONLY. }; typedef enum TSK_HDB_OPEN_ENUM TSK_HDB_OPEN_ENUM; @@ -213,6 +214,8 @@ extern "C" { extern uint8_t tsk_hdb_hasindex(TSK_HDB_INFO *, uint8_t htype); + extern uint8_t tsk_hdb_is_idxonly(TSK_HDB_INFO *); + extern uint8_t tsk_hdb_makeindex(TSK_HDB_INFO *, TSK_TCHAR *); extern TSK_HDB_INFO * tsk_hdb_new(TSK_TCHAR * db_file); diff --git a/tsk/hashdb/tsk_hashdb_i.h b/tsk/hashdb/tsk_hashdb_i.h index e2c7bb20f923630d2fc365a35d9c90c913f9d423..e3f63fd518cad4f1b8901ac2dc9e5915c60318d5 100644 --- a/tsk/hashdb/tsk_hashdb_i.h +++ b/tsk/hashdb/tsk_hashdb_i.h @@ -131,7 +131,7 @@ extern "C" { TSK_HDB_FLAG_ENUM, TSK_HDB_LOOKUP_FN, void *); extern int8_t binsrch_lookup_raw(TSK_HDB_INFO *, uint8_t *, uint8_t, TSK_HDB_FLAG_ENUM, TSK_HDB_LOOKUP_FN, void *); - extern int8_t binsrch_get_updateable(TSK_HDB_INFO * hdb_info); + extern int8_t binsrch_get_properties(TSK_HDB_INFO * hdb_info); extern uint8_t sqlite_v1_open(TSK_HDB_INFO *, TSK_IDX_INFO *, uint8_t); extern void sqlite_v1_close(TSK_IDX_INFO *); @@ -145,7 +145,7 @@ extern "C" { TSK_HDB_FLAG_ENUM, TSK_HDB_LOOKUP_FN, void *); extern int8_t sqlite_v1_lookup_raw(TSK_HDB_INFO *, uint8_t *, uint8_t, TSK_HDB_FLAG_ENUM, TSK_HDB_LOOKUP_FN, void *); - extern int8_t sqlite_v1_get_updateable(TSK_HDB_INFO * hdb_info); + extern int8_t sqlite_v1_get_properties(TSK_HDB_INFO * hdb_info); extern uint8_t sqlite3_test(FILE *); #ifdef __cplusplus }