Skip to content

Commit 3e0beb6

Browse files
committed
Resolved conflicts from merge of hashdb_sqlite branch
2 parents 9259dc0 + f626a69 commit 3e0beb6

22 files changed

+3247
-1484
lines changed

API-CHANGES.txt

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
Changes to make once we are ready to do a backwards incompatible change.
22
- TSK_SERVICE_ACCOUNT to TSK_ACCOUNT
33
- HashDB to use new TSK_BASE_HASHDB enum instead of its own ENUM
4-
- Java SleuthkitCase.addArtifactType shoudl return different if artifact already exists or getArtifactId should....
5-
- Java SleuthkitCase.findFilesWhere should return AbstractFile liek findFiles
4+
- Java SleuthkitCase.addArtifactType should return different if artifact already exists or getArtifactId should....
5+
- Java SleuthkitCase.findFilesWhere should return AbstractFile like findFiles
66
- getUniquePath() should not throw exception.
77
- findFilesInImage should return an enum like TskDB methods differentiating if any data was found or not.
8-
- remove addImageInfo in db_Sqlite that does not take MD5, and/oor make it take IMG_INFO as argument
9-
8+
- remove addImageInfo in db_Sqlite that does not take MD5, and/or make it take IMG_INFO as argument

bindings/java/jni/dataModel_SleuthkitJNI.cpp

+229-14
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ using std::stringstream;
2626
using std::for_each;
2727

2828
static TSK_HDB_INFO * m_NSRLDb = NULL;
29-
static std::vector<TSK_HDB_INFO *> m_knownbads;
29+
static std::vector<TSK_HDB_INFO *> m_hashDbs;
3030

3131
/*
3232
* JNI file handle structure encapsulates both
@@ -274,7 +274,7 @@ JNIEXPORT jint JNICALL
274274
TSK_TCHAR pathT[1024];
275275
toTCHAR(env, pathT, 1024, pathJ);
276276

277-
TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_IDXONLY;
277+
TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_TRY;
278278
TSK_HDB_INFO * tempdb = tsk_hdb_open(pathT, flags);
279279

280280
if(tempdb == NULL)
@@ -302,7 +302,7 @@ JNIEXPORT jint JNICALL
302302
TSK_TCHAR pathT[1024];
303303
toTCHAR(env, pathT, 1024, pathJ);
304304

305-
TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_IDXONLY;
305+
TSK_HDB_OPEN_ENUM flags = TSK_HDB_OPEN_TRY;
306306
TSK_HDB_INFO * temp = tsk_hdb_open(pathT, flags);
307307

308308
if(temp == NULL)
@@ -311,19 +311,143 @@ JNIEXPORT jint JNICALL
311311
return -1;
312312
}
313313

314-
m_knownbads.push_back(temp);
314+
m_hashDbs.push_back(temp);
315315

316-
return m_knownbads.size();
316+
return m_hashDbs.size();
317317
}
318318

319319
/*
320-
* Get the name of the database pointed to by path
320+
* Create a new hash db.
321321
* @param env pointer to java environment this was called from
322322
* @param obj the java object this was called from
323323
* @param pathJ the path to the database
324+
* @return a handle for the database
325+
*/
326+
JNIEXPORT jint JNICALL
327+
Java_org_sleuthkit_datamodel_SleuthkitJNI_newDbKnownBadNat(JNIEnv * env,
328+
jclass obj, jstring pathJ)
329+
{
330+
TSK_TCHAR pathT[1024];
331+
toTCHAR(env, pathT, 1024, pathJ);
332+
333+
TSK_HDB_INFO * temp = tsk_hdb_new(pathT);
334+
335+
if(temp == NULL)
336+
{
337+
setThrowTskCoreError(env);
338+
return -1;
339+
}
340+
341+
m_hashDbs.push_back(temp);
342+
343+
return m_hashDbs.size();
344+
}
345+
346+
/*
347+
* Add entry to hash db.
348+
* @param env pointer to java environment this was called from
349+
* @param obj the java object this was called from
350+
* @param filenameJ Name of the file that was hashed (can be empty)
351+
* @param hashMd5J Text of MD5 hash (can be empty)
352+
* @param hashSha1J Text of SHA1 hash (can be empty)
353+
* @param hashSha256J Text of SHA256 hash (can be empty)
354+
* @param dbHandle Which DB.
355+
* @return 1 on error and 0 on success
356+
*/
357+
JNIEXPORT jint JNICALL
358+
Java_org_sleuthkit_datamodel_SleuthkitJNI_addStrDbKnownBadNat(JNIEnv * env,
359+
jclass obj, jstring filenameJ, jstring hashMd5J, jstring hashSha1J, jstring hashSha256J, jint dbHandle)
360+
{
361+
int8_t retval = 0;
362+
363+
if((size_t) dbHandle > m_hashDbs.size()) {
364+
setThrowTskCoreError(env, "Invalid database handle");
365+
retval = 1;
366+
} else {
367+
jboolean isCopy;
368+
const char *md5 = (const char *) env->GetStringUTFChars(hashMd5J, &isCopy);
369+
const char *sha1 = (const char *) env->GetStringUTFChars(hashSha1J, &isCopy);
370+
const char *sha256 = (const char *) env->GetStringUTFChars(hashSha256J, &isCopy);
371+
372+
TSK_TCHAR filenameT[1024];
373+
toTCHAR(env, filenameT, 1024, filenameJ);
374+
375+
TSK_HDB_INFO * db = m_hashDbs.at(dbHandle-1);
376+
377+
if(db != NULL) {
378+
retval = tsk_hdb_add_str(db, filenameT, md5, sha1, sha256);
379+
380+
if (retval == 1) {
381+
setThrowTskCoreError(env);
382+
}
383+
}
384+
385+
env->ReleaseStringUTFChars(hashMd5J, (const char *) md5);
386+
env->ReleaseStringUTFChars(hashSha1J, (const char *) sha1);
387+
env->ReleaseStringUTFChars(hashSha256J, (const char *) sha256);
388+
}
389+
390+
return retval;
391+
}
392+
393+
/*
394+
* Get updateable state.
395+
* @param env pointer to java environment this was called from
396+
* @param obj the java object this was called from
397+
* @param dbHandle Which DB.
398+
* @return true if db can be updated
399+
*/
400+
JNIEXPORT jboolean JNICALL
401+
Java_org_sleuthkit_datamodel_SleuthkitJNI_isUpdateableDbKnownBadNat(JNIEnv * env,
402+
jclass obj, jint dbHandle)
403+
{
404+
bool retval = false;
405+
406+
if((size_t) dbHandle > m_hashDbs.size()) {
407+
setThrowTskCoreError(env, "Invalid database handle");
408+
} else {
409+
TSK_HDB_INFO * db = m_hashDbs.at(dbHandle-1);
410+
411+
if(db != NULL) {
412+
retval = (db->idx_info->updateable == 1) ? true : false;
413+
}
414+
}
415+
return retval;
416+
}
417+
418+
/*
419+
* Test for index only (no original Db file) legacy (IDX format).
420+
* @param env pointer to java environment this was called from
421+
* @param obj the java object this was called from
422+
* @param dbHandle Which DB.
423+
* @return true if index only AND is legacy
424+
*/
425+
JNIEXPORT jboolean JNICALL
426+
Java_org_sleuthkit_datamodel_SleuthkitJNI_isIdxOnlyHashDbNat(JNIEnv * env,
427+
jclass obj, jint dbHandle)
428+
{
429+
bool retval = false;
430+
431+
if((size_t) dbHandle > m_hashDbs.size()) {
432+
setThrowTskCoreError(env, "Invalid database handle");
433+
} else {
434+
TSK_HDB_INFO * db = m_hashDbs.at(dbHandle-1);
435+
436+
if(db != NULL) {
437+
retval = (tsk_hdb_is_idxonly(db) == 1) ? true : false;
438+
}
439+
}
440+
return retval;
441+
}
442+
443+
/*
444+
* Get the name of the database pointed to by path
445+
* @param env pointer to java environment this was called from
446+
* @param obj the java object this was called from
447+
* @param pathJ the path to the database (expects the actual database path, not an index path)
324448
*/
325449
JNIEXPORT jstring JNICALL
326-
Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName(JNIEnv * env,
450+
Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbNameByPath(JNIEnv * env,
327451
jclass obj, jstring pathJ) {
328452

329453
TSK_HDB_OPEN_ENUM flags;
@@ -350,6 +474,30 @@ JNIEXPORT jstring JNICALL
350474
return jname;
351475
}
352476

477+
/*
478+
* Get the name of the database pointed to by path
479+
* @param env pointer to java environment this was called from
480+
* @param obj the java object this was called from
481+
* @param dbHandle Which DB.
482+
*/
483+
JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getDbName
484+
(JNIEnv * env, jclass obj, jint dbHandle)
485+
{
486+
if((size_t) dbHandle > m_hashDbs.size()) {
487+
setThrowTskCoreError(env, "Invalid database handle");
488+
return env->NewStringUTF("-1");
489+
} else {
490+
TSK_HDB_INFO * temp = m_hashDbs.at(dbHandle-1);
491+
if (temp == NULL) {
492+
setThrowTskCoreError(env, "Error: database object is null");
493+
return env->NewStringUTF("-1");
494+
}
495+
496+
497+
jstring jname = env->NewStringUTF(temp->db_name);
498+
return jname;
499+
}
500+
}
353501

354502
JNIEXPORT void JNICALL
355503
Java_org_sleuthkit_datamodel_SleuthkitJNI_closeDbLookupsNat(JNIEnv * env,
@@ -360,9 +508,9 @@ JNIEXPORT void JNICALL
360508
m_NSRLDb = NULL;
361509
}
362510

363-
for_each(m_knownbads.begin(), m_knownbads.end(), tsk_hdb_close);
511+
for_each(m_hashDbs.begin(), m_hashDbs.end(), tsk_hdb_close);
364512

365-
m_knownbads.clear();
513+
m_hashDbs.clear();
366514
}
367515

368516
/*
@@ -402,7 +550,7 @@ JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_nsrlDbLookup
402550
JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_knownBadDbLookup
403551
(JNIEnv * env, jclass obj, jstring hash, jint dbHandle){
404552

405-
if((size_t) dbHandle > m_knownbads.size()) {
553+
if((size_t) dbHandle > m_hashDbs.size()) {
406554
setThrowTskCoreError(env, "Invalid database handle");
407555
return -1;
408556
}
@@ -415,7 +563,7 @@ JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_knownBadDbLooku
415563

416564

417565

418-
TSK_HDB_INFO * db = m_knownbads.at(dbHandle-1);
566+
TSK_HDB_INFO * db = m_hashDbs.at(dbHandle-1);
419567

420568
if(db != NULL) {
421569
int8_t retval = tsk_hdb_lookup_str(db, md5, TSK_HDB_FLAG_QUICK, NULL, NULL);
@@ -1349,7 +1497,7 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_startVerboseLoggingNat
13491497
* @param dbPathJ path for the database
13501498
*/
13511499
JNIEXPORT void JNICALL
1352-
Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexNat (JNIEnv * env,
1500+
Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexByPathNat (JNIEnv * env,
13531501
jclass obj, jstring dbPathJ)
13541502
{
13551503
TSK_TCHAR dbPathT[1024];
@@ -1384,13 +1532,56 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexNat (JNIEnv * env,
13841532
tsk_hdb_close(temp);
13851533
}
13861534

1535+
/*
1536+
* Create an index for the given database
1537+
* @param env pointer to java environment this was called from
1538+
* @param obj the java object this was called from
1539+
* @param dbHandle handle for the database
1540+
*/
1541+
JNIEXPORT void JNICALL
1542+
Java_org_sleuthkit_datamodel_SleuthkitJNI_createLookupIndexNat (JNIEnv * env,
1543+
jclass obj, jint dbHandle)
1544+
{
1545+
if((size_t) dbHandle > m_hashDbs.size()) {
1546+
setThrowTskCoreError(env, "Invalid database handle");
1547+
return;
1548+
} else {
1549+
TSK_HDB_INFO * temp = m_hashDbs.at(dbHandle-1);
1550+
if (temp == NULL) {
1551+
setThrowTskCoreError(env, "Error: database object is null");
1552+
return;
1553+
}
1554+
1555+
TSK_TCHAR dbType[1024];
1556+
1557+
if(temp->db_type == TSK_HDB_DBTYPE_MD5SUM_ID) {
1558+
TSNPRINTF(dbType, 1024, _TSK_T("%") PRIcTSK, TSK_HDB_DBTYPE_MD5SUM_STR);
1559+
}
1560+
else if(temp->db_type == TSK_HDB_DBTYPE_HK_ID) {
1561+
TSNPRINTF(dbType, 1024, _TSK_T("%") PRIcTSK, TSK_HDB_DBTYPE_HK_STR);
1562+
}
1563+
else if(temp->db_type == TSK_HDB_DBTYPE_ENCASE_ID) {
1564+
TSNPRINTF(dbType, 1024, _TSK_T("%") PRIcTSK, TSK_HDB_DBTYPE_ENCASE_STR);
1565+
}
1566+
else {
1567+
TSNPRINTF(dbType, 1024, _TSK_T("%") PRIcTSK, TSK_HDB_DBTYPE_NSRL_MD5_STR);
1568+
}
1569+
1570+
if (tsk_hdb_makeindex(temp, dbType)) {
1571+
setThrowTskCoreError(env, "Error creating index");
1572+
}
1573+
1574+
return;
1575+
}
1576+
}
1577+
13871578
/*
13881579
* Check if an index exists for the given database path.
13891580
* @param env pointer to java environment this was called from
13901581
* @param obj the java object this was called from
13911582
* @param dbPathJ path for the database
13921583
*/
1393-
JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_lookupIndexExistsNat
1584+
JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_lookupIndexExistsByPathNat
13941585
(JNIEnv * env, jclass obj, jstring dbPathJ) {
13951586

13961587
TSK_TCHAR dbPathT[1024];
@@ -1408,6 +1599,30 @@ JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_lookupIndex
14081599
return (jboolean) retval == 1;
14091600
}
14101601

1602+
/*
1603+
* Check if an index exists for the given database.
1604+
* @param env pointer to java environment this was called from
1605+
* @param obj the java object this was called from
1606+
* @param dbHandle handle for the database
1607+
*/
1608+
JNIEXPORT jboolean JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_lookupIndexExistsNat
1609+
(JNIEnv * env, jclass obj, jint dbHandle) {
1610+
1611+
if((size_t) dbHandle > m_hashDbs.size()) {
1612+
setThrowTskCoreError(env, "Invalid database handle");
1613+
return (jboolean) false;
1614+
} else {
1615+
TSK_HDB_INFO * temp = m_hashDbs.at(dbHandle-1);
1616+
if (temp == NULL) {
1617+
return (jboolean) false;
1618+
}
1619+
1620+
uint8_t retval = tsk_hdb_hasindex(temp, TSK_HDB_HTYPE_MD5_ID);
1621+
1622+
return (jboolean) retval == 1;
1623+
}
1624+
}
1625+
14111626
/*
14121627
* Get the size of the index for the database at the given path
14131628
* @param env pointer to java environment this was called from
@@ -1428,7 +1643,7 @@ JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getIndexSizeNat
14281643
}
14291644

14301645
if(tsk_hdb_hasindex(temp, TSK_HDB_HTYPE_MD5_ID)) {
1431-
return (jint) ((temp->idx_size - temp->idx_off) / (temp->idx_llen));
1646+
return (jint) ((temp->idx_info->idx_struct.idx_binsrch->idx_size - temp->idx_info->idx_struct.idx_binsrch->idx_off) / (temp->idx_info->idx_struct.idx_binsrch->idx_llen));
14321647
}
14331648

14341649

0 commit comments

Comments
 (0)