user activity panel refactoring

This commit is contained in:
Greg DiCristofaro 2021-02-24 19:30:40 -05:00
parent fd0838f4b4
commit 03f6cd306a

View File

@ -25,6 +25,7 @@ import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.function.Function;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.datasourcesummary.datamodel.UserActivitySummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.UserActivitySummary;
@ -72,26 +73,21 @@ import org.sleuthkit.datamodel.DataSource;
public class UserActivityPanel extends BaseDataSourceSummaryPanel { public class UserActivityPanel extends BaseDataSourceSummaryPanel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault()); private static final String DATETIME_FORMAT_STR = "yyyy/MM/dd HH:mm:ss";
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat(DATETIME_FORMAT_STR, Locale.getDefault());
private static final int TOP_PROGS_COUNT = 10; private static final int TOP_PROGS_COUNT = 10;
private static final int TOP_DOMAINS_COUNT = 10; private static final int TOP_DOMAINS_COUNT = 10;
private static final int TOP_SEARCHES_COUNT = 10; private static final int TOP_SEARCHES_COUNT = 10;
private static final int TOP_ACCOUNTS_COUNT = 5; private static final int TOP_ACCOUNTS_COUNT = 5;
private static final int TOP_DEVICES_COUNT = 10; private static final int TOP_DEVICES_COUNT = 10;
/** private final static Function<LastAccessedArtifact, ? extends DefaultCellModel> DATE_FUNCT = (lastAccessed) -> {
* Gets a string formatted date or returns empty string if the date is null. return new DefaultCellModel(lastAccessed.getLastAccessed(), (dt) -> dt == null ? "" : DATETIME_FORMAT.format(dt), DATETIME_FORMAT_STR)
* .setPopupMenu(getPopup(lastAccessed));
* @param date The date. };
*
* @return The formatted date string or empty string if the date is null.
*/
private static String getFormatted(Date date) {
return date == null ? "" : DATETIME_FORMAT.format(date);
}
// set up recent programs table // set up recent programs table
private final TableTemplate<TopProgramsResult, DefaultCellModel<?>> TOP_PROGS_TEMPLATE = new TableTemplate<>( private static final TableTemplate<TopProgramsResult, DefaultCellModel<?>> TOP_PROGS_TEMPLATE = new TableTemplate<>(
Arrays.asList( Arrays.asList(
// program name column // program name column
new ColumnModel<>( new ColumnModel<>(
@ -126,300 +122,149 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel {
// last run date column // last run date column
new ColumnModel<>( new ColumnModel<>(
Bundle.UserActivityPanel_TopProgramsTableModel_lastrun_header(), Bundle.UserActivityPanel_TopProgramsTableModel_lastrun_header(),
(prog) -> { DATE_FUNCT,
return new DefaultCellModel(getFormatted(prog.getLastAccessed()))
.setPopupMenu(getPopup(prog));
},
150) 150)
), ),
Bundle.UserActivityPanel_TopProgramsTableModel_tabName() Bundle.UserActivityPanel_TopProgramsTableModel_tabName()
); );
// set up recent domains table // set up recent domains table
private final JTablePanel<TopDomainsResult> recentDomainsTable = JTablePanel.getJTablePanel(Arrays.asList( private static final TableTemplate<TopDomainsResult, DefaultCellModel<?>> TOP_DOMAINS_TEMPLATE = new TableTemplate<>(
// domain column Arrays.asList(
new ColumnModel<TopDomainsResult>( // domain column
Bundle.UserActivityPanel_TopDomainsTableModel_domain_header(), new ColumnModel<>(
(recentDomain) -> { Bundle.UserActivityPanel_TopDomainsTableModel_domain_header(),
return new DefaultCellModel(recentDomain.getDomain()) (recentDomain) -> {
.setPopupMenu(getPopup(recentDomain)); return new DefaultCellModel(recentDomain.getDomain())
}, .setPopupMenu(getPopup(recentDomain));
250), },
// count column 250),
new ColumnModel<>( // count column
Bundle.UserActivityPanel_TopDomainsTableModel_count_header(), new ColumnModel<>(
(recentDomain) -> { Bundle.UserActivityPanel_TopDomainsTableModel_count_header(),
String visitTimes = recentDomain.getVisitTimes() == null ? "" : Long.toString(recentDomain.getVisitTimes()); (recentDomain) -> {
return new DefaultCellModel(visitTimes) return new DefaultCellModel(
.setPopupMenu(getPopup(recentDomain)); recentDomain.getVisitTimes(),
}, (times) -> times == null ? "" : Long.toString(times))
100), .setPopupMenu(getPopup(recentDomain));
// last accessed column },
new ColumnModel<>( 100),
Bundle.UserActivityPanel_TopDomainsTableModel_lastAccess_header(), // last accessed column
(recentDomain) -> { new ColumnModel<>(
return new DefaultCellModel(getFormatted(recentDomain.getLastAccessed())) Bundle.UserActivityPanel_TopDomainsTableModel_lastAccess_header(),
.setPopupMenu(getPopup(recentDomain)); DATE_FUNCT,
}, 150)
150) ),
)) Bundle.UserActivityPanel_TopDomainsTableModel_tabName()
.setKeyFunction((domain) -> domain.getDomain()); );
// top web searches table // top web searches table
private final JTablePanel<TopWebSearchResult> topWebSearchesTable = JTablePanel.getJTablePanel(Arrays.asList( private static final TableTemplate<TopWebSearchResult, DefaultCellModel<?>> TOP_WEB_SEARCH_TEMPLATE = new TableTemplate<>(
// search string column Arrays.asList(
new ColumnModel<TopWebSearchResult>( // search string column
Bundle.UserActivityPanel_TopWebSearchTableModel_searchString_header(), new ColumnModel<TopWebSearchResult>(
(webSearch) -> { Bundle.UserActivityPanel_TopWebSearchTableModel_searchString_header(),
return new DefaultCellModel(webSearch.getSearchString()) (webSearch) -> {
.setPopupMenu(getPopup(webSearch)); return new DefaultCellModel(webSearch.getSearchString())
}, .setPopupMenu(getPopup(webSearch));
250 },
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopWebSearchTableModel_dateAccessed_header(),
DATE_FUNCT,
150
),
// translated value
new ColumnModel<>(
Bundle.UserActivityPanel_TopWebSearchTableModel_translatedResult_header(),
(webSearch) -> {
return new DefaultCellModel(webSearch.getTranslatedResult())
.setPopupMenu(getPopup(webSearch));
},
250
)
), ),
// last accessed Bundle.UserActivityPanel_TopWebSearchTableModel_tabName()
new ColumnModel<>( );
Bundle.UserActivityPanel_TopWebSearchTableModel_dateAccessed_header(),
(webSearch) -> {
return new DefaultCellModel(getFormatted(webSearch.getLastAccessed()))
.setPopupMenu(getPopup(webSearch));
},
150
),
// translated value
new ColumnModel<>(
Bundle.UserActivityPanel_TopWebSearchTableModel_translatedResult_header(),
(webSearch) -> {
return new DefaultCellModel(webSearch.getTranslatedResult())
.setPopupMenu(getPopup(webSearch));
},
250
)
))
.setKeyFunction((query) -> query.getSearchString());
// top devices attached table // top devices attached table
private final JTablePanel<TopDeviceAttachedResult> topDevicesAttachedTable = JTablePanel.getJTablePanel(Arrays.asList( private static final TableTemplate<TopDeviceAttachedResult, DefaultCellModel<?>> TOP_DEVICES_TEMPLATE = new TableTemplate<>(
// device id column Arrays.asList(
new ColumnModel<TopDeviceAttachedResult>( // device id column
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(), new ColumnModel<>(
(device) -> { Bundle.UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(),
return new DefaultCellModel(device.getDeviceId()) (device) -> {
.setPopupMenu(getPopup(device)); return new DefaultCellModel(device.getDeviceId())
}, .setPopupMenu(getPopup(device));
250 },
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(),
DATE_FUNCT,
150
),
// make and model
new ColumnModel<>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(),
(device) -> {
String make = StringUtils.isBlank(device.getDeviceMake()) ? "" : device.getDeviceMake().trim();
String model = StringUtils.isBlank(device.getDeviceModel()) ? "" : device.getDeviceModel().trim();
String makeModelString = (make.isEmpty() || model.isEmpty())
? make + model
: String.format("%s - %s", make, model);
return new DefaultCellModel(makeModelString)
.setPopupMenu(getPopup(device));
},
250
)
), ),
// last accessed Bundle.UserActivityPanel_TopDeviceAttachedTableModel_tabName()
new ColumnModel<>( );
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(),
(device) -> {
return new DefaultCellModel(getFormatted(device.getLastAccessed()))
.setPopupMenu(getPopup(device));
},
150
),
// make and model
new ColumnModel<>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(),
(device) -> {
String make = StringUtils.isBlank(device.getDeviceMake()) ? "" : device.getDeviceMake().trim();
String model = StringUtils.isBlank(device.getDeviceModel()) ? "" : device.getDeviceModel().trim();
String makeModelString = (make.isEmpty() || model.isEmpty())
? make + model
: String.format("%s - %s", make, model);
return new DefaultCellModel(makeModelString)
.setPopupMenu(getPopup(device));
},
250
)
))
.setKeyFunction((topDevice) -> topDevice.getDeviceId());
// top accounts table // top accounts table
private final JTablePanel<TopAccountResult> topAccountsTable = JTablePanel.getJTablePanel(Arrays.asList( private static final TableTemplate<TopAccountResult, DefaultCellModel<?>> TOP_ACCOUNTS_TEMPLATE = new TableTemplate<>(
// account type column Arrays.asList(
new ColumnModel<TopAccountResult>( // account type column
Bundle.UserActivityPanel_TopAccountTableModel_accountType_header(), new ColumnModel<>(
(account) -> { Bundle.UserActivityPanel_TopAccountTableModel_accountType_header(),
return new DefaultCellModel(account.getAccountType()) (account) -> {
.setPopupMenu(getPopup(account)); return new DefaultCellModel(account.getAccountType())
}, .setPopupMenu(getPopup(account));
250 },
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopAccountTableModel_lastAccess_header(),
DATE_FUNCT,
150
)
), ),
// last accessed Bundle.UserActivityPanel_TopAccountTableModel_tabName()
new ColumnModel<>( );
Bundle.UserActivityPanel_TopAccountTableModel_lastAccess_header(),
(account) -> {
return new DefaultCellModel(getFormatted(account.getLastAccessed()))
.setPopupMenu(getPopup(account));
},
150
)
))
.setKeyFunction((topAccount) -> topAccount.getAccountType());
// set up recent programs table // set up recent programs table
private final JTablePanel<TopProgramsResult> topProgramsTable = JTablePanel.getJTablePanel(Arrays.asList( private final JTablePanel<TopProgramsResult> topProgramsTable = JTablePanel.getJTablePanel(TOP_PROGS_TEMPLATE)
// program name column
new ColumnModel<TopProgramsResult>(
Bundle.UserActivityPanel_TopProgramsTableModel_name_header(),
(prog) -> {
return new DefaultCellModel(prog.getProgramName())
.setTooltip(prog.getProgramPath())
.setPopupMenu(getPopup(prog));
},
250),
// program folder column
new ColumnModel<>(
Bundle.UserActivityPanel_TopProgramsTableModel_folder_header(),
(prog) -> {
return new DefaultCellModel(
getShortFolderName(
prog.getProgramPath(),
prog.getProgramName()))
.setTooltip(prog.getProgramPath())
.setPopupMenu(getPopup(prog));
},
150),
// run count column
new ColumnModel<>(
Bundle.UserActivityPanel_TopProgramsTableModel_count_header(),
(prog) -> {
String runTimes = prog.getRunTimes() == null ? "" : Long.toString(prog.getRunTimes());
return new DefaultCellModel(runTimes)
.setPopupMenu(getPopup(prog));
},
80),
// last run date column
new ColumnModel<>(
Bundle.UserActivityPanel_TopProgramsTableModel_lastrun_header(),
(prog) -> {
return new DefaultCellModel(getFormatted(prog.getLastAccessed()))
.setPopupMenu(getPopup(prog));
},
150)
))
.setKeyFunction((prog) -> prog.getProgramPath() + ":" + prog.getProgramName()); .setKeyFunction((prog) -> prog.getProgramPath() + ":" + prog.getProgramName());
// set up recent domains table // set up recent domains table
private final JTablePanel<TopDomainsResult> recentDomainsTable = JTablePanel.getJTablePanel(Arrays.asList( private final JTablePanel<TopDomainsResult> recentDomainsTable = JTablePanel.getJTablePanel(TOP_DOMAINS_TEMPLATE)
// domain column
new ColumnModel<TopDomainsResult>(
Bundle.UserActivityPanel_TopDomainsTableModel_domain_header(),
(recentDomain) -> {
return new DefaultCellModel(recentDomain.getDomain())
.setPopupMenu(getPopup(recentDomain));
},
250),
// count column
new ColumnModel<>(
Bundle.UserActivityPanel_TopDomainsTableModel_count_header(),
(recentDomain) -> {
String visitTimes = recentDomain.getVisitTimes() == null ? "" : Long.toString(recentDomain.getVisitTimes());
return new DefaultCellModel(visitTimes)
.setPopupMenu(getPopup(recentDomain));
},
100),
// last accessed column
new ColumnModel<>(
Bundle.UserActivityPanel_TopDomainsTableModel_lastAccess_header(),
(recentDomain) -> {
return new DefaultCellModel(getFormatted(recentDomain.getLastAccessed()))
.setPopupMenu(getPopup(recentDomain));
},
150)
))
.setKeyFunction((domain) -> domain.getDomain()); .setKeyFunction((domain) -> domain.getDomain());
// top web searches table // top web searches table
private final JTablePanel<TopWebSearchResult> topWebSearchesTable = JTablePanel.getJTablePanel(Arrays.asList( private final JTablePanel<TopWebSearchResult> topWebSearchesTable = JTablePanel.getJTablePanel(TOP_WEB_SEARCH_TEMPLATE)
// search string column
new ColumnModel<TopWebSearchResult>(
Bundle.UserActivityPanel_TopWebSearchTableModel_searchString_header(),
(webSearch) -> {
return new DefaultCellModel(webSearch.getSearchString())
.setPopupMenu(getPopup(webSearch));
},
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopWebSearchTableModel_dateAccessed_header(),
(webSearch) -> {
return new DefaultCellModel(getFormatted(webSearch.getLastAccessed()))
.setPopupMenu(getPopup(webSearch));
},
150
),
// translated value
new ColumnModel<>(
Bundle.UserActivityPanel_TopWebSearchTableModel_translatedResult_header(),
(webSearch) -> {
return new DefaultCellModel(webSearch.getTranslatedResult())
.setPopupMenu(getPopup(webSearch));
},
250
)
))
.setKeyFunction((query) -> query.getSearchString()); .setKeyFunction((query) -> query.getSearchString());
// top devices attached table // top devices attached table
private final JTablePanel<TopDeviceAttachedResult> topDevicesAttachedTable = JTablePanel.getJTablePanel(Arrays.asList( private final JTablePanel<TopDeviceAttachedResult> topDevicesAttachedTable = JTablePanel.getJTablePanel(TOP_DEVICES_TEMPLATE)
// device id column
new ColumnModel<TopDeviceAttachedResult>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(),
(device) -> {
return new DefaultCellModel(device.getDeviceId())
.setPopupMenu(getPopup(device));
},
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(),
(device) -> {
return new DefaultCellModel(getFormatted(device.getLastAccessed()))
.setPopupMenu(getPopup(device));
},
150
),
// make and model
new ColumnModel<>(
Bundle.UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(),
(device) -> {
String make = StringUtils.isBlank(device.getDeviceMake()) ? "" : device.getDeviceMake().trim();
String model = StringUtils.isBlank(device.getDeviceModel()) ? "" : device.getDeviceModel().trim();
String makeModelString = (make.isEmpty() || model.isEmpty())
? make + model
: String.format("%s - %s", make, model);
return new DefaultCellModel(makeModelString)
.setPopupMenu(getPopup(device));
},
250
)
))
.setKeyFunction((topDevice) -> topDevice.getDeviceId()); .setKeyFunction((topDevice) -> topDevice.getDeviceId());
// top accounts table // top accounts table
private final JTablePanel<TopAccountResult> topAccountsTable = JTablePanel.getJTablePanel(Arrays.asList( private final JTablePanel<TopAccountResult> topAccountsTable = JTablePanel.getJTablePanel(TOP_ACCOUNTS_TEMPLATE)
// account type column
new ColumnModel<TopAccountResult>(
Bundle.UserActivityPanel_TopAccountTableModel_accountType_header(),
(account) -> {
return new DefaultCellModel(account.getAccountType())
.setPopupMenu(getPopup(account));
},
250
),
// last accessed
new ColumnModel<>(
Bundle.UserActivityPanel_TopAccountTableModel_lastAccess_header(),
(account) -> {
return new DefaultCellModel(getFormatted(account.getLastAccessed()))
.setPopupMenu(getPopup(account));
},
150
)
))
.setKeyFunction((topAccount) -> topAccount.getAccountType()); .setKeyFunction((topAccount) -> topAccount.getAccountType());
private final List<JTablePanel<?>> tables = Arrays.asList( private final List<JTablePanel<?>> tables = Arrays.asList(