23 package org.sleuthkit.autopsy.recentactivity;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.List;
28 import java.util.logging.Level;
29 import org.apache.commons.io.FilenameUtils;
30 import org.openide.util.NbBundle;
32 import java.util.Collection;
33 import org.openide.util.NbBundle.Messages;
40 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
42 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
45 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT;
46 import static org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT;
52 class RecentDocumentsByLnk
extends Extract {
54 private static final Logger logger = Logger.getLogger(RecentDocumentsByLnk.class.getName());
55 private Content dataSource;
56 private IngestJobContext context;
59 "Progress_Message_Extract_Resent_Docs=Recent Documents",
69 private void getRecentDocuments() {
72 List<AbstractFile> recentFiles;
74 recentFiles = fileManager.
findFiles(dataSource,
"%.lnk",
"Recent");
75 }
catch (TskCoreException ex) {
76 logger.log(Level.WARNING,
"Error searching for .lnk files.");
78 NbBundle.getMessage(
this.getClass(),
"RecentDocumentsByLnk.getRecDoc.errMsg.errGetLnkFiles",
83 if (recentFiles.isEmpty()) {
84 logger.log(Level.INFO,
"Didn't find any recent files.");
89 List<BlackboardArtifact> bbartifacts =
new ArrayList<>();
90 for (AbstractFile recentFile : recentFiles) {
91 if (context.dataSourceIngestIsCancelled()) {
95 if (recentFile.getSize() == 0) {
99 JLnkParser lnkParser =
new JLnkParser(
new ReadContentInputStream(recentFile), (
int) recentFile.getSize());
101 lnk = lnkParser.parse();
102 }
catch (JLnkParserException e) {
104 boolean unalloc = recentFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC)
105 || recentFile.isDirNameFlagSet(TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC);
106 if (unalloc ==
false) {
107 logger.log(Level.WARNING,
"Error lnk parsing the file to get recent files {0}", recentFile);
112 Collection<BlackboardAttribute> bbattributes =
new ArrayList<>();
113 String path = lnk.getBestPath();
114 bbattributes.add(
new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_PATH,
115 NbBundle.getMessage(
this.getClass(),
116 "RecentDocumentsByLnk.parentModuleName.noSpace"),
118 bbattributes.add(
new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_PATH_ID,
119 NbBundle.getMessage(
this.getClass(),
120 "RecentDocumentsByLnk.parentModuleName.noSpace"),
121 Util.findID(dataSource, path)));
122 bbattributes.add(
new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED,
123 NbBundle.getMessage(
this.getClass(),
124 "RecentDocumentsByLnk.parentModuleName.noSpace"),
125 recentFile.getCrtime()));
126 BlackboardArtifact bba = createArtifactWithAttributes(ARTIFACT_TYPE.TSK_RECENT_OBJECT, recentFile, bbattributes);
128 bbartifacts.add(bba);
129 bba = createAssociatedArtifact(path, bba);
131 bbartifacts.add(bba);
136 postArtifacts(bbartifacts);
148 private BlackboardArtifact createAssociatedArtifact(String filePathName, BlackboardArtifact bba) {
150 String normalizePathName = FilenameUtils.normalize(filePathName,
true);
151 String fileName = FilenameUtils.getName(normalizePathName);
152 String filePath = FilenameUtils.getPath(normalizePathName);
153 List<AbstractFile> sourceFiles;
155 sourceFiles = fileManager.
findFiles(dataSource, fileName, filePath);
156 for (AbstractFile sourceFile : sourceFiles) {
157 if (sourceFile.getParentPath().endsWith(filePath)) {
158 Collection<BlackboardAttribute> bbattributes2 =
new ArrayList<>();
159 bbattributes2.addAll(Arrays.asList(
160 new BlackboardAttribute(TSK_ASSOCIATED_ARTIFACT, this.getName(),
161 bba.getArtifactID())));
163 BlackboardArtifact associatedObjectBba = createArtifactWithAttributes(TSK_ASSOCIATED_OBJECT, sourceFile, bbattributes2);
164 if (associatedObjectBba != null) {
165 return associatedObjectBba;
169 }
catch (TskCoreException ex) {
170 logger.log(Level.WARNING, String.format(
"Error finding actual file %s. file may not exist", filePathName));
177 public void process(Content dataSource, IngestJobContext context, DataSourceIngestModuleProgress progressBar) {
178 this.dataSource = dataSource;
179 this.context = context;
182 progressBar.progress(Bundle.Progress_Message_Extract_Resent_Docs());
183 this.getRecentDocuments();
synchronized List< AbstractFile > findFiles(String fileName)