19 package org.sleuthkit.autopsy.contentviewers;
21 import java.awt.Component;
22 import java.util.List;
23 import java.util.logging.Level;
24 import org.apache.commons.lang3.StringUtils;
25 import org.openide.nodes.Node;
26 import org.openide.util.NbBundle;
27 import org.openide.util.NbBundle.Messages;
28 import org.openide.util.lookup.ServiceProvider;
34 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
36 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
41 import org.
sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
48 @ServiceProvider(service = DataContentViewer.class, position = 6)
49 @SuppressWarnings(
"PMD.SingularField")
59 customizeComponents();
67 @SuppressWarnings(
"unchecked")
69 private
void initComponents() {
71 jPopupMenu1 =
new javax.swing.JPopupMenu();
72 jScrollPane2 =
new javax.swing.JScrollPane();
73 jTextPane1 =
new javax.swing.JTextPane();
75 setPreferredSize(
new java.awt.Dimension(100, 52));
77 jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
78 jScrollPane2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
79 jScrollPane2.setPreferredSize(
new java.awt.Dimension(610, 52));
81 jTextPane1.setEditable(
false);
82 jTextPane1.setPreferredSize(
new java.awt.Dimension(600, 52));
83 jScrollPane2.setViewportView(jTextPane1);
85 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
86 this.setLayout(layout);
87 layout.setHorizontalGroup(
88 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
89 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
91 layout.setVerticalGroup(
92 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
93 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
117 jTextPane1.setText(
"<html><body>" + str +
"</body></html>");
121 sb.append(
"<table>");
125 sb.append(
"</table>");
128 private void addRow(StringBuilder sb, String key, String value) {
129 sb.append(
"<tr><td valign=\"top\">");
131 sb.append(
"</td><td>");
133 sb.append(
"</td></tr>");
137 "Metadata.tableRowTitle.mimeType=MIME Type",
138 "Metadata.nodeText.truncated=(results truncated)",
139 "Metadata.tableRowTitle.sha1=SHA1",
140 "Metadata.tableRowTitle.sha256=SHA256",
141 "Metadata.tableRowTitle.imageType=Type",
142 "Metadata.tableRowTitle.sectorSize=Sector Size",
143 "Metadata.tableRowTitle.timezone=Time Zone",
144 "Metadata.tableRowTitle.deviceId=Device ID",
145 "Metadata.tableRowTitle.acquisitionDetails=Acquisition Details",
146 "Metadata.tableRowTitle.downloadSource=Downloaded From",
147 "Metadata.nodeText.unknown=Unknown",
148 "Metadata.nodeText.none=None"})
151 AbstractFile file = node.getLookup().lookup(AbstractFile.class);
152 Image image = node.getLookup().lookup(Image.class);
153 DataSource dataSource = node.getLookup().lookup(DataSource.class);
154 if (file == null && image == null) {
155 setText(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.nonFilePassedIn"));
159 StringBuilder sb =
new StringBuilder();
164 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.name"), file.getUniquePath());
165 }
catch (TskCoreException ex) {
166 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.name"), file.getParentPath() +
"/" + file.getName());
169 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.type"), file.getType().getName());
170 addRow(sb, Bundle.Metadata_tableRowTitle_mimeType(), file.getMIMEType());
171 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.size"), Long.toString(file.getSize()));
172 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.fileNameAlloc"), file.getDirFlagAsString());
173 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.metadataAlloc"), file.getMetaFlagsAsString());
174 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.modified"),
ContentUtils.
getStringTime(file.getMtime(), file));
175 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.accessed"),
ContentUtils.
getStringTime(file.getAtime(), file));
176 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.created"),
ContentUtils.
getStringTime(file.getCrtime(), file));
177 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.changed"),
ContentUtils.
getStringTime(file.getCtime(), file));
180 String md5 = file.getMd5Hash();
182 md5 = NbBundle.getMessage(this.getClass(),
"Metadata.tableRowContent.md5notCalc");
184 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.md5"), md5);
185 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.hashLookupResults"), file.getKnown().toString());
186 addAcquisitionDetails(sb, dataSource);
188 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.internalid"), Long.toString(file.getId()));
189 if (file.getType().compareTo(TSK_DB_FILES_TYPE_ENUM.LOCAL) == 0) {
190 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.localPath"), file.getLocalAbsPath());
194 List<BlackboardArtifact> sourceArtifacts = file.getArtifacts(ARTIFACT_TYPE.TSK_DOWNLOAD_SOURCE);
195 if (!sourceArtifacts.isEmpty()) {
196 BlackboardArtifact artifact = sourceArtifacts.get(0);
197 BlackboardAttribute urlAttr = artifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL));
198 if (urlAttr != null) {
199 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.downloadSource"), urlAttr.getValueString());
202 }
catch (TskCoreException ex) {
203 sb.append(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.exceptionNotice.text")).append(ex.getLocalizedMessage());
213 if (file instanceof FsContent) {
214 FsContent fsFile = (FsContent) file;
216 sb.append(
"<hr /><pre>\n");
217 sb.append(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.text"));
218 sb.append(
" <br /><br />");
219 for (String str : fsFile.getMetaDataText()) {
220 sb.append(str).append(
"<br />");
226 if(sb.length() > 50000){
227 sb.append(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.truncated"));
231 sb.append(
"</pre>\n");
233 }
catch (TskCoreException ex) {
234 sb.append(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.exceptionNotice.text")).append(ex.getLocalizedMessage());
238 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.name"), image.getUniquePath());
239 }
catch (TskCoreException ex) {
240 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.name"), image.getName());
242 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.imageType"), image.getType().getName());
243 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.size"), Long.toString(image.getSize()));
246 String md5 = image.getMd5();
247 if (md5 == null || md5.isEmpty()) {
248 md5 = NbBundle.getMessage(this.getClass(),
"Metadata.tableRowContent.md5notCalc");
250 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.md5"), md5);
252 String sha1 = image.getSha1();
253 if (sha1 == null || sha1.isEmpty()) {
254 sha1 = NbBundle.getMessage(this.getClass(),
"Metadata.tableRowContent.md5notCalc");
256 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.sha1"), sha1);
258 String sha256 = image.getSha256();
259 if (sha256 == null || sha256.isEmpty()) {
260 sha256 = NbBundle.getMessage(this.getClass(),
"Metadata.tableRowContent.md5notCalc");
262 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.sha256"), sha256);
263 }
catch (TskCoreException ex) {
264 sb.append(NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.exceptionNotice.text")).append(ex.getLocalizedMessage());
266 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.sectorSize"), Long.toString(image.getSsize()));
267 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.timezone"), image.getTimeZone());
268 addAcquisitionDetails(sb, dataSource);
269 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.deviceId"), image.getDeviceId());
270 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.internalid"), Long.toString(image.getId()));
273 String[] imagePaths = image.getPaths();
274 if (imagePaths.length > 0) {
275 StringBuilder pathValues =
new StringBuilder(
"<div>");
276 pathValues.append(imagePaths[0]);
277 pathValues.append(
"</div>");
278 for (
int i=1; i < imagePaths.length; i++) {
279 pathValues.append(
"<div>");
280 pathValues.append(imagePaths[i]);
281 pathValues.append(
"</div>");
283 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.localPath"), pathValues.toString());
285 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.localPath"),
286 NbBundle.getMessage(
this.getClass(),
"Metadata.nodeText.none"));
290 setText(sb.toString());
291 jTextPane1.setCaretPosition(0);
292 this.setCursor(null);
302 if (dataSource != null) {
304 String details = dataSource.getAcquisitionDetails();
305 if (StringUtils.isEmpty(details)) {
306 details = Bundle.Metadata_nodeText_unknown();
308 details = details.replaceAll(
"\n",
"<br>");
309 addRow(sb, NbBundle.getMessage(
this.getClass(),
"Metadata.tableRowTitle.acquisitionDetails"), details);
310 }
catch (TskCoreException ex) {
311 LOGGER.log(Level.SEVERE,
"Error reading acquisition details from case database", ex);
318 return NbBundle.getMessage(this.getClass(),
"Metadata.title");
323 return NbBundle.getMessage(this.getClass(),
"Metadata.toolTip");
343 Image image = node.getLookup().lookup(Image.class);
344 AbstractFile file = node.getLookup().lookup(AbstractFile.class);
345 return (file != null) || (image != null);
void endTable(StringBuilder sb)
static String getStringTime(long epochSeconds, TimeZone tzone)
void addRow(StringBuilder sb, String key, String value)
void addAcquisitionDetails(StringBuilder sb, DataSource dataSource)
javax.swing.JTextPane jTextPane1
javax.swing.JPopupMenu jPopupMenu1
void customizeComponents()
static void configureTextPaneAsHtml(JTextPane pane)
boolean isSupported(Node node)
DataContentViewer createInstance()
int isPreferred(Node node)
javax.swing.JScrollPane jScrollPane2
synchronized static Logger getLogger(String name)
void startTable(StringBuilder sb)