19 package org.sleuthkit.autopsy.report.modules.portablecase;
 
   21 import com.google.common.collect.ArrayListMultimap;
 
   22 import com.google.common.collect.Multimap;
 
   23 import com.google.gson.Gson;
 
   24 import com.google.gson.GsonBuilder;
 
   25 import com.google.gson.JsonElement;
 
   26 import com.google.gson.stream.JsonWriter;
 
   28 import java.util.logging.Level;
 
   29 import java.io.BufferedReader;
 
   31 import java.io.FileOutputStream;
 
   32 import java.io.FileWriter;
 
   33 import java.io.InputStreamReader;
 
   34 import java.io.IOException;
 
   35 import java.io.OutputStream;
 
   36 import java.io.OutputStreamWriter;
 
   37 import java.nio.file.Files;
 
   38 import java.nio.file.Path;
 
   39 import java.nio.file.Paths;
 
   40 import java.sql.ResultSet;
 
   41 import java.sql.SQLException;
 
   42 import java.util.ArrayList;
 
   43 import java.util.Arrays;
 
   44 import java.util.Collection;
 
   45 import java.util.HashMap;
 
   46 import java.util.List;
 
   48 import org.apache.commons.io.FileUtils;
 
   49 import org.openide.modules.InstalledFileLocator;
 
   50 import org.openide.util.NbBundle;
 
  157         "PortableCaseReportModule.getName.name=Portable Case" 
  161         return Bundle.PortableCaseReportModule_getName_name();
 
  165         "PortableCaseReportModule.getDescription.description=Copies selected items to a new single-user case that can be easily shared" 
  169         return Bundle.PortableCaseReportModule_getDescription_description();
 
  189         logger.log(Level.INFO, 
"Portable case creation canceled by user"); 
 
  207             logger.log(Level.WARNING, logWarning);
 
  209             logger.log(Level.SEVERE, logWarning, ex);
 
  217         "PortableCaseReportModule.generateReport.verifying=Verifying selected parameters...",
 
  218         "PortableCaseReportModule.generateReport.creatingCase=Creating portable case database...",
 
  219         "PortableCaseReportModule.generateReport.copyingTags=Copying tags...",
 
  221         "PortableCaseReportModule.generateReport.copyingFiles=Copying files tagged as {0}...",
 
  223         "PortableCaseReportModule.generateReport.copyingArtifacts=Copying artifacts tagged as {0}...",
 
  224         "# {0} - output folder",
 
  225         "PortableCaseReportModule.generateReport.outputDirDoesNotExist=Output folder {0} does not exist",
 
  226         "# {0} - output folder",
 
  227         "PortableCaseReportModule.generateReport.outputDirIsNotDir=Output folder {0} is not a folder",
 
  228         "PortableCaseReportModule.generateReport.caseClosed=Current case has been closed",
 
  229         "PortableCaseReportModule.generateReport.interestingItemError=Error loading intersting items",
 
  230         "PortableCaseReportModule.generateReport.errorReadingTags=Error while reading tags from case database",
 
  231         "PortableCaseReportModule.generateReport.errorReadingSets=Error while reading interesting items sets from case database",
 
  232         "PortableCaseReportModule.generateReport.noContentToCopy=No interesting files, results, or tagged items to copy",
 
  233         "PortableCaseReportModule.generateReport.errorCopyingTags=Error copying tags",
 
  234         "PortableCaseReportModule.generateReport.errorCopyingFiles=Error copying tagged files",
 
  235         "PortableCaseReportModule.generateReport.errorCopyingArtifacts=Error copying tagged artifacts",
 
  236         "PortableCaseReportModule.generateReport.errorCopyingInterestingFiles=Error copying interesting files",
 
  237         "PortableCaseReportModule.generateReport.errorCopyingInterestingResults=Error copying interesting results",
 
  238         "PortableCaseReportModule.generateReport.errorCreatingImageTagTable=Error creating image tags table",
 
  239         "PortableCaseReportModule.generateReport.errorCopyingAutopsy=Error copying application",
 
  240         "# {0} - attribute type name",
 
  241         "PortableCaseReportModule.generateReport.errorLookingUpAttrType=Error looking up attribute type {0}",
 
  242         "PortableCaseReportModule.generateReport.compressingCase=Compressing case...",
 
  243         "PortableCaseReportModule_generateReport_copyingAutopsy=Copying application..." 
  249     @SuppressWarnings(
"deprecation")
 
  251         this.settings = options;
 
  253         progressPanel.
start();
 
  254         progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_verifying());
 
  260         File outputDir = 
new File(reportPath);
 
  261         if (!outputDir.exists()) {
 
  262             handleError(
"Output folder " + outputDir.toString() + 
" does not exist",
 
  263                     Bundle.PortableCaseReportModule_generateReport_outputDirDoesNotExist(outputDir.toString()), null, progressPanel); 
 
  267         if (!outputDir.isDirectory()) {
 
  268             handleError(
"Output folder " + outputDir.toString() + 
" is not a folder",
 
  269                     Bundle.PortableCaseReportModule_generateReport_outputDirIsNotDir(outputDir.toString()), null, progressPanel); 
 
  279                     Bundle.PortableCaseReportModule_generateReport_caseClosed(), null, progressPanel); 
 
  285             outputDir = Paths.get(outputDir.toString(), 
caseName).toFile();
 
  288         List<TagName> tagNames;
 
  294                         Bundle.PortableCaseReportModule_generateReport_errorReadingTags(), ex, progressPanel); 
 
  301         List<String> setNames;
 
  306                 handleError(
"Unable to get all interesting items sets",
 
  307                         Bundle.PortableCaseReportModule_generateReport_errorReadingSets(), ex, progressPanel); 
 
  314         if (tagNames.isEmpty() && setNames.isEmpty()) {
 
  316                     Bundle.PortableCaseReportModule_generateReport_noContentToCopy(), null, progressPanel); 
 
  322         progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_creatingCase());
 
  324         if (portableSkCase == null) {
 
  339             handleError(
"Error creating image tag table", Bundle.PortableCaseReportModule_generateReport_errorCreatingImageTagTable(), ex, progressPanel); 
 
  344         progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_copyingTags());
 
  346             for (
TagName tagName : tagNames) {
 
  348                 oldTagNameToNewTagName.put(tagName, newTagName);
 
  351             handleError(
"Error copying tags", Bundle.PortableCaseReportModule_generateReport_errorCopyingTags(), ex, progressPanel); 
 
  357             oldArtTypeIdToNewArtTypeId.put(type.getTypeID(), type.getTypeID());
 
  363                 handleError(
"Error looking up attribute name " + type.getLabel(),
 
  364                         Bundle.PortableCaseReportModule_generateReport_errorLookingUpAttrType(type.getLabel()),
 
  371             for (
TagName tagName : tagNames) {
 
  377                 progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_copyingFiles(tagName.getDisplayName()));
 
  387             handleError(
"Error copying tagged files", Bundle.PortableCaseReportModule_generateReport_errorCopyingFiles(), ex, progressPanel); 
 
  393             for (
TagName tagName : tagNames) {
 
  399                 progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_copyingArtifacts(tagName.getDisplayName()));
 
  409             handleError(
"Error copying tagged artifacts", Bundle.PortableCaseReportModule_generateReport_errorCopyingArtifacts(), ex, progressPanel); 
 
  414         if (!setNames.isEmpty()) {
 
  430                 handleError(
"Error copying interesting files", Bundle.PortableCaseReportModule_generateReport_errorCopyingInterestingFiles(), ex, progressPanel); 
 
  448                 handleError(
"Error copying interesting results", Bundle.PortableCaseReportModule_generateReport_errorCopyingInterestingResults(), ex, progressPanel); 
 
  466                 handleError(
"Error copying interesting items", Bundle.PortableCaseReportModule_generateReport_errorCopyingInterestingResults(), ex, progressPanel); 
 
  482                 progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_copyingAutopsy());
 
  485             } 
catch (IOException ex) {
 
  486                 handleError(
"Error copying autopsy", Bundle.PortableCaseReportModule_generateReport_errorCopyingAutopsy(), ex, progressPanel); 
 
  492             progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateReport_compressingCase());
 
  525         "PortableCaseReportModule.generateCaseUcoReport.errorCreatingReportFolder=Could not make report folder",
 
  526         "PortableCaseReportModule.generateCaseUcoReport.errorGeneratingCaseUcoReport=Problem while generating CASE-UCO report",
 
  527         "PortableCaseReportModule.generateCaseUcoReport.startCaseUcoReportGeneration=Creating a CASE-UCO report of the portable case",
 
  528         "PortableCaseReportModule.generateCaseUcoReport.successCaseUcoReportGeneration=Successfully created a CASE-UCO report of the portable case" 
  532         Path reportsDirectory = Paths.get(caseFolder.toString(), 
"Reports");
 
  533         if (!reportsDirectory.toFile().mkdir()) {
 
  534             logger.log(Level.SEVERE, 
"Could not make the report folder... skipping " 
  535                     + 
"CASE-UCO report generation for the portable case");
 
  539         Path reportFile = reportsDirectory.resolve(CASE_UCO_FILE_NAME);
 
  541         progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateCaseUcoReport_startCaseUcoReportGeneration());
 
  542         try (OutputStream stream = 
new FileOutputStream(reportFile.toFile());
 
  543                 JsonWriter reportWriter = 
new JsonWriter(
new OutputStreamWriter(stream, 
"UTF-8"))) {
 
  544             Gson gson = 
new GsonBuilder().setPrettyPrinting().create();
 
  545             reportWriter.setIndent(
"    ");
 
  546             reportWriter.beginObject();
 
  547             reportWriter.name(
"@graph");
 
  548             reportWriter.beginArray();
 
  556             Path tmpDir = Paths.get(caseTempDirectory, CASE_UCO_TMP_DIR);
 
  557             FileUtils.deleteDirectory(tmpDir.toFile());
 
  558             Files.createDirectory(tmpDir);
 
  560             CaseUcoExporter exporter = 
new CaseUcoExporter(currentCase.
getSleuthkitCase());
 
  561             for (JsonElement element : exporter.exportSleuthkitCase()) {
 
  562                 gson.toJson(element, reportWriter);
 
  574                 boolean dataSourceHasBeenIncluded = 
false;
 
  577                 for (
TagName tagName : tagNames) {
 
  580                                 dataSource, tmpDir, gson, exporter, reportWriter, dataSourceHasBeenIncluded);
 
  584                                 dataSource, tmpDir, gson, exporter, reportWriter, dataSourceHasBeenIncluded);
 
  590                     dataSourceHasBeenIncluded |= 
addUniqueFile(sourceContent, dataSource,
 
  591                             tmpDir, gson, exporter, reportWriter, dataSourceHasBeenIncluded);
 
  596             reportWriter.endArray();
 
  597             reportWriter.endObject();
 
  598             progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateCaseUcoReport_successCaseUcoReportGeneration());
 
  600             progressPanel.
updateStatusLabel(Bundle.PortableCaseReportModule_generateCaseUcoReport_errorGeneratingCaseUcoReport());
 
  601             logger.log(Level.SEVERE, 
"Error encountered while trying to create " 
  602                     + 
"CASE-UCO output for portable case.. the portable case will be " 
  603                     + 
"completed without a CASE-UCO report.", ex);
 
  615     @SuppressWarnings(
"deprecation")
 
  617         Multimap<Long, BlackboardArtifact> artifactsWithSetName = ArrayListMultimap.create();
 
  618         if (!setNames.isEmpty()) {
 
  619             List<BlackboardArtifact> allArtifacts = skCase.getBlackboardArtifacts(
 
  621             allArtifacts.addAll(skCase.getBlackboardArtifacts(
 
  623             allArtifacts.addAll(skCase.getBlackboardArtifacts(
 
  630                     artifactsWithSetName.put(bArt.getDataSource().getId(), bArt);
 
  634         return artifactsWithSetName;
 
  658             Path tmpDir, Gson gson, CaseUcoExporter exporter, JsonWriter reportWriter,
 
  662             Path filePath = tmpDir.resolve(Long.toString(absFile.
getId()));
 
  663             if (!absFile.
isDir() && !Files.exists(filePath)) {
 
  664                 if (!dataSourceHasBeenIncluded) {
 
  665                     for (JsonElement element : exporter.exportDataSource(dataSource)) {
 
  666                         gson.toJson(element, reportWriter);
 
  671                 for (JsonElement element : exporter.exportAbstractFile(absFile, Paths.get(FILE_FOLDER_NAME, subFolder, fileName).
toString())) {
 
  672                     gson.toJson(element, reportWriter);
 
  674                 Files.createFile(filePath);
 
  685     @SuppressWarnings(
"deprecation")
 
  689         List<String> setNames = 
new ArrayList<>();
 
  690         Map<String, Long> setCounts;
 
  694         String innerSelect = 
"SELECT (value_text) AS set_name FROM blackboard_attributes WHERE (artifact_type_id = '" 
  701         String query = 
"set_name, count(1) AS set_count FROM (" + innerSelect + 
") set_names GROUP BY set_name"; 
 
  706         setNames.addAll(setCounts.keySet());
 
  718         "# {0} - case folder",
 
  719         "PortableCaseReportModule.createCase.caseDirExists=Case folder {0} already exists",
 
  720         "PortableCaseReportModule.createCase.errorCreatingCase=Error creating case",
 
  722         "PortableCaseReportModule.createCase.errorCreatingFolder=Error creating folder {0}",
 
  723         "PortableCaseReportModule.createCase.errorStoringMaxIds=Error storing maximum database IDs",})
 
  727         caseFolder = Paths.get(outputDir.toString(), 
caseName).toFile();
 
  729         if (caseFolder.exists()) {
 
  730             handleError(
"Case folder " + caseFolder.toString() + 
" already exists",
 
  731                     Bundle.PortableCaseReportModule_createCase_caseDirExists(caseFolder.toString()), null, progressPanel); 
 
  739             handleError(
"Error creating case " + caseName + 
" in folder " + caseFolder.toString(),
 
  740                     Bundle.PortableCaseReportModule_createCase_errorCreatingCase(), ex, progressPanel);   
 
  749                     Bundle.PortableCaseReportModule_createCase_errorStoringMaxIds(), ex, progressPanel);   
 
  754         copiedFilesFolder = Paths.get(caseFolder.toString(), 
FILE_FOLDER_NAME).toFile();
 
  755         if (!copiedFilesFolder.mkdir()) {
 
  756             handleError(
"Error creating folder " + copiedFilesFolder.toString(),
 
  757                     Bundle.PortableCaseReportModule_createCase_errorCreatingFolder(copiedFilesFolder.toString()), null, progressPanel); 
 
  763             File subFolder = Paths.get(copiedFilesFolder.toString(), cat.getDisplayName()).toFile();
 
  764             if (!subFolder.mkdir()) {
 
  765                 handleError(
"Error creating folder " + subFolder.toString(),
 
  766                         Bundle.PortableCaseReportModule_createCase_errorCreatingFolder(subFolder.toString()), null, progressPanel);    
 
  771         if (!unknownTypeFolder.mkdir()) {
 
  772             handleError(
"Error creating folder " + unknownTypeFolder.toString(),
 
  773                     Bundle.PortableCaseReportModule_createCase_errorCreatingFolder(unknownTypeFolder.toString()), null, progressPanel);   
 
  788         String tableSchema = 
"( table_name TEXT PRIMARY KEY, " 
  795         currentCaseDbManager.
select(
"max(tag_id) as max_id from blackboard_artifact_tags", 
new StoreMaxIdCallback(
"blackboard_artifact_tags"));  
 
  796         currentCaseDbManager.
select(
"max(examiner_id) as max_id from tsk_examiners", 
new StoreMaxIdCallback(
"tsk_examiners"));  
 
  836             Content content = tag.getContent();
 
  842                 if (!oldTagNameToNewTagName.containsKey(tag.getName())) {
 
  843                     throw new TskCoreException(
"TagName map is missing entry for ID " + tag.getName().getId() + 
" with display name " + tag.getName().getDisplayName()); 
 
  850                 if (!appData.isEmpty()) {
 
  872         return callback.getAppData();
 
  888                         appData = rs.getString(
"app_data"); 
 
  889                     } 
catch (SQLException ex) {
 
  890                         logger.log(Level.WARNING, 
"Unable to get app_data from result set", ex); 
 
  893             } 
catch (SQLException ex) {
 
  894                 logger.log(Level.WARNING, 
"Failed to get next result for app_data", ex); 
 
  903         String getAppData() {
 
  917         String insert = 
"(content_tag_id, app_data) VALUES (" + newContentTag.getId() + 
", '" + appData + 
"')";
 
  942             Content content = tag.getContent();
 
  955             if (!oldTagNameToNewTagName.containsKey(tag.getName())) {
 
  956                 throw new TskCoreException(
"TagName map is missing entry for ID " + tag.getName().getId() + 
" with display name " + tag.getName().getDisplayName()); 
 
  976         if (oldArtifactIdToNewArtifact.containsKey(artifactToCopy.getArtifactID())) {
 
  977             return oldArtifactIdToNewArtifact.get(artifactToCopy.getArtifactID());
 
  982         List<BlackboardAttribute> newAttrs = 
new ArrayList<>();
 
  983         if (oldAssociatedAttribute != null) {
 
  990         List<BlackboardAttribute> oldAttrs = artifactToCopy.getAttributes();
 
  996             if (SPECIALLY_HANDLED_ATTRS.contains(oldAttr.getAttributeType().getTypeID())) {
 
 1001             switch (oldAttr.getValueType()) {
 
 1003                     newAttrs.add(
new BlackboardAttribute(newAttributeType, String.join(
",", oldAttr.getSources()),
 
 1004                             oldAttr.getValueBytes()));
 
 1007                     newAttrs.add(
new BlackboardAttribute(newAttributeType, String.join(
",", oldAttr.getSources()),
 
 1008                             oldAttr.getValueDouble()));
 
 1011                     newAttrs.add(
new BlackboardAttribute(newAttributeType, String.join(
",", oldAttr.getSources()),
 
 1012                             oldAttr.getValueInt()));
 
 1016                     newAttrs.add(
new BlackboardAttribute(newAttributeType, String.join(
",", oldAttr.getSources()),
 
 1017                             oldAttr.getValueLong()));
 
 1021                     newAttrs.add(
new BlackboardAttribute(newAttributeType, String.join(
",", oldAttr.getSources()),
 
 1022                             oldAttr.getValueString()));
 
 1025                     throw new TskCoreException(
"Unexpected attribute value type found: " + oldAttr.getValueType().getLabel()); 
 
 1031         Long newDataSourceId;
 
 1032         if (newIdToContent.get(newContentId).getDataSource() != null) {
 
 1035             newDataSourceId = newIdToContent.get(newContentId).getDataSource().getId();
 
 1038             if (artifactToCopy.getDataSource() == null) {
 
 1040                 throw new TskCoreException(
"Can not copy artifact with ID: " + artifactToCopy.getArtifactID() + 
" because it is not associated with a data source");
 
 1042             newDataSourceId = 
copyContent(artifactToCopy.getDataSource());
 
 1057                         artifactToCopy = ar;
 
 1062                         artifactToCopy = da;
 
 1071             if (artifactToCopy instanceof AnalysisResult) {
 
 1072                 AnalysisResult analysisResultToCopy = (AnalysisResult) artifactToCopy;
 
 1074                         newDataSourceId, analysisResultToCopy.
getScore(),
 
 1077             } 
else if (artifactToCopy instanceof DataArtifact) {
 
 1078                 DataArtifact dataArtifactToCopy = (DataArtifact) artifactToCopy;
 
 1079                 Long newOsAccountId = null;
 
 1086                         newAttrs, newOsAccountId);
 
 1099             throw new TskCoreException(
"Error copying artifact with ID: " + artifactToCopy.getId());
 
 1102         oldArtifactIdToNewArtifact.put(artifactToCopy.getArtifactID(), newArtifact);
 
 1116         if (oldArtTypeIdToNewArtTypeId.containsKey(oldArtifact.getArtifactTypeID())) {
 
 1117             return oldArtTypeIdToNewArtTypeId.get(oldArtifact.getArtifactTypeID());
 
 1123             oldArtTypeIdToNewArtTypeId.put(oldArtifact.getArtifactTypeID(), newCustomType.getTypeID());
 
 1124             return newCustomType.getTypeID();
 
 1126             throw new TskCoreException(
"Error creating new artifact type " + oldCustomType.getTypeName(), ex); 
 
 1147                     oldAttrType.getValueType(), oldAttrType.getDisplayName());
 
 1149             return newCustomType;
 
 1151             throw new TskCoreException(
"Error creating new attribute type " + oldAttrType.getTypeName(), ex); 
 
 1165     @NbBundle.Messages({
 
 1166         "# {0} - File name",
 
 1167         "PortableCaseReportModule.copyContentToPortableCase.copyingFile=Copying file {0}",})
 
 1185         if (oldIdToNewContent.containsKey(content.
getId())) {
 
 1186             return oldIdToNewContent.get(content.
getId()).getId();
 
 1199             BlackboardArtifact artifactToCopy = (BlackboardArtifact) content;
 
 1201         } 
else if (content instanceof 
OsAccount) {
 
 1205             Host newHost = null;
 
 1207                 newHost = 
copyHost(((DataSource) content).getHost());
 
 1212                 AbstractFile file = (AbstractFile) content;
 
 1222             if (content instanceof 
Image) {
 
 1223                 md5 = ((Image) content).getMd5();
 
 1224                 sha1 = ((Image) content).getSha1();
 
 1225                 sha256 = ((Image) content).getSha256();
 
 1230                 if (content instanceof Image) {
 
 1231                     Image image = (Image) content;
 
 1235                     VolumeSystem vs = (VolumeSystem) content;
 
 1237                 } 
else if (content instanceof 
Volume) {
 
 1238                     Volume vs = (Volume) content;
 
 1241                 } 
else if (content instanceof 
Pool) {
 
 1242                     Pool pool = (Pool) content;
 
 1243                     newContent = portableSkCase.
addPool(parentId, pool.
getType(), trans);
 
 1245                     FileSystem fs = (FileSystem) content;
 
 1249                 } 
else if (content instanceof BlackboardArtifact) {
 
 1250                     BlackboardArtifact artifactToCopy = (BlackboardArtifact) content;
 
 1252                 } 
else if (content instanceof AbstractFile) {
 
 1253                     AbstractFile abstractFile = (AbstractFile) content;
 
 1256                         LocalFilesDataSource localFilesDS = (LocalFilesDataSource) abstractFile;
 
 1259                         if (abstractFile.
isDir()) {
 
 1266                                 File exportFolder = Paths.get(copiedFilesFolder.toString(), exportSubFolder).toFile();
 
 1267                                 File localFile = 
new File(exportFolder, fileName);
 
 1272                                 if (!oldIdToNewContent.containsKey(oldParent.
getId())) {
 
 1273                                     throw new TskCoreException(
"Parent of file with ID " + abstractFile.
getId() + 
" has not been created"); 
 
 1275                                 Content newParent = oldIdToNewContent.get(oldParent.
getId());
 
 1278                                 String relativePath = FILE_FOLDER_NAME + File.separator + exportSubFolder + File.separator + fileName;
 
 1280                                 Long newOsAccountId = null;
 
 1282                                     newOsAccountId = oldOsAccountIdToNewOsAccount.get(abstractFile.
getOsAccountObjectId().get()).getId();
 
 1289                                         newOsAccountId, abstractFile.
getOwnerUid().orElse(null),
 
 1291                             } 
catch (IOException ex) {
 
 1293                                         + abstractFile.
getId(), ex); 
 
 1308         oldIdToNewContent.put(content.
getId(), newContent);
 
 1309         newIdToContent.put(newContent.
getId(), newContent);
 
 1310         return oldIdToNewContent.get(content.
getId()).getId();
 
 1325         if (oldHostIdToNewHost.containsKey(oldHost.getHostId())) {
 
 1326             newHost = oldHostIdToNewHost.get(oldHost.getHostId());
 
 1329             oldHostIdToNewHost.put(oldHost.getHostId(), newHost);
 
 1342         if (oldOsAccountIdToNewOsAccount.containsKey(oldOsAccountId)) {
 
 1343             return oldOsAccountIdToNewOsAccount.get(oldOsAccountId);
 
 1355         if (!oldRealmIdToNewRealm.containsKey(oldOsAccount.
getRealmId())) {
 
 1358             Host newHost = null;
 
 1367                     throw new TskCoreException(
"Failed to copy OsAccountRealm with ID=" + oldOsAccount.
getRealmId() + 
" - can not currently handle domain-scoped hosts");
 
 1369                     throw new TskCoreException(
"Failed to copy OsAccountRealm with ID=" + oldOsAccount.
getRealmId() + 
" because it is non-domain scoped but has no scope host");
 
 1374             String realmName = null;
 
 1376             if (!names.isEmpty()) {
 
 1377                 realmName = names.get(0);
 
 1382                 oldRealmIdToNewRealm.put(oldOsAccount.
getRealmId(), newRealm);
 
 1392             oldOsAccountIdToNewOsAccount.put(oldOsAccountId, newOsAccount);
 
 1393             return newOsAccount;
 
 1411         if (oldPathIdAttr != null) {
 
 1414             if (oldContentId > 0) {
 
 1418                         String.join(
",", oldPathIdAttr.
getSources()), newContentId));
 
 1437         if (attachmentsAttr != null) {
 
 1444                     long attachedFileObjId = oldFileAttachment.
getObjectId();
 
 1445                     if (attachedFileObjId >= 0) {
 
 1448                         if (attachedFile == null) {
 
 1449                             throw new TskCoreException(
"Error loading file with object ID " + attachedFileObjId + 
" from portable case");
 
 1457                 String newSourceStr = 
"";
 
 1458                 List<String> oldSources = attachmentsAttr.
getSources();
 
 1459                 if (!oldSources.isEmpty()) {
 
 1460                     newSourceStr = String.join(
",", oldSources);
 
 1468                 throw new TskCoreException(String.format(
"Unable to parse json for MessageAttachments object in artifact: %s", oldArtifact.getName()), ex);
 
 1492             if (cat.getMediaTypes().contains(abstractFile.
getMIMEType())) {
 
 1493                 return cat.getDisplayName();
 
 1518         return Paths.get(installPath, 
"bin", exeName);
 
 1528         return appName + 
"64.exe";
 
 1539     private void copyApplication(Path sourceFolder, String destBaseFolder) 
throws IOException {
 
 1543         if (!destAppFolder.toFile().exists() && !destAppFolder.toFile().mkdirs()) {
 
 1544             throw new IOException(
"Failed to create directory " + destAppFolder.toString());
 
 1548         FileUtils.copyDirectory(sourceFolder.toFile(), destAppFolder.toFile());
 
 1559         Path filePath = Paths.get(destBaseFolder, 
"open.bat");
 
 1562         String casePath = 
"..\\" + 
caseName;
 
 1563         try (FileWriter writer = 
new FileWriter(filePath.toFile())) {
 
 1564             writer.write(exePath + 
" \"" + casePath + 
"\"");
 
 1572         oldIdToNewContent.clear();
 
 1573         newIdToContent.clear();
 
 1574         oldTagNameToNewTagName.clear();
 
 1575         oldArtTypeIdToNewArtTypeId.clear();
 
 1577         oldArtifactIdToNewArtifact.clear();
 
 1578         oldOsAccountIdToNewOsAccount.clear();
 
 1579         oldRealmIdToNewRealm.clear();
 
 1580         oldHostIdToNewHost.clear();
 
 1586         copiedFilesFolder = null;
 
 1593         if (portableSkCase != null) {
 
 1594             portableSkCase.
close();
 
 1595             portableSkCase = null;
 
 1617                         Long maxId = rs.getLong(
"max_id"); 
 
 1618                         String query = 
" (table_name, max_id) VALUES ('" + tableName + 
"', '" + maxId + 
"')"; 
 
 1621                     } 
catch (SQLException ex) {
 
 1622                         logger.log(Level.WARNING, 
"Unable to get maximum ID from result set", ex); 
 
 1624                         logger.log(Level.WARNING, 
"Unable to save maximum ID from result set", ex); 
 
 1628             } 
catch (SQLException ex) {
 
 1629                 logger.log(Level.WARNING, 
"Failed to get maximum ID from result set", ex); 
 
 1634     @NbBundle.Messages({
 
 1635         "PortableCaseReportModule.compressCase.errorFinding7zip=Could not locate 7-Zip executable",
 
 1636         "# {0} - Temp folder path",
 
 1637         "PortableCaseReportModule.compressCase.errorCreatingTempFolder=Could not create temporary folder {0}",
 
 1638         "PortableCaseReportModule.compressCase.errorCompressingCase=Error compressing case",
 
 1639         "PortableCaseReportModule.compressCase.canceled=Compression canceled by user",})
 
 1645         Path dirToCompress = Paths.get(folderToCompress);
 
 1646         File tempZipFolder = Paths.get(dirToCompress.getParent().toString(), 
"temp", 
"portableCase" + System.currentTimeMillis()).toFile();
 
 1647         if (!tempZipFolder.mkdirs()) {
 
 1648             handleError(
"Error creating temporary folder " + tempZipFolder.toString(),
 
 1649                     Bundle.PortableCaseReportModule_compressCase_errorCreatingTempFolder(tempZipFolder.toString()), null, progressPanel); 
 
 1655         if (sevenZipExe == null) {
 
 1656             handleError(
"Error finding 7-Zip exectuable", Bundle.PortableCaseReportModule_compressCase_errorFinding7zip(), null, progressPanel); 
 
 1661         String chunkOption = 
"";
 
 1666         File zipFile = Paths.get(tempZipFolder.getAbsolutePath(), caseName + 
".zip").toFile(); 
 
 1667         ProcessBuilder procBuilder = 
new ProcessBuilder();
 
 1668         procBuilder.command(
 
 1669                 sevenZipExe.getAbsolutePath(),
 
 1671                 zipFile.getAbsolutePath(),
 
 1672                 dirToCompress.toAbsolutePath().toString(),
 
 1677             Process process = procBuilder.start();
 
 1679             while (process.isAlive()) {
 
 1686             int exitCode = process.exitValue();
 
 1687             if (exitCode != 0) {
 
 1689                 StringBuilder sb = 
new StringBuilder();
 
 1690                 try (BufferedReader br = 
new BufferedReader(
new InputStreamReader(process.getErrorStream()))) {
 
 1692                     while ((line = br.readLine()) != null) {
 
 1693                         sb.append(line).append(System.getProperty(
"line.separator")); 
 
 1697                 handleError(
"Error compressing case\n7-Zip output: " + sb.toString(), Bundle.PortableCaseReportModule_compressCase_errorCompressingCase(), null, progressPanel); 
 
 1700         } 
catch (IOException | InterruptedException ex) {
 
 1701             handleError(
"Error compressing case", Bundle.PortableCaseReportModule_compressCase_errorCompressingCase(), ex, progressPanel); 
 
 1707             FileUtils.cleanDirectory(dirToCompress.toFile());
 
 1708             FileUtils.copyDirectory(tempZipFolder, dirToCompress.toFile());
 
 1709             FileUtils.deleteDirectory(
new File(tempZipFolder.getParent()));
 
 1710         } 
catch (IOException ex) {
 
 1711             handleError(
"Error compressing case", Bundle.PortableCaseReportModule_compressCase_errorCompressingCase(), ex, progressPanel); 
 
 1728         String executableToFindName = Paths.get(
"7-Zip", 
"7z.exe").toString(); 
 
 1730         if (null == exeFile) {
 
 1734         if (!exeFile.canExecute()) {
 
 1747         private final Map<String, Long> 
setCounts = 
new HashMap<>();
 
 1754                         Long setCount = rs.getLong(
"set_count"); 
 
 1755                         String setName = rs.getString(
"set_name"); 
 
 1757                         setCounts.put(setName, setCount);
 
 1759                     } 
catch (SQLException ex) {
 
 1760                         logger.log(Level.WARNING, 
"Unable to get data_source_obj_id or value from result set", ex); 
 
 1763             } 
catch (SQLException ex) {
 
 1764                 logger.log(Level.WARNING, 
"Failed to get next result for values by datasource", ex); 
 
static final List< Integer > SPECIALLY_HANDLED_ATTRS
boolean includeApplication()
final Map< Integer, Integer > oldArtTypeIdToNewArtTypeId
Optional< String > getAddr()
TSK_INTERESTING_ARTIFACT_HIT
void handleError(String logWarning, String dialogWarning, Exception ex, ReportProgressPanel progressPanel)
TagName addOrUpdateTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus)
long copyContent(Content content)
static final Logger logger
Optional< Long > getOsAccountObjectId()
AnalysisResult getAnalysisResultById(long artifactObjId)
OsAccountRealm newWindowsRealm(String accountSid, String realmName, Host referringHost, OsAccountRealm.RealmScope realmScope)
Host copyHost(Host oldHost)
int getNewArtifactTypeId(BlackboardArtifact oldArtifact)
static final List< FileTypeCategory > FILE_TYPE_CATEGORIES
static final String MAX_ID_TABLE_NAME
CaseDbTransaction beginTransaction()
void process(ResultSet rs)
OsAccount getOsAccountByObjectId(long osAccountObjId)
final Map< TagName, TagName > oldTagNameToNewTagName
OsAccount copyOsAccount(Long oldOsAccountId)
Collection< URLAttachment > getUrlAttachments()
final Map< Long, Content > oldIdToNewContent
final Map< Long, BlackboardArtifact > oldArtifactIdToNewArtifact
PortableCaseReportModule()
final Map< Long, OsAccount > oldOsAccountIdToNewOsAccount
Blackboard getBlackboard()
String getTempDirectory()
synchronized void close()
String getAutopsyExeName()
long copyContentToPortableCase(Content content, ReportProgressPanel progressPanel)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, long sourceObjId, Long dataSourceObjId, Collection< BlackboardAttribute > attributes, Long osAccountId)
void addArtifactsToPortableCase(TagName oldTagName, ReportProgressPanel progressPanel)
static final String FILE_FOLDER_NAME
List< DataSource > getDataSources()
BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
synchronized CaseDbAccessManager getCaseDbAccessManager()
final Map< Integer, BlackboardAttribute.Type > oldAttrTypeIdToNewAttrType
static String getAppName()
static final Type TSK_INTERESTING_ARTIFACT_HIT
DataArtifact getDataArtifactById(long artifactObjId)
void process(ResultSet rs)
void complete(ReportStatus reportStatus)
List< TagName > getSelectedTagNames()
Map< String, Long > getSetCountMap()
Content getContentById(long id)
static< T > T fromAttribute(BlackboardAttribute attr, Class< T > clazz)
static File locate7ZipExecutable()
void copyAttachments(BlackboardArtifact newArtifact, BlackboardArtifact oldArtifact, AbstractFile newFile)
TskData.TSK_IMG_TYPE_ENUM getType()
Multimap< Long, BlackboardArtifact > getInterestingArtifactsBySetName(SleuthkitCase skCase, List< String > setNames)
static< T > long writeToFile(Content content, java.io.File outputFile, ProgressHandle progress, Future< T > worker, boolean source)
void closePortableCaseDatabase()
List< String > getAllInterestingItemsSets()
void createAppLaunchBatFile(String destBaseFolder)
synchronized TaggingManager getTaggingManager()
BlackboardArtifact getBlackboardArtifact(long artifactID)
AnalysisResult getAnalysisResult()
final Map< Long, OsAccountRealm > oldRealmIdToNewRealm
static final String UNKNOWN_FILE_TYPE_FOLDER
OsAccountRealmManager getOsAccountRealmManager()
boolean tableExists(String tableName)
Logger(String name, String resourceBundleName)
void setIndeterminate(boolean indeterminate)
AbstractFile getAbstractFileById(long id)
BlackboardAttribute.Type getNewAttributeType(BlackboardAttribute oldAttribute)
String getConfiguration()
Pool addPool(long parentObjId, TskData.TSK_POOL_TYPE_ENUM type, CaseDbTransaction transaction)
void copyPathID(BlackboardArtifact newArtifact, BlackboardArtifact oldArtifact)
String toString(boolean preserveState)
void addFilesToPortableCase(TagName oldTagName, ReportProgressPanel progressPanel)
TskData.FileKnown getKnown()
synchronized BlackboardAttribute.Type getOrAddAttributeType(String typeName, BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE valueType, String displayName)
void generateReport(String reportPath, PortableCaseReportModuleSettings options, ReportProgressPanel progressPanel)
List< Content > getChildren()
String getJustification()
String getRelativeFilePath()
TagsManager getTagsManager()
static final String CASE_UCO_TMP_DIR
void initializeImageTags(ReportProgressPanel progressPanel)
String getExportSubfolder(AbstractFile abstractFile)
final Map< Long, Host > oldHostIdToNewHost
static final String TABLE_SCHEMA_SQLITE
void createTable(final String tableName, final String tableSchema)
HostManager getHostManager()
BlackboardArtifact.Type getArtifactType(String artTypeName)
final Map< Long, Content > newIdToContent
SleuthkitCase portableSkCase
static final String TABLE_NAME
Host newHost(String name)
final Map< String, Long > setCounts
SleuthkitCase getSleuthkitCase()
Collection< FileAttachment > getFileAttachments()
List< String > getSelectedSetNames()
Image addImage(TskData.TSK_IMG_TYPE_ENUM type, long sectorSize, long size, String displayName, List< String > imagePaths, String timezone, String md5, String sha1, String sha256, String deviceId, CaseDbTransaction transaction)
ContentTagChange addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset)
FileSystem addFileSystem(long parentObjId, long imgOffset, TskData.TSK_FS_TYPE_ENUM type, long blockSize, long blockCount, long rootInum, long firstInum, long lastInum, String displayName, CaseDbTransaction transaction)
TSK_POOL_TYPE_ENUM getType()
BlackboardArtifact copyArtifact(long newContentId, BlackboardArtifact artifactToCopy)
void generateCaseUcoReport(List< TagName > tagNames, List< String > setNames, ReportProgressPanel progressPanel)
void copyApplication(Path sourceFolder, String destBaseFolder)
LocalFile addLocalFile(String fileName, String localPath, long size, long ctime, long crtime, long atime, long mtime, boolean isFile, TskData.EncodingType encodingType, AbstractFile parent)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, long objId, Long dataSourceObjId, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList)
void select(final String sql, final CaseDbAccessQueryCallback queryCallback)
SleuthkitCase createPortableCase(String caseName, File portableCaseFolder)
boolean areAllTagsSelected()
BlackboardArtifact.Type getOrAddArtifactType(String typeName, String displayName)
boolean addUniqueFile(Content content, DataSource dataSource, Path tmpDir, Gson gson, CaseUcoExporter exporter, JsonWriter reportWriter, boolean dataSourceHasBeenIncluded)
Optional< String > getOwnerUid()
static String escapeFileName(String fileName)
VolumeSystem addVolumeSystem(long parentObjId, TskData.TSK_VS_TYPE_ENUM type, long imgOffset, long blockSize, CaseDbTransaction transaction)
Optional< String > getLoginName()
Optional< Host > getScopeHost()
boolean compressCase(ReportProgressPanel progressPanel, String folderToCompress)
OsAccountManager getOsAccountManager()
TskData.TSK_FS_TYPE_ENUM getFsType()
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
void updateStatusLabel(String statusMessage)
Volume addVolume(long parentObjId, long addr, long start, long length, String desc, long flags, CaseDbTransaction transaction)
static final Score SCORE_NONE
String getImageTagDataForContentTag(ContentTag tag)
static final String CASE_UCO_FILE_NAME
String getSevenZipParam()
long insert(final String tableName, final String sql)
OsAccountRealm getRealmByRealmId(long id)
BlackboardAttribute.Type getAttributeType(String attrTypeName)
boolean areAllSetsSelected()
void addImageTagToPortableCase(ContentTag newContentTag, String appData)
TSK_VS_TYPE_ENUM getType()
void addAttachments(BlackboardArtifact message, MessageAttachments attachments)
void handleCancellation(ReportProgressPanel progressPanel)
static final Type TSK_INTERESTING_ITEM
Path getApplicationBasePath()
LocalFilesDataSource addLocalFilesDataSource(String deviceId, String rootDirectoryName, String timeZone, CaseDbTransaction transaction)
static final Account.Type EMAIL
void createCase(File outputDir, ReportProgressPanel progressPanel)
List< String > getSources()
OsAccount newWindowsOsAccount(String sid, String loginName, String realmName, Host referringHost, OsAccountRealm.RealmScope realmScope)
List< AnalysisResult > getAnalysisResultsByType(int artifactTypeId)
List< String > getRealmNames()
void process(ResultSet rs)
static final Type TSK_INTERESTING_FILE_HIT
PortableCaseReportModuleSettings settings
LocalDirectory addLocalDirectory(long parentId, String directoryName)
Optional< Long > getOsAccountObjectId()