From 440fac07febde3dccea6eae28b99421af8fb43ef Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 21 Apr 2017 17:39:26 -0400 Subject: [PATCH] Modify case display name/unique name handling --- .../sleuthkit/autopsy/casemodule/Case.java | 185 +++++++----------- .../autopsy/casemodule/CaseMetadata.java | 2 +- .../casemodule/NewCaseWizardPanel1.java | 22 +-- .../casemodule/SingleUserCaseConverter.java | 14 +- .../autoingest/AutoIngestManager.java | 17 +- .../experimental/autoingest/PathUtils.java | 8 +- 6 files changed, 96 insertions(+), 152 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 474ffa18ff..ca935e7a81 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -113,10 +113,8 @@ import org.sleuthkit.datamodel.TskCoreException; */ public class Case { - private static final int NAME_LOCK_TIMOUT_HOURS = 12; - private static final int SHARED_DIR_LOCK_TIMOUT_HOURS = 12; - private static final int RESOURCE_LOCK_TIMOUT_HOURS = 12; - private static final int MAX_CASEDB_NAME_LEN_MINUS_TIMESTAMP = 47; //Truncate to 63-16=47 chars to accomodate the timestamp + private static final int DIR_LOCK_TIMOUT_HOURS = 12; + private static final int RESOURCES_LOCK_TIMOUT_HOURS = 12; private static final String SINGLE_USER_CASE_DB_NAME = "autopsy.db"; private static final String EVENT_CHANNEL_NAME = "%s-Case-Events"; //NON-NLS private static final String CACHE_FOLDER = "Cache"; //NON-NLS @@ -475,18 +473,21 @@ public class Case { } if (null != currentCase) { + String previousCaseDisplayName = currentCase.getDisplayName(); + String previousCaseName = currentCase.getName(); + String previousCaseDir = currentCase.getCaseDirectory(); try { closeCurrentCase(); } catch (CaseActionException ex) { - logger.log(Level.SEVERE, "Error closing the previous current case", ex); //NON-NLS + logger.log(Level.SEVERE, String.format("Error closing the previous current case %s (%s) in %s", previousCaseDisplayName, previousCaseName, previousCaseDir), ex); //NON-NLS } } - logger.log(Level.INFO, "Creating current case with display name {0} in {1}", new Object[]{caseDisplayName, caseDir}); //NON-NLS + logger.log(Level.INFO, "Creating current case {0} in {1}", new Object[]{caseDisplayName, caseDir}); //NON-NLS Case newCurrentCase = new Case(); - newCurrentCase.open(caseDir, caseDisplayName, caseNumber, examiner, caseType); + newCurrentCase.create(caseType, caseDir, caseDisplayName, caseNumber, examiner); currentCase = newCurrentCase; - logger.log(Level.INFO, "Created currrent case {0} (display name {1}) in {2}", new Object[]{newCurrentCase.getName(), caseDisplayName, caseDir}); //NON-NLS + logger.log(Level.INFO, "Created currrent case {0} ({1}) in {2}", new Object[]{newCurrentCase.getDisplayName(), newCurrentCase.getName(), newCurrentCase.getCaseDirectory()}); //NON-NLS if (RuntimeProperties.runningWithGUI()) { updateGUIForCaseOpened(newCurrentCase); } @@ -723,83 +724,44 @@ public class Case { } /** - * Transforms the display name for a case to make a suitable case name for - * use in case directory paths, coordination service locks, Active MQ - * message channels, etc. - * - * ActiveMQ: - * http://activemq.2283324.n4.nabble.com/What-are-limitations-restrictions-on-destination-name-td4664141.html - * may not be ? + * Transforms a case display name into a unique case name that can be used + * to identify the case even if the display name is changed. * * @param caseDisplayName A case display name. * - * @return The case display name transformed into a corresponding case name. + * @return The unique case name. * - * @throws org.sleuthkit.autopsy.casemodule.Case.IllegalCaseNameException + * @throws IllegalCaseNameException If the transformation fails. */ - public static String displayNameToCaseName(String caseDisplayName) throws IllegalCaseNameException { + private static String displayNameToUniqueName(String caseDisplayName) throws IllegalCaseNameException { + /* + * Replace all non-ASCII characters. + */ + String uniqueCaseName = caseDisplayName.replaceAll("[^\\p{ASCII}]", "_"); //NON-NLS /* - * Remove all non-ASCII characters. + * Replace all control characters. */ - String caseName = caseDisplayName.replaceAll("[^\\p{ASCII}]", "_"); //NON-NLS + uniqueCaseName = uniqueCaseName.replaceAll("[\\p{Cntrl}]", "_"); //NON-NLS /* - * Remove all control characters. + * Replace /, \, :, ?, space, ' ". */ - caseName = caseName.replaceAll("[\\p{Cntrl}]", "_"); //NON-NLS - - /* - * Remove /, \, :, ?, space, ' ". - */ - caseName = caseName.replaceAll("[ /?:'\"\\\\]", "_"); //NON-NLS + uniqueCaseName = uniqueCaseName.replaceAll("[ /?:'\"\\\\]", "_"); //NON-NLS /* * Make it all lowercase. */ - caseName = caseName.toLowerCase(); - - if (caseName.isEmpty()) { - throw new IllegalCaseNameException(String.format("Failed to convert case name '%s'", caseDisplayName)); - } - - return caseName; - } - - /** - * Transforms a case name into a name for a PostgreSQL database that can be - * safely used in SQL commands as described at - * http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html: 63 - * chars max, must start with a letter or underscore, following chars can be - * letters, underscores, or digits. A timestamp suffix is added to ensure - * uniqueness. - * - * @param caseName The case name. - * - * @return The case name transformed into a corresponding PostgreSQL case - * database name. - */ - private static String caseNameToCaseDbName(String caseName) throws IllegalCaseNameException { - /* - * Must start with letter or underscore. If not, prepend an underscore. - */ - String dbName = caseName; - if (dbName.length() > 0 && !(Character.isLetter(dbName.codePointAt(0))) && !(dbName.codePointAt(0) == '_')) { - dbName = "_" + dbName; - } + uniqueCaseName = uniqueCaseName.toLowerCase(); /* - * Truncate to 63-16=47 chars to accomodate the timestamp, then add the - * timestamp. + * Add a time stamp for uniqueness. */ - if (dbName.length() > MAX_CASEDB_NAME_LEN_MINUS_TIMESTAMP) { - dbName = dbName.substring(0, MAX_CASEDB_NAME_LEN_MINUS_TIMESTAMP); - } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); Date date = new Date(); - dbName = dbName + "_" + dateFormat.format(date); + uniqueCaseName = uniqueCaseName + "_" + dateFormat.format(date); - return dbName; + return uniqueCaseName; } /** @@ -973,7 +935,7 @@ public class Case { private static CoordinationService.Lock acquireExclusiveCaseResourcesLock(String caseDir) throws CaseActionException { try { String resourcesNodeName = caseDir + "_resources"; - Lock lock = CoordinationService.getInstance().tryGetExclusiveLock(CategoryNode.CASES, resourcesNodeName, RESOURCE_LOCK_TIMOUT_HOURS, TimeUnit.HOURS); + Lock lock = CoordinationService.getInstance().tryGetExclusiveLock(CategoryNode.CASES, resourcesNodeName, RESOURCES_LOCK_TIMOUT_HOURS, TimeUnit.HOURS); if (null == lock) { throw new CaseActionException(Bundle.Case_creationException_couldNotAcquireResourcesLock()); } @@ -1585,6 +1547,7 @@ public class Case { } /** + * @param caseType The type of case (single-user or multi-user). * @param caseDir The full path of the case directory. The directory * will be created if it doesn't already exist; if it * exists, it is ASSUMED it was created by calling @@ -1594,7 +1557,6 @@ public class Case { * @param caseNumber The case number, can be the empty string. * @param examiner The examiner to associate with the case, can be * the empty string. - * @param caseType The type of case (single-user or multi-user). * * @throws CaseActionException if there is a problem creating the case. The * exception will have a user-friendly message @@ -1602,24 +1564,12 @@ public class Case { * exception. */ @Messages({ - "Case.exceptionMessage.illegalCaseName=Case name contains illegal characters.", "Case.progressIndicatorTitle.creatingCase=Creating Case", "Case.progressIndicatorCancelButton.label=Cancel", "Case.progressMessage.preparing=Preparing...", "Case.progressMessage.openingCaseResources=Preparing to open case resources.
This may take time if another user is upgrading the case." }) - private void open(String caseDir, String caseDisplayName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException { - /* - * Clean up the display name for the case to make a suitable immutable - * case name. - */ - String caseName; - try { - caseName = displayNameToCaseName(caseDisplayName); - } catch (IllegalCaseNameException ex) { - throw new CaseActionException(Bundle.Case_exceptionMessage_wrapperMessage(Bundle.Case_exceptionMessage_illegalCaseName()), ex); - } - + private void create(CaseType caseType, String caseDir, String caseDisplayName, String caseNumber, String examiner) throws CaseActionException { /* * Set up either a GUI progress indicator or a logging progress * indicator. @@ -1648,7 +1598,7 @@ public class Case { caseLockingExecutor = Executors.newSingleThreadExecutor(); Future future = caseLockingExecutor.submit(() -> { if (CaseType.SINGLE_USER_CASE == caseType) { - open(caseDir, caseName, caseDisplayName, caseNumber, examiner, caseType, progressIndicator); + create(caseType, caseDir, caseDisplayName, caseNumber, examiner, progressIndicator); } else { /* * Acquire a shared case directory lock that will be held as @@ -1657,6 +1607,7 @@ public class Case { */ progressIndicator.start(Bundle.Case_progressMessage_openingCaseResources()); acquireSharedCaseDirLock(caseDir); + /* * Acquire an exclusive case resources lock to ensure only one * node at a time can create/open/upgrade/close the case @@ -1665,14 +1616,14 @@ public class Case { try (CoordinationService.Lock resourcesLock = acquireExclusiveCaseResourcesLock(caseDir)) { assert (null != resourcesLock); try { - open(caseDir, caseName, caseDisplayName, caseNumber, examiner, caseType, progressIndicator); + create(caseType, caseDir, caseDisplayName, caseNumber, examiner, progressIndicator); } catch (CaseActionException ex) { /* * Release the case directory lock immediately if there * was a problem opening the case. */ if (CaseType.MULTI_USER_CASE == caseType) { - releaseSharedCaseDirLock(caseName); + releaseSharedCaseDirLock(caseDir); } throw ex; } @@ -1696,7 +1647,6 @@ public class Case { */ try { future.get(); - } catch (InterruptedException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_wrapperMessage(ex.getMessage()), ex); } catch (ExecutionException ex) { @@ -1711,18 +1661,20 @@ public class Case { } /** - * Creates and opens a new case. + * Creates a new case. * - * @param caseDir The full path of the case directory. The directory - * will be created if it doesn't already exist; if it - * exists, it is ASSUMED it was created by calling - * createCaseDirectory. - * @param caseDisplayName The display name of case, which may be changed - * later by the user. - * @param caseNumber The case number, can be the empty string. - * @param examiner The examiner to associate with the case, can be - * the empty string. - * @param caseType The type of case (single-user or multi-user). + * @param caseType The type of case (single-user or multi-user). + * @param caseDir The full path of the case directory. The + * directory will be created if it doesn't already + * exist; if it exists, it is ASSUMED it was + * created by calling createCaseDirectory. + * @param caseName The case name. + * @param caseDisplayName The display name of case, which may be changed + * later by the user. + * @param caseNumber The case number, can be the empty string. + * @param examiner The examiner to associate with the case, can be + * the empty string. + * @param progressIndicator A progress indicator. * * @throws CaseActionException if there is a problem creating the case. The * exception will have a user-friendly message @@ -1730,6 +1682,7 @@ public class Case { * exception. */ @Messages({ + "Case.exceptionMessage.illegalCaseName=Case name contains one or more illegal characters (\\,/,:,*,?,<,>,|).", "Case.progressMessage.creatingCaseDirectory=Creating case directory...", "Case.progressMessage.creatingCaseDatabase=Creating case database...", "Case.exceptionMessage.couldNotCreateCaseDatabaseName=Failed to create case database name from case name.", @@ -1737,7 +1690,7 @@ public class Case { "Case.exceptionMessage.couldNotCreateMetadataFile=Failed to create case metadata file.", "Case.exceptionMessage.couldNotCreateCaseDatabase=Failed to create case database." }) - private void open(String caseDir, String caseName, String caseDisplayName, String caseNumber, String examiner, CaseType caseType, ProgressIndicator progressIndicator) throws CaseActionException { + private void create(CaseType caseType, String caseDir, String caseDisplayName, String caseNumber, String examiner, ProgressIndicator progressIndicator) throws CaseActionException { /* * Create the case directory, if it does not already exist. * @@ -1763,37 +1716,41 @@ public class Case { Case.createCaseDirectory(caseDir, caseType); } + /* + * Create a unique and immutable case name from the case display name. + */ + String caseName; + try { + caseName = displayNameToUniqueName(caseDisplayName); + } catch (IllegalCaseNameException ex) { + throw new CaseActionException(Bundle.Case_exceptionMessage_wrapperMessage(Bundle.Case_exceptionMessage_illegalCaseName()), ex); + } + /* * Create the case database. */ progressIndicator.progress(Bundle.Case_progressMessage_creatingCaseDatabase()); String dbName = null; - try { - if (CaseType.SINGLE_USER_CASE == caseType) { - dbName = SINGLE_USER_CASE_DB_NAME; - } else if (CaseType.MULTI_USER_CASE == caseType) { - dbName = caseNameToCaseDbName(caseName); - } - } catch (IllegalCaseNameException ex) { - throw new CaseActionException(Bundle.Case_exceptionMessage_couldNotCreateCaseDatabaseName(), ex); - } try { if (CaseType.SINGLE_USER_CASE == caseType) { /* * For single-user cases, the case database is a SQLite database - * physically located in the root of the case directory. + * with a standard name, physically located in the root of the + * case directory. */ + dbName = SINGLE_USER_CASE_DB_NAME; this.caseDb = SleuthkitCase.newCase(Paths.get(caseDir, SINGLE_USER_CASE_DB_NAME).toString()); } else if (CaseType.MULTI_USER_CASE == caseType) { /* * For multi-user cases, the case database is a PostgreSQL - * database physically located on the database server. + * database with a name derived from the case display name, + * physically located on the database server. */ - this.caseDb = SleuthkitCase.newCase(dbName, UserPreferences.getDatabaseConnectionInfo(), caseDir); + this.caseDb = SleuthkitCase.newCase(caseDisplayName, UserPreferences.getDatabaseConnectionInfo(), caseDir); + dbName = this.caseDb.getDatabaseName(); } } catch (TskCoreException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_couldNotCreateCaseDatabase(), ex); - } catch (UserPreferencesException ex) { throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.databaseConnectionInfo.error.msg"), ex); } @@ -1814,7 +1771,7 @@ public class Case { /** * Opens an existing case. * - * @param caseMetadataFilePath The apth to the case metadata file. + * @param caseMetadataFilePath The path to the case metadata file. * * @throws CaseActionException if there is a problem creating the case. The * exception will have a user-friendly message @@ -1980,7 +1937,8 @@ public class Case { "Case.progressMessage.settingUpNetworkCommunications=Setting up network communications...",}) private void openServices(ProgressIndicator progressIndicator) throws CaseActionException { /* - * Switch to writing to the application logs in the logs subdirectory. + * Switch to writing to the application logs in the logs subdirectory of + * the case directory. */ progressIndicator.progress(Bundle.Case_progressMessage_switchingLogDirectory()); Logger.setLogDirectory(getLogDirectoryPath()); @@ -1989,12 +1947,11 @@ public class Case { * Hook up a SleuthKit layer error reporter. */ progressIndicator.progress(Bundle.Case_progressMessage_settingUpTskErrorReporting()); - this.sleuthkitErrorReporter = new SleuthkitErrorReporter(MIN_SECS_BETWEEN_TSK_ERROR_REPORTS, NbBundle.getMessage(Case.class, "IntervalErrorReport.ErrorText")); this.caseDb.addErrorObserver(this.sleuthkitErrorReporter); /* - * Clear the temp subdirectory. + * Clear the temp subdirectory of the case directory. */ progressIndicator.progress(Bundle.Case_progressMessage_clearingTempDirectory()); Case.clearTempSubDir(this.getTempDirectory()); @@ -2335,7 +2292,7 @@ public class Case { @Messages({"Case.creationException.couldNotAcquireDirLock=Failed to get lock on case directory."}) private void acquireSharedCaseDirLock(String caseDir) throws CaseActionException { try { - caseDirLock = CoordinationService.getInstance().tryGetSharedLock(CategoryNode.CASES, caseDir, SHARED_DIR_LOCK_TIMOUT_HOURS, TimeUnit.HOURS); + caseDirLock = CoordinationService.getInstance().tryGetSharedLock(CategoryNode.CASES, caseDir, DIR_LOCK_TIMOUT_HOURS, TimeUnit.HOURS); if (null == caseDirLock) { throw new CaseActionException(Bundle.Case_creationException_couldNotAcquireDirLock()); } @@ -2404,7 +2361,7 @@ public class Case { * An exception to throw when a case name with invalid characters is * encountered. */ - public final static class IllegalCaseNameException extends Exception { + final static class IllegalCaseNameException extends Exception { private static final long serialVersionUID = 1L; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index d53b8b3c66..9a870e25a2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -125,7 +125,7 @@ public final class CaseMetadata { * created. */ CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, String caseDisplayName, String caseNumber, String examiner, String caseDatabase) throws CaseMetadataException { - metadataFilePath = Paths.get(caseDirectory, caseName + FILE_EXTENSION); + metadataFilePath = Paths.get(caseDirectory, caseDisplayName + FILE_EXTENSION); this.caseType = caseType; this.caseName = caseName; this.caseDisplayName = caseDisplayName; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java index 8ceda8fc2a..dcfaab449c 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java @@ -204,25 +204,19 @@ class NewCaseWizardPanel1 implements WizardDescriptor.ValidatingPanel | - if (!Case.isValidName(caseDisplayName)) { + /* + * Check whether or not the case name is valid. To be valid, the case + * name must not contain any characters that are not allowed in file + * names, since it will be used as the name of the case directory. + */ + String caseName = getComponent().getCaseName(); + if (!Case.isValidName(caseName)) { String errorMsg = NbBundle .getMessage(this.getClass(), "NewCaseWizardPanel1.validate.errMsg.invalidSymbols"); validationError(errorMsg); } else { - String caseName = ""; - try { - caseName = Case.displayNameToCaseName(caseDisplayName); - } catch (Case.IllegalCaseNameException ex) { - String errorMsg = NbBundle - .getMessage(this.getClass(), "NewCaseWizardPanel1.validate.errMsg.invalidSymbols"); - validationError(errorMsg); - } + String caseParentDir = getComponent().getCaseParentDir(); String caseDirPath = caseParentDir + caseName; // check if the directory exist diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index ddc0ccd1d5..50494f47a0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -43,7 +43,7 @@ import org.sleuthkit.datamodel.TskData; /** * Import a case from single-user to multi-user. - * + * * DO NOT USE, NEEDS TO BE UPDATED */ public class SingleUserCaseConverter { @@ -175,9 +175,15 @@ public class SingleUserCaseConverter { } // Create sanitized names for PostgreSQL and Solr + /* + * RJC: Removed package access sanitizeCaseName method, so this is no + * longer correct, but this whole class is currently out-of-date (out of + * synch with case database schema) and probably belongs in the TSK + * layer anyway, see JIRA-1984. + */ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); //NON-NLS Date date = new Date(); - String dbName = Case.displayNameToCaseName(icd.getNewCaseName()) + "_" + dateFormat.format(date); //NON-NLS + String dbName = icd.getNewCaseName() + "_" + dateFormat.format(date); //NON-NLS icd.setPostgreSQLDbName(dbName); // Copy items to new hostname folder structure @@ -493,12 +499,12 @@ public class SingleUserCaseConverter { if (value > biggestPK) { biggestPK = value; } - + // If the entry contains an encoding type, copy it. Otherwise use NONE. // The test on column count can be removed if we upgrade the database before conversion. int encoding = TskData.EncodingType.NONE.getType(); ResultSetMetaData rsMetaData = inputResultSet.getMetaData(); - if(rsMetaData.getColumnCount() == 3){ + if (rsMetaData.getColumnCount() == 3) { encoding = inputResultSet.getInt(3); } outputStatement.executeUpdate("INSERT INTO tsk_files_path (obj_id, path, encoding_type) VALUES (" //NON-NLS diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 9ffec1bedc..900a5a603b 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -64,7 +64,6 @@ import javax.annotation.concurrent.ThreadSafe; import org.openide.util.Lookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case.CaseType; -import org.sleuthkit.autopsy.casemodule.Case.IllegalCaseNameException; import org.sleuthkit.autopsy.casemodule.CaseActionException; import org.sleuthkit.autopsy.casemodule.CaseMetadata; import org.sleuthkit.autopsy.coordinationservice.CoordinationService; @@ -1880,14 +1879,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang */ private Case openCase() throws CoordinationServiceException, CaseManagementException, InterruptedException { Manifest manifest = currentJob.getManifest(); - String caseDisplayName = manifest.getCaseName(); - String caseName; - try { - caseName = Case.displayNameToCaseName(caseDisplayName); - } catch (IllegalCaseNameException ex) { - throw new CaseManagementException(String.format("Error creating or opening case %s for %s", manifest.getCaseName(), manifest.getFilePath()), ex); - } - SYS_LOGGER.log(Level.INFO, "Opening case {0} ({1}) for {2}", new Object[]{caseDisplayName, caseName, manifest.getFilePath()}); + String caseName = manifest.getCaseName(); + SYS_LOGGER.log(Level.INFO, "Opening case {0} for {2}", new Object[]{caseName, manifest.getFilePath()}); currentJob.setStage(AutoIngestJob.Stage.OPENING_CASE); /* * Acquire and hold a case name lock so that only one node at as @@ -1917,16 +1910,16 @@ public final class AutoIngestManager extends Observable implements PropertyChang return caseForJob; } catch (CaseActionException ex) { - throw new CaseManagementException(String.format("Error creating or opening case %s (%s) for %s", manifest.getCaseName(), caseName, manifest.getFilePath()), ex); + throw new CaseManagementException(String.format("Error creating or opening case %s for %s", caseName, manifest.getFilePath()), ex); } catch (IllegalStateException ex) { /* * Deal with the unfortunate fact that * Case.getCurrentCase throws IllegalStateException. */ - throw new CaseManagementException(String.format("Error getting current case %s (%s) for %s", caseName, manifest.getCaseName(), manifest.getFilePath()), ex); + throw new CaseManagementException(String.format("Error getting current case %s for %s", caseName, manifest.getFilePath()), ex); } } else { - throw new CaseManagementException(String.format("Timed out acquiring case name lock for %s for %s", manifest.getCaseName(), manifest.getFilePath())); + throw new CaseManagementException(String.format("Timed out acquiring case name lock for %s for %s", caseName, manifest.getFilePath())); } } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java index 9b99e8c13f..772dcf667e 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java @@ -46,18 +46,12 @@ final class PathUtils { * @return The path of the case folder, or null if it is not found. */ static Path findCaseDirectory(Path folderToSearch, String caseName) { - String sanitizedCaseName; - try { - sanitizedCaseName = Case.displayNameToCaseName(caseName); - } catch (Case.IllegalCaseNameException unused) { - return null; - } File searchFolder = new File(folderToSearch.toString()); if (!searchFolder.isDirectory()) { return null; } Path caseFolderPath = null; - String[] candidateFolders = searchFolder.list(new CaseFolderFilter(sanitizedCaseName)); + String[] candidateFolders = searchFolder.list(new CaseFolderFilter(caseName)); long mostRecentModified = 0; for (String candidateFolder : candidateFolders) { File file = new File(candidateFolder);