diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java index c05331ed9578b81de29c8d07f5b2a4b40a9eabb1..8be75b050877cffe2d7ad277b9dcfd27334a60e3 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java @@ -892,21 +892,30 @@ protected final int readLocal(byte[] buf, long offset, long len) throws TskCoreE * read() will read the file in the local path. * * @param localPath local path to be set - * @param isAbsolute true if the path is absolute, false if relative to the - * case db */ - void setLocalFilePath(String localPath, boolean isAbsolute) { + void setLocalFilePath(String localPath) { if (localPath == null || localPath.equals("")) { this.localPath = ""; localAbsPath = null; localPathSet = false; } else { + // It should always be the case that absolute paths start with slashes or a windows drive letter + // and relative paths do not, but some older versions of modules created derived file paths + // starting with slashes. So we first check if this file is a DerivedFile before looking at the path. this.localPath = localPath; - if (isAbsolute) { - this.localAbsPath = localPath; + if (this instanceof DerivedFile) { + // DerivedFiles always have relative paths + this.localAbsPath = getSleuthkitCase().getDbDirPath() + java.io.File.separator + localPath; } else { - this.localAbsPath = getSleuthkitCase().getDbDirPath() + java.io.File.separator + this.localPath; + // If a path starts with a slash or with a Windows drive letter, then it is + // absolute. Otherwise it is relative. + if (localPath.startsWith("/") || localPath.startsWith("\\") + || localPath.matches("[A-Za-z]:[/\\\\].*")) { + this.localAbsPath = localPath; + } else { + this.localAbsPath = getSleuthkitCase().getDbDirPath() + java.io.File.separator + localPath; + } } this.localPathSet = true; } @@ -1256,7 +1265,7 @@ public short getAttrId() { */ @Deprecated protected void setLocalPath(String localPath, boolean isAbsolute) { - setLocalFilePath(localPath, isAbsolute); + setLocalFilePath(localPath); } /* diff --git a/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java b/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java index ce60113e4c540c4f6fe987be7279c8bd8f1da200..629a624323569cb4e6d28e29a2561db075752417 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java @@ -103,7 +103,7 @@ public class DerivedFile extends AbstractFile { super(db, objId, dataSourceObjectId, TskData.TSK_FS_ATTR_TYPE_ENUM.TSK_FS_ATTR_TYPE_DEFAULT, 0, name, TSK_DB_FILES_TYPE_ENUM.LOCAL, 0L, 0, dirType, metaType, dirFlag, metaFlags, size, ctime, crtime, atime, mtime, (short) 0, 0, 0, md5Hash, knownState, parentPath, mimeType, extension); - setLocalFilePath(localPath, false); + setLocalFilePath(localPath); setEncodingType(encodingType); } diff --git a/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java b/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java index d5fd6eac39f2a888da8110d685caa2451e307eff..b174a5cd1c652dab00c36d41f6bbf100e9f802a8 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java @@ -98,7 +98,7 @@ public class LocalFile extends AbstractFile { if (parentId > 0) { setParentId(parentId); } - super.setLocalFilePath(localPath, true); + super.setLocalFilePath(localPath); setEncodingType(encodingType); } diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index 6ae044265c8e35ccd353d2c876d6dfa012e4b180..56f5380cf85beec0bc7d9177f7f9dab312194f25 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -1666,7 +1666,7 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot1toSchema8dot2(CaseDbSchem releaseSingleUserCaseWriteLock(); } } - + /** * Extract the extension from a file name. * @@ -5845,6 +5845,10 @@ public DerivedFile addDerivedFile(String fileName, String localPath, boolean isFile, Content parentObj, String rederiveDetails, String toolName, String toolVersion, String otherDetails, TskData.EncodingType encodingType) throws TskCoreException { + + // Strip off any leading slashes from the local path (leading slashes indicate absolute paths) + localPath = localPath.replaceAll("^[/\\\\]+", ""); + CaseDbConnection connection = connections.getConnection(); acquireSingleUserCaseWriteLock(); try { @@ -5970,6 +5974,10 @@ public DerivedFile updateDerivedFile(DerivedFile derivedFile, String localPath, boolean isFile, String mimeType, String rederiveDetails, String toolName, String toolVersion, String otherDetails, TskData.EncodingType encodingType) throws TskCoreException { + + // Strip off any leading slashes from the local path (leading slashes indicate absolute paths) + localPath = localPath.replaceAll("^[/\\\\]+", ""); + CaseDbConnection connection = connections.getConnection(); acquireSingleUserCaseWriteLock(); ResultSet rs = null;