diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index 266ddc3db5075572a53ef1275b0e0c57af92f6fa..311afd02ce31f8259b87a826683e8cfa4955626c 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -1032,7 +1032,7 @@ JNIEXPORT jlong JNICALL * @param timeZone the timezone the image is from */ JNIEXPORT void JNICALL - Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env, + Java_org_sleuthkit_datamodel_SleuthkitJNI_runOpenAndAddImgNat(JNIEnv * env, jclass obj, jlong process, jstring deviceId, jobjectArray paths, jint numImgs, jstring timeZone) { TskAutoDb *tskAuto = ((TskAutoDb *) process); @@ -1136,12 +1136,11 @@ JNIEXPORT void JNICALL * @param process the add-image process created by initAddImgNat * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID) * @param a_img_info image info object -* @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, jstring deviceId, jlong a_img_info, jint numImgs, jstring timeZone) { + jclass obj, jlong process, jstring deviceId, jlong a_img_info, jstring timeZone) { TskAutoDb *tskAuto = ((TskAutoDb *)process); if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) { @@ -1167,11 +1166,13 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env, env->ReleaseStringUTFChars(timeZone, time_zone); } + // Save the image handle to the TskAutoDb object + TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info); + tskAuto->openImageHandle(img_info); + // Add the data source. uint8_t ret = 0; - tskAuto-> - if ((ret = tskAuto->startAddImage((int)numImgs, a_img_info, - TSK_IMG_TYPE_DETECT, 0, device_id)) != 0) { + if ((ret = tskAuto->startAddImage(device_id)) != 0) { stringstream msgss; msgss << "Errors occured while ingesting image " << std::endl; vector<TskAuto::error_record> errors = tskAuto->getErrorList(); diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h index e283fd074fc109f7d29452c0289d3ffc2f066e94..b5c260866d3e75c87901db4b4cb3b55780257558 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.h +++ b/bindings/java/jni/dataModel_SleuthkitJNI.h @@ -225,12 +225,20 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_initializeAddI /* * Class: org_sleuthkit_datamodel_SleuthkitJNI - * Method: runAddImgNat + * Method: runOpenAndAddImgNat * Signature: (JLjava/lang/String;[Ljava/lang/String;ILjava/lang/String;)V */ -JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat +JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runOpenAndAddImgNat (JNIEnv *, jclass, jlong, jstring, jobjectArray, jint, jstring); +/* + * Class: org_sleuthkit_datamodel_SleuthkitJNI + * Method: runAddImgNat + * Signature: (JLjava/lang/String;JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat + (JNIEnv *, jclass, jlong, jstring, jlong, jstring); + /* * Class: org_sleuthkit_datamodel_SleuthkitJNI * Method: stopAddImgNat diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index 972e06380cc06bc8ce1d60b0851c1a3f81ca4b7d..9149ed012fdb1992ae5c1b8c413923872f0a3c11 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -152,7 +152,7 @@ void free() throws TskCoreException { long addImageInfo(long deviceObjId, List<String> imageFilePaths, String timeZone) throws TskCoreException { try { long tskAutoDbPointer = initializeAddImgNat(caseDbPointer, timezoneLongToShort(timeZone), false, false, false); - runAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(new String[0]), imageFilePaths.size(), timeZone); + runOpenAndAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(new String[0]), imageFilePaths.size(), timeZone); return commitAddImgNat(tskAutoDbPointer); } catch (TskDataException ex) { throw new TskCoreException("Error adding image to case database", ex); @@ -226,13 +226,16 @@ public void run(String deviceId, String[] imageFilePaths) throws TskCoreExceptio throw new TskCoreException("Add image process already started"); } - synchronized (this) { + long imageHandle = openImage(imageFilePaths); + + synchronized (this) { tskAutoDbPointer = initAddImgNat(caseDbPointer, timezoneLongToShort(timeZone), addUnallocSpace, skipFatFsOrphans); } if (0 == tskAutoDbPointer) { throw new TskCoreException("initAddImgNat returned a NULL TskAutoDb pointer"); } - runAddImgNat(tskAutoDbPointer, deviceId, imageFilePaths, imageFilePaths.length, timeZone); + //runAddImgNat(tskAutoDbPointer, deviceId, imageFilePaths, imageFilePaths.length, timeZone); + runAddImgNat(tskAutoDbPointer, deviceId, imageHandle, timeZone); } /** @@ -1039,7 +1042,9 @@ public static boolean isImageSupported(String imagePath){ private static native long initializeAddImgNat(long db, String timezone, boolean addFileSystems, boolean addUnallocSpace, boolean skipFatFsOrphans) throws TskCoreException; - private static native void runAddImgNat(long process, String deviceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; + private static native void runOpenAndAddImgNat(long process, String deviceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; + + private static native void runAddImgNat(long process, String deviceId, long a_img_info, String timeZone) throws TskCoreException, TskDataException; private static native void stopAddImgNat(long process) throws TskCoreException; diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index 1cfe71e1cce57da7979b0958c359300369497bf4..0571089ce649ce8cc35ed05498e6e122b089494d 100644 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -132,7 +132,7 @@ uint8_t return retval; } - if (addImageDetails(a_images, a_num, a_deviceId)) { + if (addImageDetails(a_deviceId)) { return 1; } return 0; @@ -162,134 +162,36 @@ uint8_t return retval; } - // convert image paths to UTF-8 - char **img_ptrs = (char **) tsk_malloc(a_num * sizeof(char *)); - if (img_ptrs == NULL) { - return 1; - } - - for (int i = 0; i < a_num; i++) { - char * img2 = (char*) tsk_malloc(1024 * sizeof(char)); - UTF8 *ptr8; - UTF16 *ptr16; - - ptr8 = (UTF8 *) img2; - ptr16 = (UTF16 *) a_images[i]; - - retval = - tsk_UTF16toUTF8_lclorder((const UTF16 **) &ptr16, (UTF16 *) - & ptr16[TSTRLEN(a_images[i]) + 1], &ptr8, - (UTF8 *) ((uintptr_t) ptr8 + 1024), TSKlenientConversion); - if (retval != TSKconversionOK) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_AUTO_UNICODE); - tsk_error_set_errstr("Error converting image to UTF-8\n"); - return 1; - } - img_ptrs[i] = img2; - } - - if (addImageDetails(img_ptrs, a_num, a_deviceId)) { - //cleanup - for (int i = 0; i < a_num; ++i) { - free(img_ptrs[i]); - } - free(img_ptrs); - return 1; - } - - //cleanup - for (int i = 0; i < a_num; ++i) { - free(img_ptrs[i]); - } - free(img_ptrs); - - return 0; + return (addImageDetails(a_deviceId)); #else return openImageUtf8(a_num, a_images, a_type, a_ssize, a_deviceId); #endif } /** -* Adds an image to the database. +* Adds an image to the database. Requires that m_img_info is already initialized * -* @param a_num Number of image parts -* @param a_img_info Image info handle -* @param a_images Array of paths to the image parts -* @param a_type Image type -* @param a_ssize Size of device sector in bytes (or 0 for default) * @param a_deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID). * @return 0 for success, 1 for failure */ -#ifdef TSK_WIN32 uint8_t -TskAutoDb::openImage(int a_num, TSK_IMG_INFO * a_img_info, const TSK_TCHAR * const a_images[], - TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* a_deviceId) +TskAutoDb::openImage(const char* a_deviceId) { - - // make name of database - uint8_t retval = TskAuto::openImageHandle(a_img_info); - - if (retval != 0) { - return retval; - } - - // convert image paths to UTF-8 - char **img_ptrs = (char **)tsk_malloc(a_num * sizeof(char *)); - if (img_ptrs == NULL) { - return 1; - } - - for (int i = 0; i < a_num; i++) { - char * img2 = (char*)tsk_malloc(1024 * sizeof(char)); - UTF8 *ptr8; - UTF16 *ptr16; - - ptr8 = (UTF8 *)img2; - ptr16 = (UTF16 *)a_images[i]; - - retval = - tsk_UTF16toUTF8_lclorder((const UTF16 **)&ptr16, (UTF16 *) - & ptr16[TSTRLEN(a_images[i]) + 1], &ptr8, - (UTF8 *)((uintptr_t)ptr8 + 1024), TSKlenientConversion); - if (retval != TSKconversionOK) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_AUTO_UNICODE); - tsk_error_set_errstr("Error converting image to UTF-8\n"); - return 1; - } - img_ptrs[i] = img2; - } - - if (addImageDetails(img_ptrs, a_num, a_deviceId)) { - //cleanup - for (int i = 0; i < a_num; ++i) { - free(img_ptrs[i]); - } - free(img_ptrs); + if (m_img_info == NULL) { return 1; } - //cleanup - for (int i = 0; i < a_num; ++i) { - free(img_ptrs[i]); - } - free(img_ptrs); - - return 0; + return(addImageDetails(a_deviceId)); } -#endif /** * Adds image details to the existing database tables. * - * @param imgPaths The paths to the image splits - * @param numPaths The number of paths * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID). * @return Returns 0 for success, 1 for failure */ uint8_t -TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const char* deviceId) +TskAutoDb::addImageDetails(const char* deviceId) { string md5 = ""; #if HAVE_LIBEWF @@ -314,10 +216,42 @@ TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const cha return 1; } + char **img_ptrs; +#ifdef TSK_WIN32 + // convert image paths to UTF-8 + img_ptrs = (char **)tsk_malloc(m_img_info->num_img * sizeof(char *)); + if (img_ptrs == NULL) { + return 1; + } + + for (int i = 0; i < m_img_info->num_img; i++) { + char * img2 = (char*)tsk_malloc(1024 * sizeof(char)); + UTF8 *ptr8; + UTF16 *ptr16; + + ptr8 = (UTF8 *)img2; + ptr16 = (UTF16 *)m_img_info->images[i]; + + uint8_t retval = + tsk_UTF16toUTF8_lclorder((const UTF16 **)&ptr16, (UTF16 *) + & ptr16[TSTRLEN(m_img_info->images[i]) + 1], &ptr8, + (UTF8 *)((uintptr_t)ptr8 + 1024), TSKlenientConversion); + if (retval != TSKconversionOK) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_AUTO_UNICODE); + tsk_error_set_errstr("Error converting image to UTF-8\n"); + return 1; + } + img_ptrs[i] = img2; + } +#else + img_ptrs = m_img_info->images; +#endif + // Add the image names - for (int i = 0; i < numPaths; i++) { + for (int i = 0; i < m_img_info->num_img; i++) { const char *img_ptr = NULL; - img_ptr = imgPaths[i]; + img_ptr = img_ptrs[i]; if (m_db->addImageName(m_curImgId, img_ptr, i)) { registerError(); @@ -325,6 +259,14 @@ TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const cha } } +#ifdef TSK_WIN32 + //cleanup + for (int i = 0; i < m_img_info->num_img; ++i) { + free(img_ptrs[i]); + } + free(img_ptrs); +#endif + return 0; } @@ -535,18 +477,19 @@ uint8_t * Start the process to add image/file metadata to database inside of a transaction. * User must call either commitAddImage() to commit the changes, * or revertAddImage() to revert them. +* This version of startAddImage assumes that m_img_info has already been set up. * -* @param numImg Number of image parts -* @param imagePaths Array of paths to the image parts -* @param imgType Image type -* @param sSize Size of device sector in bytes (or 0 for default) * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID) * @return 0 for success, 1 for failure */ uint8_t -TskAutoDb::startAddImage(int numImg, TSK_IMG_INFO * a_img_info, - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId) +TskAutoDb::startAddImage(const char* deviceId) { + + if (m_img_info == NULL) { + return 1; + } + if (tsk_verbose) tsk_fprintf(stderr, "TskAutoDb::startAddImage: Starting add image process\n"); @@ -573,8 +516,7 @@ TskAutoDb::startAddImage(int numImg, TSK_IMG_INFO * a_img_info, } m_imgTransactionOpen = true; - openImageHandle(a_img_info); - if (openImage(numImg, imagePaths, imgType, sSize, deviceId)) { + if (openImage(deviceId)) { tsk_error_set_errstr2("TskAutoDb::startAddImage"); registerError(); if (revertAddImage()) diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h index c69a8ac1597e1969abd47d08ddc4f9453276c380..0d821095cec6a965db93dc81e479ab275e865f75 100644 --- a/tsk/auto/tsk_case_db.h +++ b/tsk/auto/tsk_case_db.h @@ -37,10 +37,7 @@ class TskAutoDb:public TskAuto { virtual ~ TskAutoDb(); virtual uint8_t openImage(int, const TSK_TCHAR * const images[], TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* deviceId = NULL); -#ifdef WIN32 - virtual uint8_t openImage(int a_num, TSK_IMG_INFO * a_img_info, const TSK_TCHAR * const a_images[], - TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* a_deviceId); -#endif + virtual uint8_t openImage(const char* a_deviceId = NULL); virtual uint8_t openImageUtf8(int, const char *const images[], TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* deviceId = NULL); virtual void closeImage(); @@ -105,8 +102,7 @@ class TskAutoDb:public TskAuto { uint8_t startAddImage(int numImg, const TSK_TCHAR * const imagePaths[], TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL); #ifdef WIN32 - uint8_t startAddImage(int numImg, TSK_IMG_INFO * a_img_info, - TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL); + uint8_t startAddImage(const char* deviceId = NULL); uint8_t startAddImage(int numImg, const char *const imagePaths[], TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL); #endif @@ -161,7 +157,7 @@ class TskAutoDb:public TskAuto { uint32_t nextSequenceNo; } UNALLOC_BLOCK_WLK_TRACK; - uint8_t addImageDetails(const char *const images[], int, const char *); + uint8_t addImageDetails(const char *); TSK_RETVAL_ENUM insertFileData(TSK_FS_FILE * fs_file, const TSK_FS_ATTR *, const char *path, const unsigned char *const md5,