19 package org.sleuthkit.datamodel;
21 import com.google.common.annotations.Beta;
22 import java.io.BufferedReader;
23 import java.io.FileReader;
24 import java.io.IOException;
25 import java.text.DateFormat;
26 import java.text.SimpleDateFormat;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.GregorianCalendar;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.List;
35 import java.util.TimeZone;
36 import java.util.UUID;
37 import java.util.concurrent.locks.ReadWriteLock;
38 import java.util.concurrent.locks.ReentrantReadWriteLock;
39 import java.util.logging.Level;
40 import java.util.logging.Logger;
41 import org.apache.commons.lang3.StringUtils;
55 private static final Logger logger = Logger.getLogger(
SleuthkitJNI.class.getName());
63 private static final ReadWriteLock tskLock =
new ReentrantReadWriteLock();
82 private static class CaseHandles {
87 private final Map<String, Long> imageHandleCache =
new HashMap<>();
93 private final Map<Long, Map<Long, Long>> fsHandleCache =
new HashMap<>();
99 private final Set<Long> fileHandleCache =
new HashSet<>();
101 private final Map<Long, List<Long>> fileSystemToFileHandles =
new HashMap<>();
103 private final Map<Long, Map<Long, Long>> poolHandleCache =
new HashMap<>();
106 private final List<Long> poolImgCache =
new ArrayList<>();
115 private final List<Long> poolFsList =
new ArrayList<>();
117 private CaseHandles() {
128 private static class HandleCache {
133 private static final Object cacheLock =
new Object();
135 private static final Map<String, CaseHandles> caseHandlesCache =
new HashMap<>();
137 private static final String INVALID_FILE_HANDLE =
"Invalid file handle.";
148 private static final List<Long> poolFileHandles =
new ArrayList<>();
155 private static void createCaseHandleCache(String caseIdentifier) {
156 caseHandlesCache.put(caseIdentifier,
new CaseHandles());
168 synchronized (cacheLock) {
169 if (caseHandlesCache.keySet().size() > 1) {
170 throw new TskCoreException(
"Can not get default case identifier with multiple open cases");
171 }
else if (caseHandlesCache.keySet().isEmpty()) {
172 throw new TskCoreException(
"Can not get default case identifier with no open case");
175 return (caseHandlesCache.keySet().iterator().next());
188 private static CaseHandles getCaseHandles(String caseIdentifier)
throws TskCoreException {
189 synchronized (cacheLock) {
190 if (caseHandlesCache.containsKey(caseIdentifier)) {
191 return caseHandlesCache.get(caseIdentifier);
194 throw new TskCoreException(
"No entry for case " + caseIdentifier +
" in cache. Case may have been closed");
203 private static void removeCaseHandlesCache(String caseIdentifier) {
204 synchronized (cacheLock) {
205 if (caseHandlesCache.containsKey(caseIdentifier)) {
206 caseHandlesCache.get(caseIdentifier).fsHandleCache.clear();
207 caseHandlesCache.get(caseIdentifier).imageHandleCache.clear();
208 caseHandlesCache.get(caseIdentifier).fileHandleCache.clear();
209 caseHandlesCache.get(caseIdentifier).fileSystemToFileHandles.clear();
210 caseHandlesCache.get(caseIdentifier).poolHandleCache.clear();
211 caseHandlesCache.remove(caseIdentifier);
223 private static boolean isImageInAnyCache(
long imgHandle) {
224 synchronized (cacheLock) {
225 for (String caseIdentifier:caseHandlesCache.keySet()) {
226 if (caseHandlesCache.get(caseIdentifier).fsHandleCache.keySet().contains(imgHandle)) {
241 private static void addFileHandle(String caseIdentifier,
long fileHandle,
long fsHandle) {
243 synchronized (cacheLock) {
245 getCaseHandles(caseIdentifier).fileHandleCache.add(fileHandle);
248 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
249 getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle).add(fileHandle);
251 getCaseHandles(caseIdentifier).fileSystemToFileHandles.put(fsHandle,
new ArrayList<>(Arrays.asList(fileHandle)));
255 logger.log(Level.WARNING,
"Error caching file handle for case {0}", caseIdentifier);
265 private static void removeFileHandle(
long fileHandle,
SleuthkitCase skCase) {
266 synchronized (cacheLock) {
268 if (skCase != null) {
270 getCaseHandles(skCase.getCaseHandleIdentifier()).fileHandleCache.remove(fileHandle);
276 for (String caseIdentifier:caseHandlesCache.keySet()) {
277 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
278 caseHandlesCache.get(caseIdentifier).fileHandleCache.remove(fileHandle);
293 private static boolean isValidFileHandle(
long fileHandle) {
294 synchronized (cacheLock) {
295 for (String caseIdentifier:caseHandlesCache.keySet()) {
296 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
304 private static void closeHandlesAndClearCache(String caseIdentifier)
throws TskCoreException {
305 synchronized (cacheLock) {
309 for (Map<Long, Long> imageToFsMap : getCaseHandles(caseIdentifier).fsHandleCache.values()) {
310 for (Long fsHandle : imageToFsMap.values()) {
312 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
313 for (Long fileHandle : getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle)) {
315 if (poolFileHandles.contains(fileHandle)) {
316 poolFileHandles.remove(fileHandle);
322 closeFsNat(fsHandle);
329 getCaseHandles(caseIdentifier).poolFsList.clear();
334 for (Long imgHandle : getCaseHandles(caseIdentifier).poolHandleCache.keySet()) {
335 for (Long poolHandle : getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle).values()) {
336 closePoolNat(poolHandle);
343 for (Long imageHandle : getCaseHandles(caseIdentifier).poolImgCache) {
344 closeImgNat(imageHandle);
350 for (Long imageHandle : getCaseHandles(caseIdentifier).imageHandleCache.values()) {
351 closeImgNat(imageHandle);
354 removeCaseHandlesCache(caseIdentifier);
369 private final String caseDbIdentifier;
378 this.caseDbIdentifier =
"SingleUser:" + databaseName;
379 HandleCache.createCaseHandleCache(caseDbIdentifier);
390 this.caseDbIdentifier =
"MultiUser:" + info.
getHost() +
":" + databaseName;
391 HandleCache.createCaseHandleCache(caseDbIdentifier);
399 String getCaseDbIdentifier() {
400 return caseDbIdentifier;
410 tskLock.writeLock().lock();
412 HandleCache.closeHandlesAndClearCache(caseDbIdentifier);
415 tskLock.writeLock().unlock();
442 if (imageFilePaths.size() > 0) {
443 String path = imageFilePaths.get(0);
444 hostName = (
new java.io.File(path)).getName() +
" Host";
446 hostName =
"Image_" + deviceObjId +
" Host";
451 long tskAutoDbPointer = initializeAddImgPasswordNat(dbHelper, timezoneLongToShort(timeZone),
false,
false,
false, password);
452 runOpenAndAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(
new String[0]), imageFilePaths.size(), timeZone);
453 long id = finishAddImgNat(tskAutoDbPointer);
455 skCase.addDataSourceToHasChildrenMap();
480 AddImageProcess initAddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageCopyPath, String password,
SleuthkitCase skCase) {
481 return new AddImageProcess(timeZone, addUnallocSpace, skipFatFsOrphans, imageCopyPath, password, skCase);
490 private final String timeZone;
491 private final boolean addUnallocSpace;
492 private final boolean skipFatFsOrphans;
493 private final String imageWriterPath;
494 private volatile long tskAutoDbPointer;
495 private long imageId = 0;
496 private boolean isCanceled;
498 private TskCaseDbBridge dbHelper;
499 private final String password;
516 private AddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageWriterPath, String password,
SleuthkitCase skCase) {
517 this.timeZone = timeZone;
518 this.addUnallocSpace = addUnallocSpace;
519 this.skipFatFsOrphans = skipFatFsOrphans;
520 this.imageWriterPath = imageWriterPath;
521 tskAutoDbPointer = 0;
522 this.isCanceled =
false;
523 this.skCase = skCase;
524 this.password = password;
566 public void run(String deviceId,
Image image,
int sectorSize,
569 dbHelper =
new TskCaseDbBridge(skCase, addDataSourceCallbacks, image.getHost());
572 long imageHandle = 0;
573 synchronized (
this) {
574 if (0 != tskAutoDbPointer) {
575 throw new TskCoreException(
"Add image process already started");
578 imageHandle = image.getImageHandle();
579 tskAutoDbPointer = initAddImgNatPassword(dbHelper, timezoneLongToShort(timeZone), addUnallocSpace, skipFatFsOrphans, password);
581 if (0 == tskAutoDbPointer) {
582 throw new TskCoreException(
"initAddImgNat returned a NULL TskAutoDb pointer");
585 if (imageHandle != 0) {
586 runAddImgNat(tskAutoDbPointer, deviceId, imageHandle, image.getId(), timeZone, imageWriterPath);
589 finishAddImageProcess();
590 releaseTSKReadLock();
603 public synchronized void stop() throws TskCoreException {
607 if (tskAutoDbPointer != 0) {
608 stopAddImgNat(tskAutoDbPointer);
611 releaseTSKReadLock();
625 private synchronized void finishAddImageProcess() throws TskCoreException {
626 if (tskAutoDbPointer == 0) {
632 if (! this.isCanceled && dbHelper != null) {
637 imageId = finishAddImgNat(tskAutoDbPointer);
638 tskAutoDbPointer = 0;
640 skCase.addDataSourceToHasChildrenMap();
652 public synchronized void revert() throws TskCoreException {
668 public synchronized long commit() throws TskCoreException {
679 return tskAutoDbPointer == 0 ?
"" : getCurDirNat(tskAutoDbPointer);
699 run(null, imageFilePaths, 0);
718 run(deviceId, imageFilePaths, 0);
735 static CaseDbHandle newCaseDb(String path)
throws TskCoreException {
736 return new CaseDbHandle(path);
751 static CaseDbHandle newCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
752 return new CaseDbHandle(databaseName, info);
766 static CaseDbHandle openCaseDb(String path)
throws TskCoreException {
767 return new CaseDbHandle(path);
782 static CaseDbHandle openCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
783 return new CaseDbHandle(databaseName, info);
792 return getVersionNat();
801 startVerboseLoggingNat(logPath);
816 if (skCase == null) {
817 throw new TskCoreException(
"SleuthkitCase can not be null");
819 return openImage(imageFiles, 0,
true, skCase.getCaseHandleIdentifier());
836 if (skCase == null) {
837 throw new TskCoreException(
"SleuthkitCase can not be null");
839 return openImage(imageFiles, sSize,
true, skCase.getCaseHandleIdentifier());
859 private static long openImage(String[] imageFiles,
int sSize,
boolean useCache, String caseIdentifer)
throws TskCoreException {
864 StringBuilder keyBuilder =
new StringBuilder();
865 for (
int i = 0; i < imageFiles.length; ++i) {
866 keyBuilder.append(imageFiles[i]);
868 final String imageKey = keyBuilder.toString();
870 synchronized (HandleCache.cacheLock) {
871 String nonNullCaseIdentifer = caseIdentifer;
872 if (nonNullCaseIdentifer == null) {
873 nonNullCaseIdentifer = HandleCache.getDefaultCaseIdentifier();
881 if (!useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey)) {
882 long tempImageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
886 String newPath =
"Image_" + UUID.randomUUID().toString();
887 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(newPath, tempImageHandle);
888 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.remove(imageKey);
891 if (useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey))
893 imageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
896 imageHandle = openImgNat(imageFiles, imageFiles.length, sSize);
897 HandleCache.getCaseHandles(nonNullCaseIdentifer).fsHandleCache.put(imageHandle,
new HashMap<>());
898 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(imageKey, imageHandle);
903 releaseTSKReadLock();
920 private static void cacheImageHandle(SleuthkitCase skCase, List<String> imagePaths,
long imageHandle)
throws TskCoreException {
923 StringBuilder keyBuilder =
new StringBuilder();
924 for (
int i = 0; i < imagePaths.size(); ++i) {
925 keyBuilder.append(imagePaths.get(i));
927 final String imageKey = keyBuilder.toString();
930 String caseIdentifier = skCase.getCaseHandleIdentifier();
932 synchronized (HandleCache.cacheLock) {
933 HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.put(imageHandle,
new HashMap<>());
934 HandleCache.getCaseHandles(caseIdentifier).imageHandleCache.put(imageKey, imageHandle);
955 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId)
throws TskCoreException {
957 return addImageToDatabase(skCase, imagePaths, sectorSize, timeZone, md5fromSettings, sha1fromSettings, sha256fromSettings, deviceId, null);
978 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId,
Host host)
throws TskCoreException {
980 return addImageToDatabase(skCase, imagePaths, sectorSize, timeZone, md5fromSettings, sha1fromSettings, sha256fromSettings, deviceId, null, host);
1003 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId, String password,
Host host)
throws TskCoreException {
1006 long imageHandle = openImgNat(imagePaths, 1, sectorSize);
1009 List<String> computedPaths = Arrays.asList(getPathsForImageNat(imageHandle));
1010 long size = getSizeForImageNat(imageHandle);
1011 long type = getTypeForImageNat(imageHandle);
1012 long computedSectorSize = getSectorSizeForImageNat(imageHandle);
1013 String md5 = md5fromSettings;
1014 if (StringUtils.isEmpty(md5)) {
1015 md5 = getMD5HashForImageNat(imageHandle);
1017 String sha1 = sha1fromSettings;
1018 if (StringUtils.isEmpty(sha1)) {
1019 sha1 = getSha1HashForImageNat(imageHandle);
1023 String sha256 = sha256fromSettings;
1024 if (sha256 == null) {
1027 String collectionDetails = getCollectionDetailsForImageNat(imageHandle);
1033 size, null, computedPaths,
1034 timeZone, md5, sha1, sha256,
1035 deviceId, host, password, transaction);
1036 if (!StringUtils.isEmpty(collectionDetails)) {
1037 skCase.setAcquisitionDetails(img, collectionDetails);
1041 img.setImageHandle(imageHandle);
1042 cacheImageHandle(skCase, computedPaths, imageHandle);
1044 }
catch (TskCoreException ex) {
1064 public static long openVs(
long imgHandle,
long vsOffset)
throws TskCoreException {
1067 if(! imgHandleIsValid(imgHandle)) {
1068 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1070 return openVsNat(imgHandle, vsOffset);
1072 releaseTSKReadLock();
1088 public static long openVsPart(
long vsHandle,
long volId)
throws TskCoreException {
1092 return openVolNat(vsHandle, volId);
1094 releaseTSKReadLock();
1109 static long openPool(
long imgHandle,
long offset,
SleuthkitCase skCase)
throws TskCoreException {
1112 if(! imgHandleIsValid(imgHandle)) {
1113 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1116 synchronized (HandleCache.cacheLock) {
1117 String caseIdentifier;
1118 if (skCase == null) {
1119 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1121 caseIdentifier = skCase.getCaseHandleIdentifier();
1125 if (! HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.containsKey(imgHandle)) {
1126 HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.put(imgHandle,
new HashMap<>());
1130 Map<Long, Long> poolCacheForImage = HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle);
1132 if (poolCacheForImage.containsKey(offset)) {
1133 return poolCacheForImage.get(offset);
1136 long poolHandle = openPoolNat(imgHandle, offset);
1137 poolCacheForImage.put(offset, poolHandle);
1142 releaseTSKReadLock();
1160 return openFs(imgHandle, fsOffset,
"", skCase);
1177 public static long openFs(
long imgHandle,
long fsOffset, String password,
SleuthkitCase skCase)
throws TskCoreException {
1181 synchronized (HandleCache.cacheLock) {
1182 String caseIdentifier;
1183 if (skCase == null) {
1184 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1186 caseIdentifier = skCase.getCaseHandleIdentifier();
1188 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1189 if (imgOffSetToFsHandle == null) {
1190 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1192 if (imgOffSetToFsHandle.containsKey(fsOffset)) {
1194 fsHandle = imgOffSetToFsHandle.get(fsOffset);
1196 fsHandle = openFsDecryptNat(imgHandle, fsOffset, password);
1198 imgOffSetToFsHandle.put(fsOffset, fsHandle);
1203 releaseTSKReadLock();
1223 static long openFsPool(
long imgHandle,
long fsOffset,
long poolHandle,
long poolBlock,
SleuthkitCase skCase)
throws TskCoreException {
1232 synchronized (HandleCache.cacheLock) {
1233 String caseIdentifier;
1234 if (skCase == null) {
1235 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1237 caseIdentifier = skCase.getCaseHandleIdentifier();
1239 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1240 if (imgOffSetToFsHandle == null) {
1241 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1244 if (imgOffSetToFsHandle.containsKey(poolBlock)) {
1246 fsHandle = imgOffSetToFsHandle.get(poolBlock);
1248 long poolImgHandle = getImgInfoForPoolNat(poolHandle, poolBlock);
1249 HandleCache.getCaseHandles(caseIdentifier).poolImgCache.add(poolImgHandle);
1250 fsHandle = openFsNat(poolImgHandle, fsOffset);
1252 imgOffSetToFsHandle.put(poolBlock, fsHandle);
1253 HandleCache.getCaseHandles(caseIdentifier).poolFsList.add(fsHandle);
1258 releaseTSKWriteLock();
1288 boolean withinPool =
false;
1289 synchronized (HandleCache.cacheLock) {
1290 String caseIdentifier;
1291 if (skCase == null) {
1292 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1294 caseIdentifier = skCase.getCaseHandleIdentifier();
1296 if (HandleCache.getCaseHandles(caseIdentifier).poolFsList.contains(fsHandle)) {
1312 long fileHandle = openFileNat(fsHandle, fileId, attrType.getValue(), convertSignedToUnsigned(attrId));
1313 synchronized (HandleCache.cacheLock) {
1314 String caseIdentifier;
1315 if (skCase == null) {
1316 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1318 caseIdentifier = skCase.getCaseHandleIdentifier();
1320 HandleCache.addFileHandle(caseIdentifier, fileHandle, fsHandle);
1325 HandleCache.poolFileHandles.add(fileHandle);
1331 releaseTSKWriteLock();
1333 releaseTSKReadLock();
1345 private static int convertSignedToUnsigned(
int val) {
1350 return val & 0xffff;
1358 private static boolean imgHandleIsValid(
long imgHandle) {
1359 synchronized(HandleCache.cacheLock) {
1360 return HandleCache.isImageInAnyCache(imgHandle);
1379 public static int readImg(
long imgHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1382 if(! imgHandleIsValid(imgHandle)) {
1383 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1386 return readImgNat(imgHandle, readBuffer, offset, len);
1388 releaseTSKReadLock();
1406 public static int readVs(
long vsHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1409 return readVsNat(vsHandle, readBuffer, offset, len);
1411 releaseTSKReadLock();
1427 static int readPool(
long poolHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1430 return readPoolNat(poolHandle, readBuffer, offset, len);
1432 releaseTSKReadLock();
1450 public static int readVsPart(
long volHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1454 return readVolNat(volHandle, readBuffer, offset, len);
1456 releaseTSKReadLock();
1474 public static int readFs(
long fsHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1478 return readFsNat(fsHandle, readBuffer, offset, len);
1480 releaseTSKReadLock();
1488 private enum TSK_FS_FILE_READ_OFFSET_TYPE_ENUM {
1492 private final int val;
1494 TSK_FS_FILE_READ_OFFSET_TYPE_ENUM(
int val) {
1517 public static int readFile(
long fileHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1518 boolean withinPool =
false;
1519 synchronized (HandleCache.cacheLock) {
1520 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1536 if (!HandleCache.isValidFileHandle(fileHandle)) {
1537 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1540 return readFileNat(fileHandle, readBuffer, offset, TSK_FS_FILE_READ_OFFSET_TYPE_ENUM.START_OF_FILE.getValue(), len);
1543 releaseTSKWriteLock();
1545 releaseTSKReadLock();
1564 public static int readFileSlack(
long fileHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1567 if (!HandleCache.isValidFileHandle(fileHandle)) {
1568 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1571 return readFileNat(fileHandle, readBuffer, offset, TSK_FS_FILE_READ_OFFSET_TYPE_ENUM.START_OF_SLACK.getValue(), len);
1573 releaseTSKReadLock();
1590 if (!HandleCache.isValidFileHandle(fileHandle)) {
1591 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1595 java.io.File tmp = java.io.File.createTempFile(
"tsk",
".txt");
1597 saveFileMetaDataTextNat(fileHandle, tmp.getAbsolutePath());
1599 FileReader fr =
new FileReader(tmp.getAbsolutePath());
1600 BufferedReader textReader =
new BufferedReader(fr);
1602 List<String> lines =
new ArrayList<String>();
1604 String line = textReader.readLine();
1614 }
catch (IOException ex) {
1615 throw new TskCoreException(
"Error reading istat output: " + ex.getLocalizedMessage());
1618 releaseTSKReadLock();
1638 boolean withinPool =
false;
1639 synchronized (HandleCache.cacheLock) {
1640 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1656 synchronized (HandleCache.cacheLock) {
1657 if (!HandleCache.isValidFileHandle(fileHandle)) {
1661 closeFileNat(fileHandle);
1662 HandleCache.removeFileHandle(fileHandle, skCase);
1663 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1664 HandleCache.poolFileHandles.remove(fileHandle);
1669 releaseTSKWriteLock();
1671 releaseTSKReadLock();
1684 hashDbCreateIndexNat(dbHandle);
1697 return hashDbIndexExistsNat(dbHandle);
1711 return hashDbIsReindexableNat(dbHandle);
1724 return hashDbPathNat(dbHandle);
1737 return hashDbIndexPathNat(dbHandle);
1747 return hashDbOpenNat(path);
1760 return hashDbNewNat(path);
1783 hashDbClose(dbHandle);
1796 return hashDbGetDisplayName(dbHandle);
1810 return hashDbLookup(hash, dbHandle);
1825 return hashDbLookupVerbose(hash, dbHandle);
1840 public static void addToHashDatabase(String filename, String md5, String sha1, String sha256, String comment,
int dbHandle)
throws TskCoreException {
1841 hashDbAddEntryNat(filename, md5, sha1, sha256, comment, dbHandle);
1844 public static void addToHashDatabase(List<HashEntry> hashes,
int dbHandle)
throws TskCoreException {
1845 hashDbBeginTransactionNat(dbHandle);
1848 hashDbAddEntryNat(entry.getFileName(), entry.getMd5Hash(), entry.getSha1Hash(), entry.getSha256Hash(), entry.getComment(), dbHandle);
1850 hashDbCommitTransactionNat(dbHandle);
1851 }
catch (TskCoreException ex) {
1853 hashDbRollbackTransactionNat(dbHandle);
1854 }
catch (TskCoreException ex2) {
1863 return hashDbIsUpdateableNat(dbHandle);
1867 return hashDbIsIdxOnlyNat(dbHandle);
1879 private static String timezoneLongToShort(String timezoneLongForm) {
1880 if (timezoneLongForm == null || timezoneLongForm.isEmpty()) {
1884 String timezoneShortForm;
1885 TimeZone zone = TimeZone.getTimeZone(timezoneLongForm);
1886 int offset = zone.getRawOffset() / 1000;
1887 int hour = offset / 3600;
1888 int min = (offset % 3600) / 60;
1889 DateFormat dfm =
new SimpleDateFormat(
"z");
1890 dfm.setTimeZone(zone);
1891 boolean hasDaylight = zone.useDaylightTime();
1892 String first = dfm.format(
new GregorianCalendar(2010, 1, 1).getTime()).substring(0, 3);
1893 String second = dfm.format(
new GregorianCalendar(2011, 6, 6).getTime()).substring(0, 3);
1894 int mid = hour * -1;
1895 timezoneShortForm = first + Integer.toString(mid);
1897 timezoneShortForm = timezoneShortForm +
":" + (min < 10 ?
"0" :
"") + Integer.toString(min);
1900 timezoneShortForm += second;
1902 return timezoneShortForm;
1918 if(! imgHandleIsValid(imgHandle)) {
1919 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1921 return finishImageWriterNat(imgHandle);
1923 releaseTSKReadLock();
1937 if (imgHandleIsValid(imgHandle)) {
1938 return getFinishImageProgressNat(imgHandle);
1943 releaseTSKReadLock();
1955 if (imgHandleIsValid(imgHandle)) {
1956 cancelFinishImageNat(imgHandle);
1959 releaseTSKReadLock();
1975 return findDeviceSizeNat(devPath);
1981 return isImageSupportedStringNat(imagePath,
"").isBlank();
1988 boolean testSuccess;
1992 this.testSuccess = testSuccess;
1993 this.message = message;
2017 String resultStr = isImageSupportedStringNat(imagePath, password);
2018 if (resultStr.isBlank()) {
2037 static long getSleuthkitVersion() {
2038 return getSleuthkitVersionNat();
2045 private static void getTSKReadLock() {
2046 tskLock.readLock().lock();
2052 private static void releaseTSKReadLock() {
2053 tskLock.readLock().unlock();
2063 private static void getTSKWriteLock() {
2064 tskLock.writeLock().lock();
2070 private static void releaseTSKWriteLock() {
2071 tskLock.writeLock().unlock();
2119 public static long openImage(String[] imageFiles)
throws TskCoreException {
2121 return openImage(imageFiles, 0,
true, null);
2138 public static long openImage(String[] imageFiles,
int sSize)
throws TskCoreException {
2139 return openImage(imageFiles, sSize,
true, null);
2157 public static long openFs(
long imgHandle,
long fsOffset)
throws TskCoreException {
2158 return openFs(imgHandle, fsOffset, null);
2177 return openFile(fsHandle, fileId, attrType, attrId, null);
2181 private static native String getVersionNat();
2183 private static native
void startVerboseLoggingNat(String logPath);
2185 private static native
int hashDbOpenNat(String hashDbPath)
throws TskCoreException;
2187 private static native
int hashDbNewNat(String hashDbPath)
throws TskCoreException;
2189 private static native
int hashDbBeginTransactionNat(
int dbHandle)
throws TskCoreException;
2191 private static native
int hashDbCommitTransactionNat(
int dbHandle)
throws TskCoreException;
2193 private static native
int hashDbRollbackTransactionNat(
int dbHandle)
throws TskCoreException;
2195 private static native
int hashDbAddEntryNat(String filename, String hashMd5, String hashSha1, String hashSha256, String comment,
int dbHandle)
throws TskCoreException;
2197 private static native
boolean hashDbIsUpdateableNat(
int dbHandle);
2199 private static native
boolean hashDbIsReindexableNat(
int dbHandle);
2201 private static native String hashDbPathNat(
int dbHandle);
2203 private static native String hashDbIndexPathNat(
int dbHandle);
2205 private static native String hashDbGetDisplayName(
int dbHandle)
throws TskCoreException;
2207 private static native
void hashDbCloseAll() throws TskCoreException;
2209 private static native
void hashDbClose(
int dbHandle) throws TskCoreException;
2211 private static native
void hashDbCreateIndexNat(
int dbHandle) throws TskCoreException;
2213 private static native
boolean hashDbIndexExistsNat(
int dbHandle) throws TskCoreException;
2215 private static native
boolean hashDbIsIdxOnlyNat(
int dbHandle) throws TskCoreException;
2217 private static native
boolean hashDbLookup(String hash,
int dbHandle) throws TskCoreException;
2219 private static native
HashHitInfo hashDbLookupVerbose(String hash,
int dbHandle) throws TskCoreException;
2221 private static native
long initAddImgNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws TskCoreException;
2223 private static native
long initAddImgNatPassword(TskCaseDbBridge dbHelperObj, String timezone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String password) throws TskCoreException;
2225 private static native
long initializeAddImgNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addFileSystems,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws TskCoreException;
2227 private static native
long initializeAddImgPasswordNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addFileSystems,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String password) throws TskCoreException;
2229 private static native
void runOpenAndAddImgNat(
long process, String deviceId, String[] imgPath,
int splits, String timezone) throws TskCoreException,
TskDataException;
2231 private static native
void runAddImgNat(
long process, String deviceId,
long a_img_info,
long image_id, String timeZone, String imageWriterPath) throws TskCoreException, TskDataException;
2233 private static native
void stopAddImgNat(
long process) throws TskCoreException;
2235 private static native
long finishAddImgNat(
long process) throws TskCoreException;
2237 private static native
long openImgNat(String[] imgPath,
int splits,
int sSize) throws TskCoreException;
2239 private static native
long openVsNat(
long imgHandle,
long vsOffset) throws TskCoreException;
2241 private static native
long openVolNat(
long vsHandle,
long volId) throws TskCoreException;
2243 private static native
long openPoolNat(
long imgHandle,
long offset) throws TskCoreException;
2245 private static native
long getImgInfoForPoolNat(
long poolHandle,
long poolOffset) throws TskCoreException;
2247 private static native
long openFsNat(
long imgHandle,
long fsId) throws TskCoreException;
2249 private static native
long openFsDecryptNat(
long imgHandle,
long fsId, String password) throws TskCoreException;
2251 private static native
long openFileNat(
long fsHandle,
long fileId,
int attrType,
int attrId) throws TskCoreException;
2253 private static native
int readImgNat(
long imgHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2255 private static native
int readVsNat(
long vsHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2257 private static native
int readPoolNat(
long poolHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2259 private static native
int readVolNat(
long volHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2261 private static native
int readFsNat(
long fsHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2263 private static native
int readFileNat(
long fileHandle, byte[] readBuffer,
long offset,
int offset_type,
long len) throws TskCoreException;
2265 private static native
int saveFileMetaDataTextNat(
long fileHandle, String fileName) throws TskCoreException;
2267 private static native String[] getPathsForImageNat(
long imgHandle);
2269 private static native
long getSizeForImageNat(
long imgHandle);
2271 private static native
long getTypeForImageNat(
long imgHandle);
2273 private static native
long getSectorSizeForImageNat(
long imgHandle);
2275 private static native String getMD5HashForImageNat(
long imgHandle);
2277 private static native String getSha1HashForImageNat(
long imgHandle);
2279 private static native String getCollectionDetailsForImageNat(
long imgHandle);
2281 private static native
void closeImgNat(
long imgHandle);
2283 private static native
void closePoolNat(
long poolHandle);
2285 private static native
void closeVsNat(
long vsHandle);
2287 private static native
void closeFsNat(
long fsHandle);
2289 private static native
void closeFileNat(
long fileHandle);
2291 private static native
long findDeviceSizeNat(String devicePath) throws TskCoreException;
2293 private static native String getCurDirNat(
long process);
2295 private static native String isImageSupportedStringNat(String imagePath, String password);
2297 private static native
long getSleuthkitVersionNat();
2299 private static native
int finishImageWriterNat(
long a_img_info);
2301 private static native
int getFinishImageProgressNat(
long a_img_info);
2303 private static native
void cancelFinishImageNat(
long a_img_info);
static int readImg(long imgHandle, byte[] readBuffer, long offset, long len)
static String getHashDatabaseIndexPath(int dbHandle)
static int readVs(long vsHandle, byte[] readBuffer, long offset, long len)
static void createLookupIndexForHashDatabase(int dbHandle)
CaseDbTransaction beginTransaction()
void run(String deviceId, Image image, int sectorSize, AddDataSourceCallbacks addDataSourceCallbacks)
static void addToHashDatabase(String filename, String md5, String sha1, String sha256, String comment, int dbHandle)
static long openFs(long imgHandle, long fsOffset, String password, SleuthkitCase skCase)
static long openFile(long fsHandle, long fileId, TSK_FS_ATTR_TYPE_ENUM attrType, int attrId, SleuthkitCase skCase)
static int createHashDatabase(String path)
static void closeFs(long fsHandle)
static void cancelFinishImage(long imgHandle)
static long openFile(long fsHandle, long fileId, TSK_FS_ATTR_TYPE_ENUM attrType, int attrId)
void run(String deviceId, String[] imageFilePaths)
static int readFile(long fileHandle, byte[] readBuffer, long offset, long len)
static int finishImageWriter(long imgHandle)
static HashHitInfo lookupInHashDatabaseVerbose(String hash, int dbHandle)
static long openVs(long imgHandle, long vsOffset)
synchronized long commit()
static long openImage(String[] imageFiles, SleuthkitCase skCase)
static boolean hashDatabaseIsIndexOnly(int dbHandle)
synchronized void revert()
static boolean isImageSupported(String imagePath)
static int readVsPart(long volHandle, byte[] readBuffer, long offset, long len)
static boolean loadSleuthkitJNI()
static void closeFile(long fileHandle, SleuthkitCase skCase)
static long openImage(String[] imageFiles, int sSize)
static void closeVs(long vsHandle)
static long openImage(String[] imageFiles)
static long openFs(long imgHandle, long fsOffset, SleuthkitCase skCase)
static long openImage(String[] imageFiles, int sSize, SleuthkitCase skCase)
void run(String deviceId, String[] imageFilePaths, int sectorSize)
static Image addImageToDatabase(SleuthkitCase skCase, String[] imagePaths, int sectorSize, String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId, Host host)
static long findDeviceSize(String devPath)
static String getHashDatabaseDisplayName(int dbHandle)
static TestOpenImageResult testOpenImage(String imagePath, String password)
static List< String > getFileMetaDataText(long fileHandle)
static void closeImg(long imgHandle)
HostManager getHostManager()
static long openFs(long imgHandle, long fsOffset)
Host newHost(String name)
void run(String[] imageFilePaths)
synchronized String currentDirectory()
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)
static int getFinishImageProgress(long imgHandle)
static int openHashDatabase(String path)
static void closeFile(long fileHandle)
static boolean lookupInHashDatabase(String hash, int dbHandle)
static TSK_IMG_TYPE_ENUM valueOf(long imgType)
static boolean hashDatabaseHasLookupIndex(int dbHandle)
static Image addImageToDatabase(SleuthkitCase skCase, String[] imagePaths, int sectorSize, String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId)
static Image addImageToDatabase(SleuthkitCase skCase, String[] imagePaths, int sectorSize, String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId, String password, Host host)
static long openVsPart(long vsHandle, long volId)
static int readFileSlack(long fileHandle, byte[] readBuffer, long offset, long len)
static boolean isUpdateableHashDatabase(int dbHandle)
static void addToHashDatabase(List< HashEntry > hashes, int dbHandle)
static void closeAllHashDatabases()
static boolean hashDatabaseCanBeReindexed(int dbHandle)
static String getVersion()
static void startVerboseLogging(String logPath)
static int readFs(long fsHandle, byte[] readBuffer, long offset, long len)
static String getHashDatabasePath(int dbHandle)
static void closeHashDatabase(int dbHandle)