Autopsy  4.14.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
RecentDocumentsByLnk.java
Go to the documentation of this file.
1  /*
2  *
3  * Autopsy Forensic Browser
4  *
5  * Copyright 2012-2014 Basis Technology Corp.
6  *
7  * Copyright 2012 42six Solutions.
8  * Contact: aebadirad <at> 42six <dot> com
9  * Project Contact/Architect: carrier <at> sleuthkit <dot> org
10  *
11  * Licensed under the Apache License, Version 2.0 (the "License");
12  * you may not use this file except in compliance with the License.
13  * You may obtain a copy of the License at
14  *
15  * http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  * See the License for the specific language governing permissions and
21  * limitations under the License.
22  */
23 package org.sleuthkit.autopsy.recentactivity;
24 
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;
39 import org.sleuthkit.datamodel.BlackboardArtifact;
40 import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
41 import org.sleuthkit.datamodel.BlackboardAttribute;
42 import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
43 import org.sleuthkit.datamodel.Content;
44 import org.sleuthkit.datamodel.*;
45 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT;
46 import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT;
47 
52 class RecentDocumentsByLnk extends Extract {
53 
54  private static final Logger logger = Logger.getLogger(RecentDocumentsByLnk.class.getName());
55  private Content dataSource;
56  private IngestJobContext context;
57 
58  @Messages({
59  "Progress_Message_Extract_Resent_Docs=Recent Documents",
60  })
61 
69  private void getRecentDocuments() {
70 
71  org.sleuthkit.autopsy.casemodule.services.FileManager fileManager = currentCase.getServices().getFileManager();
72  List<AbstractFile> recentFiles;
73  try {
74  recentFiles = fileManager.findFiles(dataSource, "%.lnk", "Recent"); //NON-NLS
75  } catch (TskCoreException ex) {
76  logger.log(Level.WARNING, "Error searching for .lnk files."); //NON-NLS
77  this.addErrorMessage(
78  NbBundle.getMessage(this.getClass(), "RecentDocumentsByLnk.getRecDoc.errMsg.errGetLnkFiles",
79  this.getName()));
80  return;
81  }
82 
83  if (recentFiles.isEmpty()) {
84  logger.log(Level.INFO, "Didn't find any recent files."); //NON-NLS
85  return;
86  }
87 
88  dataFound = true;
89  List<BlackboardArtifact> bbartifacts = new ArrayList<>();
90  for (AbstractFile recentFile : recentFiles) {
91  if (context.dataSourceIngestIsCancelled()) {
92  break;
93  }
94 
95  if (recentFile.getSize() == 0) {
96  continue;
97  }
98  JLNK lnk;
99  JLnkParser lnkParser = new JLnkParser(new ReadContentInputStream(recentFile), (int) recentFile.getSize());
100  try {
101  lnk = lnkParser.parse();
102  } catch (JLnkParserException e) {
103  //TODO should throw a specific checked exception
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); //NON-NLS
108  }
109  continue;
110  }
111 
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"),
117  path));
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,
123  NbBundle.getMessage(this.getClass(),
124  "RecentDocumentsByLnk.parentModuleName.noSpace"),
125  recentFile.getCrtime()));
126  BlackboardArtifact bba = createArtifactWithAttributes(ARTIFACT_TYPE.TSK_RECENT_OBJECT, recentFile, bbattributes);
127  if(bba != null) {
128  bbartifacts.add(bba);
129  bba = createAssociatedArtifact(path, bba);
130  if (bba != null) {
131  bbartifacts.add(bba);
132  }
133  }
134  }
135 
136  postArtifacts(bbartifacts);
137  }
138 
148  private BlackboardArtifact createAssociatedArtifact(String filePathName, BlackboardArtifact bba) {
149  org.sleuthkit.autopsy.casemodule.services.FileManager fileManager = currentCase.getServices().getFileManager();
150  String normalizePathName = FilenameUtils.normalize(filePathName, true);
151  String fileName = FilenameUtils.getName(normalizePathName);
152  String filePath = FilenameUtils.getPath(normalizePathName);
153  List<AbstractFile> sourceFiles;
154  try {
155  sourceFiles = fileManager.findFiles(dataSource, fileName, filePath); //NON-NLS
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())));
162 
163  BlackboardArtifact associatedObjectBba = createArtifactWithAttributes(TSK_ASSOCIATED_OBJECT, sourceFile, bbattributes2);
164  if (associatedObjectBba != null) {
165  return associatedObjectBba;
166  }
167  }
168  }
169  } catch (TskCoreException ex) {
170  logger.log(Level.WARNING, String.format("Error finding actual file %s. file may not exist", filePathName)); //NON-NLS
171  }
172 
173  return null;
174  }
175 
176  @Override
177  public void process(Content dataSource, IngestJobContext context, DataSourceIngestModuleProgress progressBar) {
178  this.dataSource = dataSource;
179  this.context = context;
180  dataFound = false;
181 
182  progressBar.progress(Bundle.Progress_Message_Extract_Resent_Docs());
183  this.getRecentDocuments();
184  }
185 }
synchronized List< AbstractFile > findFiles(String fileName)

Copyright © 2012-2020 Basis Technology. Generated on: Wed Apr 8 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.