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.text.SimpleDateFormat;
32import java.util.logging.Level;
33import org.openide.nodes.ChildFactory;
34import org.openide.nodes.Children;
35import org.openide.nodes.Node;
36import org.openide.nodes.Sheet;
37import org.openide.util.lookup.Lookups;
38import org.sleuthkit.autopsy.coreutils.Logger;
39import org.sleuthkit.autopsy.coreutils.TimeZoneUtils;
40import org.sleuthkit.datamodel.SleuthkitCase;
41import org.sleuthkit.datamodel.TskCoreException;
62 return visitor.
visit(
this);
76 try (SleuthkitCase.CaseDbQuery dbQuery =
skCase.executeQuery(
77 "SELECT name FROM sqlite_master WHERE type='table' AND name='ct_errors'")) {
78 return dbQuery.getResultSet().next();
79 }
catch (TskCoreException | SQLException ex) {
95 if (json ==
null || json.isEmpty()) {
99 JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
100 for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
101 JsonElement value = entry.getValue();
102 if (value.isJsonNull()) {
105 String key =
"CT " + entry.getKey();
106 if (value.isJsonPrimitive()) {
107 JsonPrimitive primitive = value.getAsJsonPrimitive();
108 if (primitive.isNumber()) {
109 String lowerName = entry.getKey().toLowerCase();
110 if (lowerName.contains(
"date") || lowerName.contains(
"time")) {
111 long numVal = primitive.getAsLong();
114 long seconds = (numVal > 10_000_000_000L) ? numVal / 1000 : numVal;
117 map.put(key, primitive.getAsNumber());
119 }
else if (primitive.isBoolean()) {
120 map.put(key, primitive.getAsBoolean());
122 map.put(key, primitive.getAsString());
126 map.put(key, value.toString());
129 }
catch (JsonParseException | IllegalStateException ex) {
131 .log(Level.WARNING,
"Failed to parse CT_JSON_DATA_ATTRIBUTE value", ex);
145 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/extracted_content.png";
162 return visitor.
visit(
this);
167 return getClass().getName();
175 private static class RootChildFactory
extends ChildFactory<String> {
179 RootChildFactory(SleuthkitCase
skCase) {
191 if (
"ERRORS".equals(key)) {
208 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/error-icon-16.png";
225 return visitor.
visit(
this);
230 return getClass().getName();
241 public static class CtError {
243 public final long id;
264 private static class ErrorsChildFactory
extends ChildFactory<CtError> {
269 ErrorsChildFactory(SleuthkitCase
skCase) {
275 String query =
"SELECT id, title, description, stack_trace, time_stamp, severity "
276 +
"FROM ct_errors ORDER BY time_stamp DESC";
277 try (SleuthkitCase.CaseDbQuery dbQuery =
skCase.executeQuery(query)) {
278 ResultSet rs = dbQuery.getResultSet();
282 rs.getString(
"title"),
283 rs.getString(
"description"),
284 rs.getString(
"stack_trace"),
285 rs.getLong(
"time_stamp"),
286 rs.getString(
"severity")));
288 }
catch (TskCoreException | SQLException ex) {
289 logger.log(Level.WARNING,
"Failed to query ct_errors table", ex);
305 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/warning-icon-16.png";
307 =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
312 super(Children.LEAF, Lookups.singleton(
error));
314 setName(Long.toString(
error.id));
315 setDisplayName(
error.title);
326 return visitor.
visit(
this);
331 return getClass().getName();
336 Sheet sheet = super.createSheet();
337 Sheet.Set props = sheet.get(Sheet.PROPERTIES);
339 props = Sheet.createPropertiesSet();
342 props.put(
new NodeProperty<>(
"Severity",
"Severity",
"Severity of the error",
343 error.severity !=
null ?
error.severity :
""));
346 props.put(
new NodeProperty<>(
"Description",
"Description",
"Error description",
347 error.description !=
null ?
error.description :
""));
348 props.put(
new NodeProperty<>(
"Timestamp",
"Timestamp",
"When the error occurred",
350 props.put(
new NodeProperty<>(
"StackTrace",
"Stack Trace",
"Error stack trace",
351 error.stackTrace !=
null ?
error.stackTrace :
""));
synchronized static Logger getLogger(String name)
static String getFormattedTime(long epochTime)
static final String ICON_PATH
static final SimpleDateFormat 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)