1
0
mirror of https://github.com/elisspace/autopsy.git synced 2026-09-04 06:50:00 +00:00

Merge remote-tracking branch 'upstream/release-4.4.1' into develop

This commit is contained in:
Richard Cordovano
2017-06-23 11:53:47 -04:00
15 changed files with 102 additions and 60 deletions

View File

@@ -87,7 +87,7 @@ ReportGenerator.htmlOutput.header.timeAccessed=Accessed Time
ReportGenerator.htmlOutput.header.timeCreated=Created Time
ReportGenerator.htmlOutput.header.size=Size (Bytes)
ReportGenerator.htmlOutput.header.hash=Hash
ReportGenerator.thumbnailTable.name=Thumbnails
ReportGenerator.thumbnailTable.name=Tagged Images
ReportGenerator.thumbnailTable.desc=Contains thumbnails of images that are associated with tagged files and results.
ReportGenerator.writeKwHits.userSrchs=User Searches
ReportGenerator.progress.processingList=Now processing {0} ({1})...

View File

@@ -22,6 +22,7 @@
*/
package org.sleuthkit.autopsy.report;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
@@ -43,7 +44,7 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import org.openide.filesystems.FileObject;
import javax.imageio.ImageIO;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case;
@@ -268,7 +269,8 @@ class ReportHTML implements TableReportModule {
break;
}
} else if (dataType.startsWith(ARTIFACT_TYPE.TSK_ACCOUNT.getDisplayName())) {
/* TSK_ACCOUNT artifacts get separated by their TSK_ACCOUNT_TYPE
/*
* TSK_ACCOUNT artifacts get separated by their TSK_ACCOUNT_TYPE
* attribute, with a synthetic compound dataType name, so they are
* not caught by the switch statement above. For now we just give
* them all the general account icon, but we could do something else
@@ -623,7 +625,7 @@ class ReportHTML implements TableReportModule {
public void addThumbnailRows(List<Content> images) {
List<String> currentRow = new ArrayList<>();
int totalCount = 0;
int pages = 0;
int pages = 1;
for (Content content : images) {
if (currentRow.size() == THUMBNAIL_COLUMNS) {
addRow(currentRow);
@@ -670,7 +672,7 @@ class ReportHTML implements TableReportModule {
StringBuilder linkToThumbnail = new StringBuilder();
linkToThumbnail.append("<a href=\""); //NON-NLS
linkToThumbnail.append(contentPath);
linkToThumbnail.append("\">");
linkToThumbnail.append("\" target=\"_top\">");
linkToThumbnail.append("<img src=\"").append(thumbnailPath).append("\" title=\"").append(nameInImage).append("\"/>"); //NON-NLS
linkToThumbnail.append("</a><br>"); //NON-NLS
linkToThumbnail.append(file.getName()).append("<br>"); //NON-NLS
@@ -808,23 +810,40 @@ class ReportHTML implements TableReportModule {
Writer cssOut = null;
try {
cssOut = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path + "index.css"), "UTF-8")); //NON-NLS NON-NLS
String css = "body {margin: 0px; padding: 0px; background: #FFFFFF; font: 13px/20px Arial, Helvetica, sans-serif; color: #535353;}\n" + //NON-NLS
"#content {padding: 30px;}\n" + //NON-NLS
"#header {width:100%; padding: 10px; line-height: 25px; background: #07A; color: #FFF; font-size: 20px;}\n" + //NON-NLS
"h1 {font-size: 20px; font-weight: normal; color: #07A; padding: 0 0 7px 0; margin-top: 25px; border-bottom: 1px solid #D6D6D6;}\n" + //NON-NLS
"h2 {font-size: 20px; font-weight: bolder; color: #07A;}\n" + //NON-NLS
"h3 {font-size: 16px; color: #07A;}\n" + //NON-NLS
"h4 {background: #07A; color: #FFF; font-size: 16px; margin: 0 0 0 25px; padding: 0; padding-left: 15px;}\n" + //NON-NLS
"ul.nav {list-style-type: none; line-height: 35px; padding: 0px; margin-left: 15px;}\n" + //NON-NLS
"ul li a {font-size: 14px; color: #444; text-decoration: none; padding-left: 25px;}\n" + //NON-NLS
"ul li a:hover {text-decoration: underline;}\n" + //NON-NLS
"p {margin: 0 0 20px 0;}\n" + //NON-NLS
"table {white-space:nowrap; min-width: 700px; padding: 2; margin: 0; border-collapse: collapse; border-bottom: 2px solid #e5e5e5;}\n" + //NON-NLS
".keyword_list table {margin: 0 0 25px 25px; border-bottom: 2px solid #dedede;}\n" + //NON-NLS
"table th {white-space:nowrap; display: table-cell; text-align: center; padding: 2px 4px; background: #e5e5e5; color: #777; font-size: 11px; text-shadow: #e9f9fd 0 1px 0; border-top: 1px solid #dedede; border-bottom: 2px solid #e5e5e5;}\n" + //NON-NLS
"table .left_align_cell{display: table-cell; padding: 2px 4px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align: left; }\n" + //NON-NLS
"table .right_align_cell{display: table-cell; padding: 2px 4px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align: right; }\n" + //NON-NLS
"table td {white-space:nowrap; display: table-cell; padding: 2px 3px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align:left; }\n" + //NON-NLS
String css = "body {margin: 0px; padding: 0px; background: #FFFFFF; font: 13px/20px Arial, Helvetica, sans-serif; color: #535353;}\n"
+ //NON-NLS
"#content {padding: 30px;}\n"
+ //NON-NLS
"#header {width:100%; padding: 10px; line-height: 25px; background: #07A; color: #FFF; font-size: 20px;}\n"
+ //NON-NLS
"h1 {font-size: 20px; font-weight: normal; color: #07A; padding: 0 0 7px 0; margin-top: 25px; border-bottom: 1px solid #D6D6D6;}\n"
+ //NON-NLS
"h2 {font-size: 20px; font-weight: bolder; color: #07A;}\n"
+ //NON-NLS
"h3 {font-size: 16px; color: #07A;}\n"
+ //NON-NLS
"h4 {background: #07A; color: #FFF; font-size: 16px; margin: 0 0 0 25px; padding: 0; padding-left: 15px;}\n"
+ //NON-NLS
"ul.nav {list-style-type: none; line-height: 35px; padding: 0px; margin-left: 15px;}\n"
+ //NON-NLS
"ul li a {font-size: 14px; color: #444; text-decoration: none; padding-left: 25px;}\n"
+ //NON-NLS
"ul li a:hover {text-decoration: underline;}\n"
+ //NON-NLS
"p {margin: 0 0 20px 0;}\n"
+ //NON-NLS
"table {white-space:nowrap; min-width: 700px; padding: 2; margin: 0; border-collapse: collapse; border-bottom: 2px solid #e5e5e5;}\n"
+ //NON-NLS
".keyword_list table {margin: 0 0 25px 25px; border-bottom: 2px solid #dedede;}\n"
+ //NON-NLS
"table th {white-space:nowrap; display: table-cell; text-align: center; padding: 2px 4px; background: #e5e5e5; color: #777; font-size: 11px; text-shadow: #e9f9fd 0 1px 0; border-top: 1px solid #dedede; border-bottom: 2px solid #e5e5e5;}\n"
+ //NON-NLS
"table .left_align_cell{display: table-cell; padding: 2px 4px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align: left; }\n"
+ //NON-NLS
"table .right_align_cell{display: table-cell; padding: 2px 4px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align: right; }\n"
+ //NON-NLS
"table td {white-space:nowrap; display: table-cell; padding: 2px 3px; font: 13px/20px Arial, Helvetica, sans-serif; min-width: 125px; overflow: auto; text-align:left; }\n"
+ //NON-NLS
"table tr:nth-child(even) td {background: #f3f3f3;}"; //NON-NLS
cssOut.write(css);
} catch (FileNotFoundException ex) {
@@ -1128,24 +1147,23 @@ class ReportHTML implements TableReportModule {
}
private String prepareThumbnail(AbstractFile file) {
File thumbFile = ImageUtils.getCachedThumbnailFile(file, ImageUtils.ICON_SIZE_MEDIUM);
if (thumbFile.exists() == false) {
BufferedImage bufferedThumb = ImageUtils.getThumbnail(file, ImageUtils.ICON_SIZE_MEDIUM);
File thumbFile = Paths.get(thumbsPath, file.getName() + ".png").toFile();
if (bufferedThumb == null) {
return null;
}
File to = new File(thumbsPath);
FileObject from = FileUtil.toFileObject(thumbFile);
FileObject dest = FileUtil.toFileObject(to);
try {
FileUtil.copyFile(from, dest, thumbFile.getName(), "");
ImageIO.write(bufferedThumb, "png", thumbFile);
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to write thumb file to report directory.", ex); //NON-NLS
} catch (NullPointerException ex) {
logger.log(Level.SEVERE, "NPE generated from FileUtil.copyFile, probably because FileUtil.toFileObject returned null. \n" +
"The File argument for toFileObject was " + thumbFile + " with toString: " + thumbFile.toString() + "\n" +
"The FileObject returned by toFileObject, passed into FileUtil.copyFile, was " + from, ex);
logger.log(Level.WARNING, "Failed to write thumb file to report directory.", ex); //NON-NLS
return null;
}
return THUMBS_REL_PATH + thumbFile.getName();
if (thumbFile.exists()
== false) {
return null;
}
return THUMBS_REL_PATH
+ thumbFile.getName();
}
}

View File

@@ -10,24 +10,25 @@
<property name="thirdparty.dir" value="${basedir}/../thirdparty" />
<property name="modules.dir" value="${basedir}/release/modules/" />
<property name="ext.dir" value="${modules.dir}/ext" />
<target name="get-thirdparty-dependencies" description="get third-party dependencies">
<copy file="${thirdparty.dir}/commons/commons-dbcp2-2.1.1.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/commons/commons-dbcp2-2.1.1-javadoc.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/commons/commons-logging-1.2.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/commons/commons-pool2-2.4.2.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/commons/commons-pool2-2.4.2-javadoc.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/postgresql-jdbc/postgresql-42.0.0.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/sqlite-jdbc/sqlite-jdbc-3.16.1.jar" todir="${ext.dir}" />
</target>
<target name="get-deps" depends="init-ivy,get-thirdparty-dependencies">
<target name="resolve">
<ivy:settings file="ivysettings.xml" />
<ivy:resolve/>
<ivy:resolve file="ivy.xml" conf="experimental, eam"/>
</target>
<target name="retrieve-experimental" depends="resolve">
<ivy:retrieve conf="experimental" pattern="${basedir}/release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
</target>
<target name="retrieve-eam" depends="resolve">
<ivy:retrieve conf="eam" pattern="${basedir}/release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
</target>
<target name="retrieve-all" depends="resolve">
<ivy:retrieve conf="*" pattern="${basedir}/release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
</target>
<target name="init" depends="get-deps, harness.init" />
<target name="init" depends="retrieve-all, harness.init" />
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy

View File

@@ -1,9 +1,10 @@
<ivy-module version="2.0">
<info organisation="org.sleuthkit.autopsy" module="corelibs"/>
<info organisation="org.sleuthkit.autopsy" module="experimental"/>
<configurations >
<!-- module dependencies -->
<conf name="experimental"/>
<conf name="eam"/>
</configurations>
<dependencies>
<dependency conf="experimental->default" org="com.github.lgooddatepicker" name="LGoodDatePicker" rev="4.3.1"/>
@@ -12,5 +13,13 @@
<dependency conf="experimental->default" org="com.mchange" name="c3p0" rev="0.9.5"/>
<dependency conf="experimental->default" org="com.fasterxml.jackson.core" name="jackson-core" rev="2.7.0"/>
<dependency conf="experimental->default" org="org.swinglabs.swingx" name="swingx-all" rev="1.6.4"/>
<!-- for enterprise artifacts manager -->
<dependency conf="eam->default" org="org.apache.commons" name="commons-dbcp2" rev="2.1.1"/>
<dependency conf="eam->default" org="commons-logging" name="commons-logging" rev="1.2"/>
<dependency conf="eam->default" org="org.apache.commons" name="commons-pool2" rev="2.4.2"/>
<dependency conf="eam->default" org="org.postgresql" name="postgresql" rev="42.1.1"/>
<dependency conf="eam->default" org="org.xerial" name="sqlite-jdbc" rev="3.16.1"/>
</dependencies>
</ivy-module>

View File

@@ -79,7 +79,7 @@
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="404" max="32767" attributes="0"/>
<EmptySpace min="0" pref="144" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="tableContainerPanel" max="32767" attributes="0"/>
@@ -95,14 +95,14 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="tableScrollPane" alignment="1" pref="800" max="32767" attributes="0"/>
<Component id="tableScrollPane" alignment="1" max="32767" attributes="0"/>
<Component id="tableStatusPanel" alignment="1" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="tableScrollPane" pref="371" max="32767" attributes="0"/>
<Component id="tableScrollPane" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="tableStatusPanel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
@@ -112,6 +112,11 @@
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="tableScrollPane">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[452, 30]"/>
</Property>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>

View File

@@ -483,7 +483,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
Collection<EamArtifactInstance> eamArtifactInstances = new ArrayList<>();
try {
EamDb dbManager = EamDb.getInstance();
if (dbManager.getCorrelationArtifactTypeByName("FILES") == eamArtifact.getArtifactType()) {
if (dbManager.getCorrelationArtifactTypeByName("FILES").equals(eamArtifact.getArtifactType())) {
try {
Collection<EamGlobalFileInstance> eamGlobalFileInstances = dbManager.getGlobalFileInstancesByHash(eamArtifact.getArtifactValue());
for (EamGlobalFileInstance eamGlobalFileInstance : eamGlobalFileInstances) {
@@ -519,6 +519,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
return;
}
readSettings(); // reset the table to empty.
populateTable(node);
}
@@ -613,6 +614,8 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
org.openide.awt.Mnemonics.setLocalizedText(showCommonalityMenuItem, org.openide.util.NbBundle.getMessage(DataContentViewerOtherCases.class, "DataContentViewerOtherCases.showCommonalityMenuItem.text")); // NOI18N
rightClickPopupMenu.add(showCommonalityMenuItem);
tableScrollPane.setPreferredSize(new java.awt.Dimension(452, 30));
otherCasesTable.setAutoCreateRowSorter(true);
otherCasesTable.setModel(tableModel);
otherCasesTable.setToolTipText(org.openide.util.NbBundle.getMessage(DataContentViewerOtherCases.class, "DataContentViewerOtherCases.table.toolTip.text")); // NOI18N
@@ -646,13 +649,13 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
tableContainerPanel.setLayout(tableContainerPanelLayout);
tableContainerPanelLayout.setHorizontalGroup(
tableContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tableScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 800, Short.MAX_VALUE)
.addComponent(tableScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(tableStatusPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
tableContainerPanelLayout.setVerticalGroup(
tableContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tableContainerPanelLayout.createSequentialGroup()
.addComponent(tableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 371, Short.MAX_VALUE)
.addComponent(tableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tableStatusPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
@@ -668,7 +671,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
);
otherCasesPanelLayout.setVerticalGroup(
otherCasesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 404, Short.MAX_VALUE)
.addGap(0, 144, Short.MAX_VALUE)
.addGroup(otherCasesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(otherCasesPanelLayout.createSequentialGroup()
.addComponent(tableContainerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

View File

@@ -133,13 +133,19 @@ public class DataContentViewerOtherCasesTableModel extends AbstractTableModel {
switch (colId) {
case CASE_NAME:
value = eamArtifactInstance.getEamCase().getDisplayName();
if (null != eamArtifactInstance.getEamCase()) {
value = eamArtifactInstance.getEamCase().getDisplayName();
}
break;
case DEVICE:
value = eamArtifactInstance.getEamDataSource().getDeviceID();
if (null != eamArtifactInstance.getEamDataSource()) {
value = eamArtifactInstance.getEamDataSource().getDeviceID();
}
break;
case DATA_SOURCE:
value = eamArtifactInstance.getEamDataSource().getName();
if (null != eamArtifactInstance.getEamDataSource()) {
value = eamArtifactInstance.getEamDataSource().getName();
}
break;
case FILE_PATH:
value = eamArtifactInstance.getFilePath();

View File

@@ -1204,7 +1204,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
public boolean isArtifactGlobalKnownBad(EamArtifact eamArtifact) throws EamDbException {
// TEMP: Only support file types
if (eamArtifact.getArtifactType() != getCorrelationArtifactTypeByName("FILES")) {
if (!eamArtifact.getArtifactType().equals(getCorrelationArtifactTypeByName("FILES"))) {
return false;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.