diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index 4a1fbe520e0ab5fd1a3cc35c5249da3b1a228565..dd3df9d32e6f2032bf52584df1914628ad435b58 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -978,40 +978,47 @@ JNIEXPORT jlong JNICALL } - /* - * Create a database for the given image using a pre-created process which can be cancelled. + * Add an image to a database using a pre-created process, which can be cancelled. * MUST call commitAddImg or revertAddImg afterwards once runAddImg returns. If there is an * error, you do not need to call revert or commit and the 'process' handle will be deleted. * @return the 0 for success 1 for failure * @param env pointer to java environment this was called from * @param obj the java object this was called from * @param process the add-image process created by initAddImgNat + * @param dataSrcId An ascii-printable identifier for the data source that is unique across multiple cases (e.g., a UUID) * @param paths array of strings from java, the paths to the image parts - * @param num_imgs number of image parts - * @param timezone the timezone the image is from + * @param numImgs number of image parts + * @param timeZone the timezone the image is from */ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env, - jclass obj, jlong process, jobjectArray paths, jint num_imgs, jstring timezone) { - jboolean isCopy; + jclass obj, jlong process, jstring dataSrcId, jobjectArray paths, jint numImgs, jstring timeZone) { TskAutoDb *tskAuto = ((TskAutoDb *) process); if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) { - setThrowTskCoreError(env, - "runAddImgNat: Invalid TskAutoDb object passed in"); + setThrowTskCoreError(env, + "runAddDataSourceNat: Invalid TskAutoDb object passed in"); return; } - // move the strings into the C++ world + jboolean isCopy; + const char *data_src_id = NULL; + if (NULL != dataSrcId) { + data_src_id = (const char *) env->GetStringUTFChars(dataSrcId, &isCopy); + if (NULL == data_src_id) { + setThrowTskCoreError(env, "runAddDataSourceNat: Can't convert data source id string"); + return; + } + } - // get pointers to each of the file names - char **imagepaths8 = (char **) tsk_malloc(num_imgs * sizeof(char *)); + // Get pointers to each of the image file names. + char **imagepaths8 = (char **) tsk_malloc(numImgs * sizeof(char *)); if (imagepaths8 == NULL) { setThrowTskCoreError(env); return; } - for (int i = 0; i < num_imgs; i++) { + for (int i = 0; i < numImgs; i++) { jstring jsPath = (jstring) env->GetObjectArrayElement(paths, i); imagepaths8[i] = @@ -1024,19 +1031,18 @@ JNIEXPORT void JNICALL return; } } - - if (env->GetStringLength(timezone) > 0) { - const char * tzchar = env-> - GetStringUTFChars(timezone, &isCopy); - tskAuto->setTz(string(tzchar)); - env->ReleaseStringUTFChars(timezone, tzchar); + // Set the time zone. + if (env->GetStringLength(timeZone) > 0) { + const char *time_zone = env->GetStringUTFChars(timeZone, &isCopy); + tskAuto->setTz(string(time_zone)); + env->ReleaseStringUTFChars(timeZone, time_zone); } - // process the image (parts) + // Add the data source. uint8_t ret = 0; - if ( (ret = tskAuto->startAddImage((int) num_imgs, imagepaths8, - TSK_IMG_TYPE_DETECT, 0)) != 0) { + if ( (ret = tskAuto->startAddImage((int) numImgs, imagepaths8, + TSK_IMG_TYPE_DETECT, 0, data_src_id)) != 0) { stringstream msgss; msgss << "Errors occured while ingesting image " << std::endl; vector<TskAuto::error_record> errors = tskAuto->getErrorList(); @@ -1066,8 +1072,8 @@ JNIEXPORT void JNICALL //close image first before freeing the image paths tskAuto->closeImage(); - // cleanup - for (int i = 0; i < num_imgs; i++) { + // Cleanup + for (int i = 0; i < numImgs; i++) { jstring jsPath = (jstring) env->GetObjectArrayElement(paths, i); env-> @@ -1075,95 +1081,6 @@ JNIEXPORT void JNICALL env->DeleteLocalRef(jsPath); } free(imagepaths8); - - // if process completes successfully, must call revertAddImgNat or commitAddImgNat to free the TskAutoDb -} - -/* - * Create a database for the given image using a pre-created process which can be cancelled. - * MUST call commitAddImg or revertAddImg afterwards once runAddImg returns. If there is an - * error, you do not need to call revert or commit and the 'process' handle will be deleted. - * @return the 0 for success 1 for failure - * @param env pointer to java environment this was called from - * @param obj the java object this was called from - * @param process the add-image process created by initAddImgNat - * @param dataSrcId An identifier for the data source that is unique across multiple cases (e.g., a UUID) - * @param imgPath The full path to the image - * @param timezone the timezone the image is from - */ -JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddDataSourceNat(JNIEnv * env, jclass obj, jlong process, jstring dataSrcId, jstring imgPath, jstring timeZone) { - - // Validate arguments. - TskAutoDb *tskAuto = ((TskAutoDb *) process); - if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) { - setThrowTskCoreError(env, "runAddImgNat: Invalid process argument"); - return; - } - if (env->GetStringLength(dataSrcId) <= 0) { - setThrowTskCoreError(env, "runAddImgNat: Invalid data source id argument"); - return; - } - if (env->GetStringLength(imgPath) <= 0) { - setThrowTskCoreError(env, "runAddImgNat: Invalid image path argument"); - return; - } - - // Convert the string arguments into native strings. - jboolean isCopy; - const char *data_src_id = (const char *) env->GetStringUTFChars(dataSrcId, &isCopy); - if (NULL == data_src_id) { - setThrowTskCoreError(env, "runAddImgNat: Can't convert data source id string"); - return; - } - char **image_paths = (char **) tsk_malloc(1 * sizeof(char *)); - if (NULL == image_paths) { - setThrowTskCoreError(env, "runAddImgNat: Can't malloc array for image path string"); - env->ReleaseStringUTFChars(dataSrcId, (const char *) data_src_id); - return; - } - image_paths[0] = (char *) env->GetStringUTFChars(imgPath, &isCopy); - - // Set the time zone. - if (env->GetStringLength(timeZone) > 0) { - const char *time_zone = env->GetStringUTFChars(timeZone, &isCopy); - tskAuto->setTz(string(time_zone)); - env->ReleaseStringUTFChars(timeZone, time_zone); - } - - // Add the image. - uint8_t ret = 0; - if ( (ret = tskAuto->startAddImage(1, image_paths, TSK_IMG_TYPE_DETECT, 0)) != 0) { - stringstream msgss; - msgss << "runAddImgNat: Errors occured while ingesting image " << std::endl; - vector<TskAuto::error_record> errors = tskAuto->getErrorList(); - for (size_t i = 0; i < errors.size(); i++) { - msgss << (i+1) << ". "; - msgss << (TskAuto::errorRecordToString(errors[i])); - msgss << " " << std::endl; - } - if (ret == 1) { - //fatal error - setThrowTskCoreError(env, msgss.str().c_str()); - } - else if (ret == 2) { - if(tskAuto->isDbOpen()) { - // if we can still talk to the database, it's a non-fatal error - setThrowTskDataError(env, msgss.str().c_str()); - } - else { - // we cannot talk to the database, fatal error - setThrowTskCoreError(env, msgss.str().c_str()); - } - } - } - - // @@@ SHOULD WE CLOSE HERE before we commit / revert etc. - //close image first before freeing the image paths - tskAuto->closeImage(); - - // cleanup - env->ReleaseStringUTFChars(imgPath, (const char *) image_paths[0]); - free(image_paths); env->ReleaseStringUTFChars(dataSrcId, (const char *) data_src_id); // if process completes successfully, must call revertAddImgNat or commitAddImgNat to free the TskAutoDb diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h index 1e205fa53e62b748c7802249912b3a6fed563fe4..07b59c69fd3fe1439f4f676da7fccae1504b6721 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.h +++ b/bindings/java/jni/dataModel_SleuthkitJNI.h @@ -218,18 +218,10 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_initAddImgNat /* * Class: org_sleuthkit_datamodel_SleuthkitJNI * Method: runAddImgNat - * Signature: (J[Ljava/lang/String;ILjava/lang/String;)V + * Signature: (JLjava/lang/String;[Ljava/lang/String;ILjava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat - (JNIEnv *, jclass, jlong, jobjectArray, jint, jstring); - -/* - * Class: org_sleuthkit_datamodel_SleuthkitJNI - * Method: runAddDataSourceNat - * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddDataSourceNat - (JNIEnv *, jclass, jlong, jstring, jstring, jstring); + (JNIEnv *, jclass, jlong, jstring, jobjectArray, jint, jstring); /* * Class: org_sleuthkit_datamodel_SleuthkitJNI diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index b3c7952bcc686d162c04541e7f291b699f25aab2..f97c551dc052f0132f9f93a35a58bc6c4e6e1fe3 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -100,9 +100,7 @@ public class SleuthkitJNI { //add image private static native long initAddImgNat(long db, String timezone, boolean addUnallocSpace, boolean noFatFsOrphans) throws TskCoreException; - private static native void runAddImgNat(long process, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called - - private static native void runAddDataSourceNat(long process, String dataSourceId, String imgPath, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called + private static native void runAddImgNat(long process, String dataSourceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called private static native void stopAddImgNat(long process) throws TskCoreException; @@ -249,40 +247,32 @@ private AddImageProcess(String timezone, boolean addUnallocSpace, boolean noFatF * Start the process of adding an image to the case database. MUST * call either commit() or revert() after calling run(). * - * @param imgPath Full path(s) to the image file(s). + * @param imageFilePaths Full path(s) to the image file(s). * @throws TskCoreException exception thrown if critical error * occurs within TSK * @throws TskDataException exception thrown if non-critical error * occurs within TSK (should be OK to continue) + * @deprecated Use run(String dataSourceId, String[] imageFilePaths) + * instead */ - public void run(String[] imgPath) throws TskCoreException, TskDataException { - if (autoDbPointer != 0) { - throw new TskCoreException("AddImgProcess:run: AutoDB pointer is already set"); - } - - synchronized (this) { - autoDbPointer = initAddImgNat(caseDbPointer, timezoneLongToShort(timezone), addUnallocSpace, noFatFsOrphans); - } - if (autoDbPointer == 0) { - //additional check in case initAddImgNat didn't throw exception - throw new TskCoreException("AddImgProcess::run: AutoDB pointer is NULL after initAddImgNat"); - } - runAddImgNat(autoDbPointer, imgPath, imgPath.length, timezone); + @Deprecated + public void run(String[] imageFilePaths) throws TskCoreException, TskDataException { + run(null, imageFilePaths); } /** * Start the process of adding an image to the case database. MUST * call either commit() or revert() after calling run(). * - * @param dataSourceId An identifier for the data source that is - * unique across multiple cases (e.g., a UUID). - * @param imgPath Full path to the image file. + * @param dataSourceId An ASCII-printable identifier for the data + * source that is unique across multiple cases (e.g., a UUID). + * @param imageFilePaths Full paths to the image files. * @throws TskCoreException exception thrown if critical error * occurs within TSK * @throws TskDataException exception thrown if non-critical error * occurs within TSK (should be OK to continue) */ - public void run(String dataSourceId, String imagePath) throws TskCoreException, TskDataException { + public void run(String dataSourceId, String[] imageFilePaths) throws TskCoreException, TskDataException { if (autoDbPointer != 0) { throw new TskCoreException("AddImgProcess:run: AutoDB pointer is already set"); } @@ -294,7 +284,7 @@ public void run(String dataSourceId, String imagePath) throws TskCoreException, //additional check in case initAddImgNat didn't throw exception throw new TskCoreException("AddImgProcess::run: AutoDB pointer is NULL after initAddImgNat"); } - runAddDataSourceNat(autoDbPointer, dataSourceId, imagePath, timezone); + runAddImgNat(autoDbPointer, dataSourceId, imageFilePaths, imageFilePaths.length, timezone); } /** diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index 70eaf9143e114f8773933810536eccf364ae386e..3d764dc30576d6f905b3b9554d6cea37d46860a4 100644 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -108,7 +108,7 @@ void TskAutoDb::setAddUnallocSpace(bool addUnallocSpace, int64_t chunkSize) uint8_t TskAutoDb::openImageUtf8(int a_num, const char *const a_images[], - TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize) + TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* dataSourceId) { uint8_t retval = TskAuto::openImageUtf8(a_num, a_images, a_type, a_ssize); @@ -116,7 +116,7 @@ uint8_t return retval; } - if (addImageDetails(a_images, a_num)) { + if (addImageDetails(dataSourceId, a_images, a_num)) { return 1; } return 0; @@ -124,7 +124,7 @@ uint8_t uint8_t TskAutoDb::openImage(int a_num, const TSK_TCHAR * const a_images[], - TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize) + TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* dataSourceId) { // make name of database @@ -164,7 +164,7 @@ uint8_t img_ptrs[i] = img2; } - if (addImageDetails(img_ptrs, a_num)) { + if (addImageDetails(dataSourceId, img_ptrs, a_num)) { //cleanup for (int i = 0; i < a_num; ++i) { free(img_ptrs[i]); @@ -181,7 +181,7 @@ uint8_t return 0; #else - return openImageUtf8(a_num, a_images, a_type, a_ssize); + return openImageUtf8(a_num, a_images, a_type, a_ssize, dataSourceId); #endif } @@ -191,10 +191,10 @@ uint8_t * @return Returns 1 on error */ uint8_t -TskAutoDb::addImageDetails(const char *const img_ptrs[], int a_num) +TskAutoDb::addImageDetails(const char* dataSourceId, const char *const img_ptrs[], int a_num) { - string md5 = ""; #if HAVE_LIBEWF + string md5 = ""; if (m_img_info->itype == TSK_IMG_TYPE_EWF_EWF) { // @@@ This shoudl really probably be inside of a tsk_img_ method IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *)m_img_info; @@ -204,8 +204,14 @@ TskAutoDb::addImageDetails(const char *const img_ptrs[], int a_num) } #endif + string dataSrcId; + if (NULL != dataSourceId) { + dataSrcId = dataSourceId; + } else { + dataSourceId = ""; + } if (m_db->addImageInfo(m_img_info->itype, m_img_info->sector_size, - m_curImgId, m_curImgTZone, m_img_info->size, md5)) { + m_curImgId, m_curImgTZone, m_img_info->size, md5, dataSourceId)) { registerError(); return 1; } @@ -378,7 +384,7 @@ uint8_t TskAutoDb::addFilesInImgToDb() */ uint8_t TskAutoDb::startAddImage(int numImg, const TSK_TCHAR * const imagePaths[], - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize) + TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId) { if (tsk_verbose) tsk_fprintf(stderr, "TskAutoDb::startAddImage: Starting add image process\n"); @@ -407,7 +413,7 @@ uint8_t m_imgTransactionOpen = true; - if (openImage(numImg, imagePaths, imgType, sSize)) { + if (openImage(numImg, imagePaths, imgType, sSize, dataSourceId)) { tsk_error_set_errstr2("TskAutoDb::startAddImage"); registerError(); if (revertAddImage()) @@ -418,10 +424,11 @@ uint8_t return addFilesInImgToDb(); } + #ifdef WIN32 uint8_t TskAutoDb::startAddImage(int numImg, const char *const imagePaths[], - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize) + TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId) { if (tsk_verbose) tsk_fprintf(stderr, "TskAutoDb::startAddImage_utf8: Starting add image process\n"); @@ -452,7 +459,7 @@ uint8_t m_imgTransactionOpen = true; - if (openImageUtf8(numImg, imagePaths, imgType, sSize)) { + if (openImageUtf8(numImg, imagePaths, imgType, sSize, dataSourceId)) { tsk_error_set_errstr2("TskAutoDb::startAddImage"); registerError(); if (revertAddImage()) diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp index 832339715221f27cb0abb638c4c17f108c3cf134..7e670dbe91c86cbda696f0bc4c5474fd8900999b 100755 --- a/tsk/auto/db_postgresql.cpp +++ b/tsk/auto/db_postgresql.cpp @@ -299,7 +299,7 @@ int TskDbPostgreSQL::attempt_exec(const char *sql, const char *errfmt) * Validate string that was escaped by a call to PQescapeLiteral(). Sets TSK error values on error. * @returns 1 if string is valid, 0 otherwise */ -int TskDbPostgreSQL::isEscapedStringValid(char *sql_str, char *orig_str, const char *errfmt){ +int TskDbPostgreSQL::isEscapedStringValid(const char *sql_str, const char *orig_str, const char *errfmt){ if (!sql_str){ tsk_error_reset(); @@ -680,7 +680,7 @@ TSK_RETVAL_ENUM TskDbPostgreSQL::getVsInfo(int64_t objId, TSK_DB_VS_INFO & vsInf } /** -* deprecated +* @deprecated */ int TskDbPostgreSQL::addImageInfo(int type, int size, int64_t & objId, const string & timezone) { @@ -692,29 +692,30 @@ int TskDbPostgreSQL::addImageInfo(int type, int size, int64_t & objId, const str */ int TskDbPostgreSQL::addImageInfo(int type, int ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5) { - char stmt[2048]; - int expectedNumFileds = 1; + return addImageInfo(type, size, objId, timezone, 0, "", ""); +} +/** +* @returns 1 on error, 0 on success +*/ +int TskDbPostgreSQL::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId) +{ + // Add the data source to the tsk_objects table. // We don't use addObject because we're passing in NULL as the parent + char stmt[2048]; + int expectedNumFileds = 1; snprintf(stmt, 2048, "INSERT INTO tsk_objects (par_obj_id, type) VALUES (NULL, %d) RETURNING obj_id;", TSK_DB_OBJECT_TYPE_IMG); PGresult *res = get_query_result_set(stmt, "TskDbPostgreSQL::addObj: Error adding object to row: %s (result code %d)\n"); - - // check if a valid result set was returned if (verifyNonEmptyResultSetSize(stmt, res, expectedNumFileds, "TskDbPostgreSQL::addObj: Unexpected number of results: Expected %d, Received %d\n")) { return 1; } - - // Returned value is objId objId = atoll(PQgetvalue(res, 0, 0)); - // replace all non-UTF8 characters + // Add the data source to the tsk_image_info table. char timeZone_local[MAX_DB_STRING_LENGTH]; removeNonUtf8(timeZone_local, MAX_DB_STRING_LENGTH - 1, timezone.c_str()); - char md5_local[MAX_DB_STRING_LENGTH]; removeNonUtf8(md5_local, MAX_DB_STRING_LENGTH - 1, md5.c_str()); - - // escape strings for use within an SQL command char *timezone_sql = PQescapeLiteral(conn, timeZone_local, strlen(timeZone_local)); char *md5_sql = PQescapeLiteral(conn, md5_local, strlen(md5_local)); if (!isEscapedStringValid(timezone_sql, timeZone_local, "TskDbPostgreSQL::addImageInfo: Unable to escape time zone string: %s (Error: %s)\n") @@ -723,15 +724,25 @@ int TskDbPostgreSQL::addImageInfo(int type, int ssize, int64_t & objId, const st PQfreemem(md5_sql); return 1; } - snprintf(stmt, 2048, "INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5) VALUES (%lld, %d, %d, %s, %"PRIuOFF", %s);", objId, type, ssize, timezone_sql, size, md5_sql); - int ret = attempt_exec(stmt, "Error adding data to tsk_image_info table: %s\n"); - - // cleanup PQfreemem(timezone_sql); PQfreemem(md5_sql); + if (1 == ret || dataSourceId.empty()) { + return ret; + } + + // Add the data source to the data_source_info table. + char *dataSourceId_sql = PQescapeLiteral(conn, dataSourceId.c_str(), strlen(dataSourceId.c_str())); + if (!isEscapedStringValid(dataSourceId_sql, dataSourceId.c_str(), "TskDbPostgreSQL::addImageInfo: Unable to escape data source string: %s (Error: %s)\n")) { + PQfreemem(dataSourceId_sql); + return 1; + } + snprintf(stmt, 2048, "INSERT INTO data_source_info (obj_id, data_src_id) VALUES (%lld, %s);", + objId, dataSourceId_sql); + ret = attempt_exec(stmt, "Error adding data source id to data_source_info table: %s\n"); + PQfreemem(dataSourceId_sql); return ret; } diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp index 0f9e6d1c0a8d39aaf5f840a36fdba7f8a533fd8e..a3baa4c1df32b626739102d7596a038dd10ac40f 100755 --- a/tsk/auto/db_sqlite.cpp +++ b/tsk/auto/db_sqlite.cpp @@ -484,6 +484,38 @@ int return ret; } +int TskDbSqlite::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId) +{ + // Add the data source to the tsk_objects table. + // We don't use addObject because we're passing in NULL as the parent + char stmt[1024]; + snprintf(stmt, 1024, + "INSERT INTO tsk_objects (obj_id, par_obj_id, type) VALUES (NULL, NULL, %d);", + TSK_DB_OBJECT_TYPE_IMG); + if (attempt_exec(stmt, "Error adding data to tsk_objects table: %s\n")) { + return 1; + } + objId = sqlite3_last_insert_rowid(m_db); + + // Add the data source to the tsk_image_info table. + char *zSQL; + zSQL = sqlite3_mprintf("INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5) VALUES (%lld, %d, %d, '%q', %"PRIuOFF", '%q');", + objId, type, ssize, timezone.c_str(), size, md5.c_str()); + int ret = attempt_exec(zSQL, + "Error adding data to tsk_image_info table: %s\n"); + sqlite3_free(zSQL); + if (1 == ret || dataSourceId.empty()) { + return ret; + } + + // Add the data source to the data_source_info table. + zSQL = sqlite3_mprintf("INSERT INTO data_source_info (obj_id, data_src_id) VALUES (%lld, '%s');", + objId, dataSourceId.c_str()); + ret = attempt_exec(zSQL, "Error adding data to tsk_image_info table: %s\n"); + sqlite3_free(zSQL); + return ret; +} + /** * @returns 1 on error, 0 on success */ diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h index 004d4502494b747524c9bea1fbc14d9e55ac2286..0673201713847d3c5c6e301795d2caff34cba071 100644 --- a/tsk/auto/tsk_case_db.h +++ b/tsk/auto/tsk_case_db.h @@ -36,9 +36,9 @@ class TskAutoDb:public TskAuto { TskAutoDb(TskDb * a_db, TSK_HDB_INFO * a_NSRLDb, TSK_HDB_INFO * a_knownBadDb); virtual ~ TskAutoDb(); virtual uint8_t openImage(int, const TSK_TCHAR * const images[], - TSK_IMG_TYPE_ENUM, unsigned int a_ssize); + TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* dataSourceId = NULL); virtual uint8_t openImageUtf8(int, const char *const images[], - TSK_IMG_TYPE_ENUM, unsigned int a_ssize); + TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* dataSourceId = NULL); virtual void closeImage(); virtual void setTz(string tzone); @@ -90,10 +90,10 @@ class TskAutoDb:public TskAuto { uint8_t addFilesInImgToDb(); uint8_t startAddImage(int numImg, const TSK_TCHAR * const imagePaths[], - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize); + TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId = NULL); #ifdef WIN32 uint8_t startAddImage(int numImg, const char *const imagePaths[], - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize); + TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId = NULL); #endif void stopAddImage(); int revertAddImage(); @@ -145,7 +145,7 @@ class TskAutoDb:public TskAuto { uint32_t nextSequenceNo; } UNALLOC_BLOCK_WLK_TRACK; - uint8_t addImageDetails(const char *const images[], int); + uint8_t addImageDetails(const char *, const char *const images[], int); TSK_RETVAL_ENUM insertFileData(TSK_FS_FILE * fs_file, const TSK_FS_ATTR *, const char *path, const unsigned char *const md5, diff --git a/tsk/auto/tsk_db.h b/tsk/auto/tsk_db.h index 94c77a641f9b9ca161a03570ea35a9bf13b74aeb..4c1e0575f161e40c28724254377f4644d97f339f 100755 --- a/tsk/auto/tsk_db.h +++ b/tsk/auto/tsk_db.h @@ -162,6 +162,7 @@ class TskDb { virtual TSK_RETVAL_ENUM setConnectionInfo(CaseDbConnectionInfo * info); virtual int addImageInfo(int type, int size, int64_t & objId, const string & timezone) = 0; virtual int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5) = 0; + virtual int addImageInfo(int type, TSK_OFF_T size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5, const string& dataSourceId) = 0; virtual int addImageName(int64_t objId, char const *imgName, int sequence) = 0; virtual int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId, int64_t & objId) = 0; virtual int addVolumeInfo(const TSK_VS_PART_INFO * vs_part, int64_t parObjId, int64_t & objId) = 0; diff --git a/tsk/auto/tsk_db_postgresql.h b/tsk/auto/tsk_db_postgresql.h index 472799effd60bcf0fa712529a401060e44139b21..2905cf565203927d8f24b7b3269a9fa0b573325e 100755 --- a/tsk/auto/tsk_db_postgresql.h +++ b/tsk/auto/tsk_db_postgresql.h @@ -48,6 +48,7 @@ class TskDbPostgreSQL : public TskDb { int addImageInfo(int type, int size, int64_t & objId, const string & timezone); int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5); + int addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId); int addImageName(int64_t objId, char const *imgName, int sequence); int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId, int64_t & objId); @@ -110,7 +111,7 @@ class TskDbPostgreSQL : public TskDb { PGresult* get_query_result_set(const char *sql, const char *errfmt); PGresult* get_query_result_set_binary(const char *sql, const char *errfmt); bool isQueryResultValid(PGresult *res, const char *sql); - int isEscapedStringValid(char *sql_str, char *orig_str, const char *errfmt); + int isEscapedStringValid(const char *sql_str, const char *orig_str, const char *errfmt); int createIndexes(); void removeNonUtf8(char* newStr, int newStrMaxSize, const char* origStr); diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h index 4424c892968d498460f78f2b753aed54641c404e..d4728456776bc3f17fa6bd9523910b0542ca50e1 100755 --- a/tsk/auto/tsk_db_sqlite.h +++ b/tsk/auto/tsk_db_sqlite.h @@ -40,6 +40,7 @@ class TskDbSqlite : public TskDb { int close(); int addImageInfo(int type, int size, int64_t & objId, const string & timezone); int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5); + int addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId); int addImageName(int64_t objId, char const *imgName, int sequence); int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId, int64_t & objId);