19 package org.sleuthkit.autopsy.casemodule;
22 import java.io.IOException;
23 import java.nio.file.Path;
24 import java.nio.file.Paths;
25 import java.sql.Connection;
26 import java.sql.DriverManager;
27 import java.sql.PreparedStatement;
28 import java.sql.ResultSet;
29 import java.sql.ResultSetMetaData;
30 import java.sql.SQLException;
31 import java.sql.Statement;
32 import java.text.SimpleDateFormat;
33 import java.util.Date;
34 import org.apache.commons.io.FileUtils;
35 import org.openide.util.NbBundle;
72 private final CaseDbConnectionInfo
db;
83 boolean copySourceImages,
86 this.imageInputFolder = imageInput;
87 this.caseInputFolder = caseInput;
88 this.imageOutputFolder = imageOutput;
89 this.caseOutputFolder = caseOutput;
107 Path getImageInputFolder() {
111 Path getImageOutputFolder() {
115 String getOldCaseName() {
119 String getNewCaseName() {
123 boolean getCopySourceImages() {
127 boolean getDeleteCase() {
131 String getPostgreSQLDbName() {
135 String getAutFileName() {
139 String getRawFolderName() {
143 CaseDbConnectionInfo getDb() {
147 void setPostgreSQLDbName(String dbName) {
148 this.postgreSQLDbName = dbName;
163 Class.forName(
"org.postgresql.Driver");
166 Path oldDatabasePath = icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE);
167 if (
false == oldDatabasePath.toFile().exists()) {
168 throw new Exception(NbBundle.getMessage(
SingleUserCaseConverter.class,
"SingleUserCaseConverter.BadDatabaseFileName"));
174 throw new Exception(NbBundle.getMessage(
SingleUserCaseConverter.class,
"SingleUserCaseConverter.AlreadyMultiUser"));
184 SimpleDateFormat dateFormat =
new SimpleDateFormat(
"yyyyMMdd_HHmmss");
185 Date date =
new Date();
186 String dbName = icd.getNewCaseName() +
"_" + dateFormat.format(date);
187 icd.setPostgreSQLDbName(dbName);
203 icd.getCaseOutputFolder().toString(),
204 icd.getNewCaseName(),
211 newCaseMetadata.setCaseDatabaseName(dbName);
214 newCaseMetadata.setCreatedByVersion(oldCaseMetadata.getCreatedByVersion());
220 if (icd.getDeleteCase()) {
221 FileUtils.deleteDirectory(icd.getCaseInputFolder().toFile());
234 File thePath = icd.getImageInputFolder().resolve(icd.getOldCaseName()).toFile();
235 if (thePath.isDirectory()) {
239 thePath = icd.getImageInputFolder().resolve(icd.getRawFolderName()).toFile();
240 if (thePath.isDirectory()) {
244 return icd.getImageInputFolder().toFile();
260 Path source = icd.getCaseInputFolder();
261 if (source.toFile().exists()) {
262 destination = icd.getCaseOutputFolder().resolve(hostName);
263 FileUtils.copyDirectory(source.toFile(), destination.toFile());
266 source = icd.getCaseInputFolder().resolve(TIMELINE_FILE);
267 if (source.toFile().exists()) {
269 FileUtils.copyFile(source.toFile(), destination.toFile());
273 File oldAutopsyFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, icd.getOldCaseName() +
DOTAUT).toFile();
274 if (oldAutopsyFile.exists()) {
275 oldAutopsyFile.delete();
279 File oldDatabaseFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName,
AUTOPSY_DB_FILE).toFile();
280 if (oldDatabaseFile.exists()) {
281 oldDatabaseFile.delete();
285 File oldTimelineFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName,
TIMELINE_FILE).toFile();
286 if (oldTimelineFile.exists()) {
287 oldTimelineFile.delete();
307 SleuthkitCase newCase = SleuthkitCase.newCase(icd.getPostgreSQLDbName(), icd.getDb(), icd.getCaseOutputFolder().toString());
311 Class.forName(
"org.sqlite.JDBC");
316 Statement inputStatement = sqliteConnection.createStatement();
317 ResultSet inputResultSet = inputStatement.executeQuery(
"SELECT * FROM blackboard_artifact_types");
318 Statement outputStatement;
319 Statement numberingPK;
322 while (inputResultSet.next()) {
324 long value = inputResultSet.getLong(1);
325 if (value > biggestPK) {
328 Statement check = postgreSQLConnection.createStatement();
329 ResultSet checkResult = check.executeQuery(
"SELECT * FROM blackboard_artifact_types WHERE artifact_type_id=" + value +
" AND type_name LIKE '" + inputResultSet.getString(2) +
"' AND display_name LIKE '" + inputResultSet.getString(3) +
"'");
330 if (!checkResult.isBeforeFirst()) {
331 String sql =
"INSERT INTO blackboard_artifact_types (artifact_type_id, type_name, display_name) VALUES ("
333 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) +
"',"
335 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
339 }
catch (SQLException ex) {
340 if (ex.getErrorCode() != 0) {
341 throw new SQLException(ex);
345 numberingPK = postgreSQLConnection.createStatement();
346 numberingPK.execute(
"ALTER SEQUENCE blackboard_artifact_types_artifact_type_id_seq RESTART WITH " + (biggestPK + 1));
350 inputStatement = sqliteConnection.createStatement();
351 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM blackboard_attribute_types");
353 while (inputResultSet.next()) {
355 long value = inputResultSet.getLong(1);
356 if (value > biggestPK) {
359 Statement check = postgreSQLConnection.createStatement();
360 ResultSet checkResult = check.executeQuery(
"SELECT * FROM blackboard_attribute_types WHERE attribute_type_id=" + value +
" AND type_name LIKE '" + inputResultSet.getString(2) +
"' AND display_name LIKE '" + inputResultSet.getString(3) +
"'");
361 if (!checkResult.isBeforeFirst()) {
362 String sql =
"INSERT INTO blackboard_attribute_types (attribute_type_id, type_name, display_name) VALUES ("
364 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) +
"',"
367 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
371 }
catch (SQLException ex) {
372 if (ex.getErrorCode() != 0) {
373 throw new SQLException(ex);
377 numberingPK = postgreSQLConnection.createStatement();
378 numberingPK.execute(
"ALTER SEQUENCE blackboard_attribute_types_attribute_type_id_seq RESTART WITH " + (biggestPK + 1));
382 inputStatement = sqliteConnection.createStatement();
383 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_objects");
385 while (inputResultSet.next()) {
386 outputStatement = postgreSQLConnection.createStatement();
388 long value = inputResultSet.getLong(1);
389 if (value > biggestPK) {
392 outputStatement.executeUpdate(
"INSERT INTO tsk_objects (obj_id, par_obj_id, type) VALUES ("
395 + inputResultSet.getInt(3) +
")");
396 }
catch (SQLException ex) {
397 if (ex.getErrorCode() != 0) {
398 throw new SQLException(ex);
402 numberingPK = postgreSQLConnection.createStatement();
403 numberingPK.execute(
"ALTER SEQUENCE tsk_objects_obj_id_seq RESTART WITH " + (biggestPK + 1));
406 inputStatement = sqliteConnection.createStatement();
407 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_image_names");
409 while (inputResultSet.next()) {
410 outputStatement = postgreSQLConnection.createStatement();
412 outputStatement.executeUpdate(
"INSERT INTO tsk_image_names (obj_id, name, sequence) VALUES ("
413 + inputResultSet.getLong(1) +
",'"
414 + inputResultSet.getString(2) +
"',"
415 + inputResultSet.getInt(3) +
")");
416 }
catch (SQLException ex) {
417 if (ex.getErrorCode() != 0) {
418 throw new SQLException(ex);
425 inputStatement = sqliteConnection.createStatement();
426 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_image_info");
428 while (inputResultSet.next()) {
430 long value = inputResultSet.getLong(1);
431 if (value > biggestPK) {
434 String sql =
"INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5, display_name) VALUES ("
443 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
449 }
catch (SQLException ex) {
450 if (ex.getErrorCode() != 0) {
451 throw new SQLException(ex);
455 numberingPK = postgreSQLConnection.createStatement();
456 numberingPK.execute(
"ALTER SEQUENCE tsk_image_info_obj_id_seq RESTART WITH " + (biggestPK + 1));
460 inputStatement = sqliteConnection.createStatement();
461 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_fs_info");
463 while (inputResultSet.next()) {
465 long value = inputResultSet.getLong(1);
466 if (value > biggestPK) {
469 String sql =
"INSERT INTO tsk_fs_info (obj_id, img_offset, fs_type, block_size, block_count, root_inum, first_inum, last_inum, display_name) VALUES ("
471 + inputResultSet.getLong(2) +
","
472 + inputResultSet.getInt(3) +
","
473 + inputResultSet.getLong(4) +
","
474 + inputResultSet.getLong(5) +
","
475 + inputResultSet.getLong(6) +
","
476 + inputResultSet.getLong(7) +
","
477 + inputResultSet.getLong(8) +
","
480 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
484 }
catch (SQLException ex) {
485 if (ex.getErrorCode() != 0) {
486 throw new SQLException(ex);
490 numberingPK = postgreSQLConnection.createStatement();
491 numberingPK.execute(
"ALTER SEQUENCE tsk_fs_info_obj_id_seq RESTART WITH " + (biggestPK + 1));
495 inputStatement = sqliteConnection.createStatement();
496 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_files_path");
498 while (inputResultSet.next()) {
499 outputStatement = postgreSQLConnection.createStatement();
501 long value = inputResultSet.getLong(1);
502 if (value > biggestPK) {
508 int encoding = TskData.EncodingType.NONE.getType();
509 ResultSetMetaData rsMetaData = inputResultSet.getMetaData();
510 if (rsMetaData.getColumnCount() == 3) {
511 encoding = inputResultSet.getInt(3);
513 outputStatement.executeUpdate(
"INSERT INTO tsk_files_path (obj_id, path, encoding_type) VALUES ("
515 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) +
"', "
517 }
catch (SQLException ex) {
518 if (ex.getErrorCode() != 0) {
519 throw new SQLException(ex);
523 numberingPK = postgreSQLConnection.createStatement();
524 numberingPK.execute(
"ALTER SEQUENCE tsk_files_path_obj_id_seq RESTART WITH " + (biggestPK + 1));
528 inputStatement = sqliteConnection.createStatement();
529 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_files");
531 while (inputResultSet.next()) {
533 long value = inputResultSet.getLong(1);
534 if (value > biggestPK) {
537 String sql =
"INSERT INTO tsk_files (obj_id, fs_obj_id, attr_type, attr_id, name, meta_addr, meta_seq, type, has_layout, has_path, dir_type, meta_type, dir_flags, meta_flags, size, ctime, crtime, atime, mtime, mode, uid, gid, md5, known, parent_path) VALUES ("
542 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(5)) +
"',"
564 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
569 }
catch (SQLException ex) {
570 if (ex.getErrorCode() != 0) {
571 throw new SQLException(ex);
575 numberingPK = postgreSQLConnection.createStatement();
576 numberingPK.execute(
"ALTER SEQUENCE tsk_files_obj_id_seq RESTART WITH " + (biggestPK + 1));
579 inputStatement = sqliteConnection.createStatement();
580 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_file_layout");
582 while (inputResultSet.next()) {
583 outputStatement = postgreSQLConnection.createStatement();
585 outputStatement.executeUpdate(
"INSERT INTO tsk_file_layout (obj_id, byte_start, byte_len, sequence) VALUES ("
586 + inputResultSet.getLong(1) +
","
587 + inputResultSet.getLong(2) +
","
588 + inputResultSet.getLong(3) +
","
589 + inputResultSet.getInt(4) +
")");
590 }
catch (SQLException ex) {
591 if (ex.getErrorCode() != 0) {
592 throw new SQLException(ex);
598 inputStatement = sqliteConnection.createStatement();
599 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_db_info");
601 while (inputResultSet.next()) {
602 outputStatement = postgreSQLConnection.createStatement();
604 Statement check = postgreSQLConnection.createStatement();
605 ResultSet checkResult = check.executeQuery(
"SELECT * FROM tsk_db_info WHERE schema_ver=" + inputResultSet.getInt(1) +
" AND tsk_ver=" + inputResultSet.getInt(2));
606 if (!checkResult.isBeforeFirst()) {
607 outputStatement.executeUpdate(
"INSERT INTO tsk_db_info (schema_ver, tsk_ver) VALUES ("
611 }
catch (SQLException ex) {
612 if (ex.getErrorCode() != 0) {
613 throw new SQLException(ex);
620 inputStatement = sqliteConnection.createStatement();
621 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tag_names");
623 while (inputResultSet.next()) {
625 long value = inputResultSet.getLong(1);
626 if (value > biggestPK) {
629 String sql =
"INSERT INTO tag_names (tag_name_id, display_name, description, color) VALUES ("
632 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(3)) +
"','"
633 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(4)) +
"')";
635 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
639 }
catch (SQLException ex) {
640 if (ex.getErrorCode() != 0) {
641 throw new SQLException(ex);
645 numberingPK = postgreSQLConnection.createStatement();
646 numberingPK.execute(
"ALTER SEQUENCE tag_names_tag_name_id_seq RESTART WITH " + (biggestPK + 1));
650 inputStatement = sqliteConnection.createStatement();
651 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM reports");
653 while (inputResultSet.next()) {
654 outputStatement = postgreSQLConnection.createStatement();
656 long value = inputResultSet.getLong(1);
657 if (value > biggestPK) {
660 outputStatement.executeUpdate(
"INSERT INTO reports (report_id, path, crtime, src_module_name, report_name) VALUES ("
662 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) +
"',"
663 + inputResultSet.getInt(3) +
",'"
664 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(4)) +
"','"
665 + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(5)) +
"')");
667 }
catch (SQLException ex) {
668 if (ex.getErrorCode() != 0) {
669 throw new SQLException(ex);
673 numberingPK = postgreSQLConnection.createStatement();
674 numberingPK.execute(
"ALTER SEQUENCE reports_report_id_seq RESTART WITH " + (biggestPK + 1));
677 biggestPK = Long.MIN_VALUE;
678 inputStatement = sqliteConnection.createStatement();
679 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM blackboard_artifacts");
681 while (inputResultSet.next()) {
682 outputStatement = postgreSQLConnection.createStatement();
684 long value = inputResultSet.getLong(1);
685 if (value > biggestPK) {
688 outputStatement.executeUpdate(
"INSERT INTO blackboard_artifacts (artifact_id, obj_id, artifact_type_id) VALUES ("
690 + inputResultSet.getLong(2) +
","
691 + inputResultSet.getLong(3) +
")");
693 }
catch (SQLException ex) {
694 if (ex.getErrorCode() != 0) {
695 throw new SQLException(ex);
699 numberingPK = postgreSQLConnection.createStatement();
700 numberingPK.execute(
"ALTER SEQUENCE blackboard_artifacts_artifact_id_seq RESTART WITH " + (biggestPK + 1));
703 inputStatement = sqliteConnection.createStatement();
704 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM blackboard_attributes");
706 while (inputResultSet.next()) {
708 String sql =
"INSERT INTO blackboard_attributes (artifact_id, artifact_type_id, source, context, attribute_type_id, value_type, value_byte, value_text, value_int32, value_int64, value_double) VALUES ("
709 + inputResultSet.getLong(1) +
","
710 + inputResultSet.getLong(2) +
","
713 + inputResultSet.getLong(5) +
","
714 + inputResultSet.getInt(6) +
","
720 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
728 }
catch (SQLException ex) {
729 if (ex.getErrorCode() != 0) {
730 throw new SQLException(ex);
737 inputStatement = sqliteConnection.createStatement();
738 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_vs_parts");
740 while (inputResultSet.next()) {
742 long value = inputResultSet.getLong(1);
743 if (value > biggestPK) {
746 String sql =
"INSERT INTO tsk_vs_parts (obj_id, addr, start, length, descr, flags) VALUES ("
748 + inputResultSet.getLong(2) +
","
749 + inputResultSet.getLong(3) +
","
750 + inputResultSet.getLong(4) +
","
752 + inputResultSet.getInt(6) +
")";
753 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
757 }
catch (SQLException ex) {
758 if (ex.getErrorCode() != 0) {
759 throw new SQLException(ex);
763 numberingPK = postgreSQLConnection.createStatement();
764 numberingPK.execute(
"ALTER SEQUENCE tsk_vs_parts_obj_id_seq RESTART WITH " + (biggestPK + 1));
768 inputStatement = sqliteConnection.createStatement();
769 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_vs_info");
771 while (inputResultSet.next()) {
772 outputStatement = postgreSQLConnection.createStatement();
774 long value = inputResultSet.getLong(1);
775 if (value > biggestPK) {
778 outputStatement.executeUpdate(
"INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES ("
780 + inputResultSet.getInt(2) +
","
781 + inputResultSet.getLong(3) +
","
782 + inputResultSet.getLong(4) +
")");
784 }
catch (SQLException ex) {
785 if (ex.getErrorCode() != 0) {
786 throw new SQLException(ex);
790 numberingPK = postgreSQLConnection.createStatement();
791 numberingPK.execute(
"ALTER SEQUENCE tsk_vs_info_obj_id_seq RESTART WITH " + (biggestPK + 1));
795 inputStatement = sqliteConnection.createStatement();
796 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_files_derived");
798 while (inputResultSet.next()) {
800 long value = inputResultSet.getLong(1);
801 if (value > biggestPK) {
804 String sql =
"INSERT INTO tsk_files_derived (obj_id, derived_id, rederive) VALUES ("
806 + inputResultSet.getLong(2) +
","
808 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
812 }
catch (SQLException ex) {
813 if (ex.getErrorCode() != 0) {
814 throw new SQLException(ex);
818 numberingPK = postgreSQLConnection.createStatement();
819 numberingPK.execute(
"ALTER SEQUENCE tsk_files_derived_obj_id_seq RESTART WITH " + (biggestPK + 1));
823 inputStatement = sqliteConnection.createStatement();
824 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_files_derived_method");
826 while (inputResultSet.next()) {
828 long value = inputResultSet.getLong(1);
829 if (value > biggestPK) {
832 String sql =
"INSERT INTO tsk_files_derived_method (derived_id, tool_name, tool_version, other) VALUES ("
834 + inputResultSet.getString(2) +
"','"
835 + inputResultSet.getString(3) +
"',"
837 PreparedStatement pst = postgreSQLConnection.prepareStatement(sql);
841 }
catch (SQLException ex) {
842 if (ex.getErrorCode() != 0) {
843 throw new SQLException(ex);
847 numberingPK = postgreSQLConnection.createStatement();
848 numberingPK.execute(
"ALTER SEQUENCE tsk_files_derived_method_derived_id_seq RESTART WITH " + (biggestPK + 1));
852 inputStatement = sqliteConnection.createStatement();
853 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM content_tags LEFT OUTER JOIN tsk_examiners ON content_tags.examiner_id = tsk_examiners.examiner_id");
855 while (inputResultSet.next()) {
856 outputStatement = postgreSQLConnection.createStatement();
858 long value = inputResultSet.getLong(1);
859 if (value > biggestPK) {
862 outputStatement.executeUpdate(
"INSERT INTO content_tags (tag_id, obj_id, tag_name_id, comment, begin_byte_offset, end_byte_offset, examiner_id) VALUES ("
864 + inputResultSet.getLong(2) +
","
865 + inputResultSet.getLong(3) +
",'"
866 + inputResultSet.getString(4) +
"',"
867 + inputResultSet.getLong(5) +
","
868 + inputResultSet.getLong(6) +
","
869 + inputResultSet.getInt(7) +
")");
871 }
catch (SQLException ex) {
872 if (ex.getErrorCode() != 0) {
873 throw new SQLException(ex);
877 numberingPK = postgreSQLConnection.createStatement();
878 numberingPK.execute(
"ALTER SEQUENCE content_tags_tag_id_seq RESTART WITH " + (biggestPK + 1));
882 inputStatement = sqliteConnection.createStatement();
883 inputResultSet = inputStatement.executeQuery(
"SELECT * FROM blackboard_artifact_tags");
885 while (inputResultSet.next()) {
886 outputStatement = postgreSQLConnection.createStatement();
888 long value = inputResultSet.getLong(1);
889 if (value > biggestPK) {
892 outputStatement.executeUpdate(
"INSERT INTO blackboard_artifact_tags (tag_id, artifact_id, tag_name_id, comment) VALUES ("
894 + inputResultSet.getLong(2) +
","
895 + inputResultSet.getLong(3) +
",'"
896 + inputResultSet.getString(4) +
"','"
897 + inputResultSet.getString(5) +
"')");
899 }
catch (SQLException ex) {
900 if (ex.getErrorCode() != 0) {
901 throw new SQLException(ex);
905 numberingPK = postgreSQLConnection.createStatement();
906 numberingPK.execute(
"ALTER SEQUENCE blackboard_artifact_tags_tag_id_seq RESTART WITH " + (biggestPK + 1));
908 sqliteConnection.close();
909 postgreSQLConnection.close();
928 boolean unique =
false;
929 String sanitizedDbName = icd.getPostgreSQLDbName();
931 sanitizedDbName = sanitizedDbName.substring(0, MAX_DB_NAME_LENGTH);
934 if (postgreSQLConnection != null) {
935 while (unique ==
false) {
936 Statement st = postgreSQLConnection.createStatement();
937 ResultSet answer = st.executeQuery(
"SELECT datname FROM pg_catalog.pg_database WHERE LOWER(datname) LIKE LOWER('" + sanitizedDbName +
"%')");
939 if (!answer.next()) {
943 if (number == Integer.MAX_VALUE) {
945 throw new Exception(NbBundle.getMessage(
SingleUserCaseConverter.class,
"SingleUserCaseConverter.NonUniqueDatabaseName"));
947 sanitizedDbName =
"db_" + Integer.toString(number) +
"_" + icd.getPostgreSQLDbName();
951 sanitizedDbName = sanitizedDbName.substring(0, MAX_DB_NAME_LENGTH);
956 postgreSQLConnection.close();
962 icd.setPostgreSQLDbName(sanitizedDbName);
974 if (icd.getCopySourceImages()) {
976 File imageDestination =
new File(icd.getImageOutputFolder().toString());
979 if (imageSource.exists()) {
980 FileUtils.copyDirectory(imageSource, imageDestination);
983 throw new Exception(NbBundle.getMessage(
SingleUserCaseConverter.class,
"SingleUserCaseConverter.UnableToCopySourceImages"));
1000 String input = icd.getImageInputFolder().toString();
1001 String output = icd.getImageOutputFolder().toString();
1005 if (postgresqlConnection != null) {
1009 Statement updateStatement = postgresqlConnection.createStatement();
1010 updateStatement.executeUpdate(
"UPDATE reports SET path=CONCAT('" + hostName +
"/', path) WHERE path IS NOT NULL AND path != ''");
1013 updateStatement = postgresqlConnection.createStatement();
1014 updateStatement.executeUpdate(
"UPDATE tsk_files_path SET path=CONCAT('" + hostName +
"\\', path) WHERE path IS NOT NULL AND path != ''");
1016 String caseName = icd.getRawFolderName().toLowerCase();
1018 if (icd.getCopySourceImages()) {
1020 Statement inputStatement = postgresqlConnection.createStatement();
1021 ResultSet inputResultSet = inputStatement.executeQuery(
"SELECT * FROM tsk_image_names");
1023 while (inputResultSet.next()) {
1024 Path oldPath = Paths.get(inputResultSet.getString(2));
1026 for (
int x = 0; x < oldPath.getNameCount(); ++x) {
1027 if (oldPath.getName(x).toString().toLowerCase().equals(caseName)) {
1028 Path newPath = Paths.get(output, oldPath.subpath(x + 1, oldPath.getNameCount()).toString());
1029 updateStatement = postgresqlConnection.createStatement();
1030 updateStatement.executeUpdate(
"UPDATE tsk_image_names SET name='" + newPath.toString() +
"' WHERE obj_id = " + inputResultSet.getInt(1));
1036 postgresqlConnection.close();
1038 throw new Exception(NbBundle.getMessage(
SingleUserCaseConverter.class,
"SingleUserCaseConverter.CanNotOpenDatabase"));
1054 int value = rs.getInt(index);
1058 return Integer.toString(value);
1074 long value = rs.getLong(index);
1078 return Long.toString(value);
1093 private static void populateNullableString(PreparedStatement pst, ResultSet rs,
int rsIndex,
int psIndex)
throws SQLException {
1094 String nullableString = rs.getString(rsIndex);
1096 pst.setNull(psIndex, java.sql.Types.NULL);
1098 pst.setString(psIndex, SleuthkitCase.escapeSingleQuotes(nullableString));
1114 byte[] nullableBytes = rs.getBytes(rsIndex);
1116 pst.setNull(psIndex, java.sql.Types.NULL);
1118 pst.setBytes(psIndex, nullableBytes);
1134 double nullableNumeric = rs.getDouble(rsIndex);
1136 pst.setNull(psIndex, java.sql.Types.NULL);
1138 pst.setDouble(psIndex, nullableNumeric);
1166 return DriverManager.getConnection(
"jdbc:postgresql://"
1167 + icd.getDb().getHost() +
":"
1168 + icd.getDb().getPort() +
"/"
1170 icd.getDb().getUserName(),
1171 icd.getDb().getPassword());
1184 return DriverManager.getConnection(
"jdbc:sqlite:" + icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE).toString(),
"",
"");
static Connection getPostgreSQLConnection(ImportCaseData icd)
final Path caseInputFolder
final Path imageOutputFolder
static void populateNullableNumeric(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex)
static String getNullableInt(ResultSet rs, int index)
static final int MAX_DB_NAME_LENGTH
static void deconflictDatabaseName(ImportCaseData icd)
static Connection getSQLiteConnection(ImportCaseData icd)
final String rawFolderName
ImportCaseData(Path imageInput, Path caseInput, Path imageOutput, Path caseOutput, String oldCaseName, String newCaseName, String autFileName, String rawFolderName, boolean copySourceImages, boolean deleteCase)
Path getCaseOutputFolder()
static void importCase(ImportCaseData icd)
static final String POSTGRES_DEFAULT_DB_NAME
static CaseDbConnectionInfo getDatabaseConnectionInfo()
static final String TIMELINE_FILE
final CaseDbConnectionInfo db
static void copyImages(ImportCaseData icd)
static final String DOTAUT
static final String MODULE_FOLDER
final Path imageInputFolder
final boolean copySourceImages
static void populateNullableString(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex)
static String getNullableLong(ResultSet rs, int index)
static void populateNullableByteArray(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex)
static final String AUTOPSY_DB_FILE
static final String TIMELINE_FOLDER
static void copyResults(ImportCaseData icd)
static String getLocalHostName()
static void importDb(ImportCaseData icd)
Path getCaseInputFolder()
final Path caseOutputFolder
static void fixPaths(ImportCaseData icd)
static File findInputFolder(ImportCaseData icd)
static Connection getPostgreSQLConnection(ImportCaseData icd, String dbName)