19package org.sleuthkit.autopsy.datamodel;
21import com.google.gson.JsonElement;
22import com.google.gson.JsonObject;
23import com.google.gson.JsonParseException;
24import com.google.gson.JsonParser;
25import com.google.gson.JsonPrimitive;
26import java.sql.ResultSet;
27import java.sql.SQLException;
28import java.time.Instant;
29import java.time.ZoneOffset;
30import java.time.format.DateTimeFormatter;
33import java.util.logging.Level;
34import org.openide.nodes.ChildFactory;
35import org.openide.nodes.Children;
36import org.openide.nodes.Node;
37import org.openide.nodes.Sheet;
38import org.openide.util.lookup.Lookups;
39import org.sleuthkit.autopsy.coreutils.Logger;
40import org.sleuthkit.autopsy.coreutils.TimeZoneUtils;
41import org.sleuthkit.datamodel.SleuthkitCase;
42import org.sleuthkit.datamodel.TskCoreException;
63 return visitor.
visit(
this);
77 try (SleuthkitCase.CaseDbQuery dbQuery =
skCase.executeQuery(
78 "SELECT name FROM sqlite_master WHERE type='table' AND name='ct_errors'")) {
79 return dbQuery.getResultSet().next();
80 }
catch (TskCoreException | SQLException ex) {
96 if (json ==
null || json.isEmpty()) {
100 JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
101 for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
102 JsonElement value = entry.getValue();
103 if (value.isJsonNull()) {
106 String key =
"CT " + entry.getKey();
107 if (value.isJsonPrimitive()) {
108 JsonPrimitive primitive = value.getAsJsonPrimitive();
109 if (primitive.isNumber()) {
110 String lowerName = entry.getKey().toLowerCase();
111 if (lowerName.contains(
"date") || lowerName.contains(
"time")) {
112 long numVal = primitive.getAsLong();
115 long seconds = (numVal > 10_000_000_000L) ? numVal / 1000 : numVal;
118 map.put(key, primitive.getAsNumber());
120 }
else if (primitive.isBoolean()) {
121 map.put(key, primitive.getAsBoolean());
123 map.put(key, primitive.getAsString());
127 map.put(key, value.toString());
130 }
catch (JsonParseException | IllegalStateException ex) {
132 .log(Level.WARNING,
"Failed to parse CT_JSON_DATA_ATTRIBUTE value", ex);
146 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/extracted_content.png";
163 return visitor.
visit(
this);
168 return getClass().getName();
176 private static class RootChildFactory
extends ChildFactory<String> {
180 RootChildFactory(SleuthkitCase
skCase) {
192 if (
"ERRORS".equals(key)) {
209 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/error-icon-16.png";
226 return visitor.
visit(
this);
231 return getClass().getName();
242 public static class CtError {
244 public final long id;
265 private static class ErrorsChildFactory
extends ChildFactory<CtError> {
270 ErrorsChildFactory(SleuthkitCase
skCase) {
276 String query =
"SELECT id, title, description, stack_trace, time_stamp, severity "
277 +
"FROM ct_errors ORDER BY time_stamp DESC";
278 try (SleuthkitCase.CaseDbQuery dbQuery =
skCase.executeQuery(query)) {
279 ResultSet rs = dbQuery.getResultSet();
283 rs.getString(
"title"),
284 rs.getString(
"description"),
285 rs.getString(
"stack_trace"),
286 rs.getLong(
"time_stamp"),
287 rs.getString(
"severity")));
289 }
catch (TskCoreException | SQLException ex) {
290 logger.log(Level.WARNING,
"Failed to query ct_errors table", ex);
306 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/warning-icon-16.png";
308 = DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
313 super(Children.LEAF, Lookups.singleton(
error));
315 setName(Long.toString(
error.id));
316 setDisplayName(
error.title);
327 return visitor.
visit(
this);
332 return getClass().getName();
337 Sheet sheet = super.createSheet();
338 Sheet.Set props = sheet.get(Sheet.PROPERTIES);
340 props = Sheet.createPropertiesSet();
343 props.put(
new NodeProperty<>(
"Severity",
"Severity",
"Severity of the error",
344 error.severity !=
null ?
error.severity :
""));
347 props.put(
new NodeProperty<>(
"Description",
"Description",
"Error description",
348 error.description !=
null ?
error.description :
""));
349 props.put(
new NodeProperty<>(
"Timestamp",
"Timestamp",
"When the error occurred",
351 props.put(
new NodeProperty<>(
"StackTrace",
"Stack Trace",
"Error stack trace",
352 error.stackTrace !=
null ?
error.stackTrace :
""));
synchronized static Logger getLogger(String name)
static String getFormattedTime(long epochTime)
static final String ICON_PATH
static final DateTimeFormatter DATE_FORMAT
final SleuthkitCase skCase
Node createNodeForKey(CtError error)
boolean createKeys(List< CtError > list)
static final Logger logger
ErrorsNode(SleuthkitCase skCase)
static final String DISPLAY_NAME
static final String ICON_PATH
Node createNodeForKey(String key)
final SleuthkitCase skCase
boolean createKeys(List< String > list)
static final String ICON_PATH
RootNode(SleuthkitCase skCase)
static final String DISPLAY_NAME
static boolean isCyberTriageDatabase(SleuthkitCase skCase)
CyberTriageData(SleuthkitCase skCase)
final SleuthkitCase skCase
SleuthkitCase getSleuthkitCase()
static void addCtJsonProperties(Map< String, Object > map, String json)
static final String CT_JSON_ATTRIBUTE_TYPE_NAME
DisplayableItemNode(Children children)
T visit(DataSourceFilesNode in)