From 2fcadd867bb60f16c95c5676c1d418cecc6d01bb Mon Sep 17 00:00:00 2001 From: Kelly Kelly <kelly@basistech.com> Date: Tue, 16 Mar 2021 18:15:56 -0400 Subject: [PATCH] Protection against NPE from getDataSourceID returning null --- .../org/sleuthkit/datamodel/AccountFileInstance.java | 2 +- .../datamodel/AggregateScoresChangedEvent.java | 2 +- .../org/sleuthkit/datamodel/BlackboardArtifact.java | 4 ++-- .../org/sleuthkit/datamodel/BlackboardAttribute.java | 7 ++++--- .../org/sleuthkit/datamodel/CommunicationsManager.java | 8 ++++++-- .../java/src/org/sleuthkit/datamodel/ScoreChange.java | 10 ++++++---- .../src/org/sleuthkit/datamodel/TimelineManager.java | 7 ++++++- 7 files changed, 26 insertions(+), 14 deletions(-) diff --git a/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java b/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java index 2c4ea7c07..655226911 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java @@ -103,7 +103,7 @@ public Content getFile() throws TskCoreException { * * @return A Data Source Object ID */ - long getDataSourceObjectID() { + Long getDataSourceObjectID() { return artifact.getDataSourceObjectID(); } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java b/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java index d60ac44a0..2165989c9 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java @@ -34,7 +34,7 @@ final public class AggregateScoresChangedEvent implements TskDataSourceEvent, Ts // ensure that all score changes have the same data source as the one in the event. scoreChanges.stream() .forEach(chg -> { - if (chg.getDataSourceObjectId() != dataSourceId) { + if (!chg.getDataSourceObjectId().equals(dataSourceId)) { throw new IllegalArgumentException("ScoreChange datasource id does not match the datasource id of the event."); } }); diff --git a/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java b/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java index b1c0f10c0..88bdd806b 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java +++ b/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java @@ -54,7 +54,7 @@ public class BlackboardArtifact implements Content { private final long artifactId; private final long sourceObjId; // refers to objID of parent/source object private final long artifactObjId; // objId of the artifact in tsk_objects. TBD: replace artifactID with this - private final long dataSourceObjId; // objId of the data source in tsk_objects. + private final Long dataSourceObjId; // objId of the data source in tsk_objects. private final int artifactTypeId; private final String artifactTypeName; private final String displayName; @@ -856,7 +856,7 @@ public String getName() { @Override public Content getDataSource() throws TskCoreException { - return getSleuthkitCase().getContentById(dataSourceObjId); + return dataSourceObjId != null ? getSleuthkitCase().getContentById(dataSourceObjId) : null; } /** diff --git a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java index 82033ba71..7f3ecbf56 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java +++ b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java @@ -1,7 +1,7 @@ /* * Sleuth Kit Data Model * - * Copyright 2011-2020 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -343,6 +343,7 @@ public String toString() { * * @return The value as a string. */ + @Override public String getDisplayString() { switch (getAttributeType().getValueType()) { case DATETIME: { @@ -351,7 +352,7 @@ public String getDisplayString() { BlackboardArtifact parent = getParentArtifact(); parentDataSourceID = parent.getDataSourceObjectID(); } - final Content dataSource = getCaseDatabase().getContentById(parentDataSourceID); + final Content dataSource = parentDataSourceID != null ? getCaseDatabase().getContentById(parentDataSourceID) : null; if ((dataSource != null) && (dataSource instanceof Image)) { // return the date/time string in the timezone associated with the datasource, Image image = (Image) dataSource; @@ -404,7 +405,7 @@ public String getDisplayString() { * * @param parentDataSourceID The parent data source id. */ - void setParentDataSourceID(long parentDataSourceID) { + void setParentDataSourceID(Long parentDataSourceID) { this.parentDataSourceID = parentDataSourceID; } diff --git a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java index 476f823cf..2e54a3d48 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java +++ b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java @@ -355,6 +355,10 @@ public Account getAccount(org.sleuthkit.datamodel.Account.Type accountType, Stri public void addRelationships(AccountFileInstance sender, List<AccountFileInstance> recipients, BlackboardArtifact sourceArtifact, org.sleuthkit.datamodel.Relationship.Type relationshipType, long dateTime) throws TskCoreException, TskDataException { + if(sourceArtifact.getDataSourceObjectID() == null) { + throw new TskDataException("Source Artifact does not have a valid data source."); + } + if (relationshipType.isCreatableFrom(sourceArtifact) == false) { throw new TskDataException("Can not make a " + relationshipType.getDisplayName() + " relationship from a" + sourceArtifact.getDisplayName()); @@ -370,7 +374,7 @@ public void addRelationships(AccountFileInstance sender, List<AccountFileInstanc if (null != sender) { accountIDs.add(sender.getAccount().getAccountID()); - if (sender.getDataSourceObjectID() != sourceArtifact.getDataSourceObjectID()) { + if (!sender.getDataSourceObjectID().equals(sourceArtifact.getDataSourceObjectID())) { throw new TskDataException("Sender and relationship are from different data sources :" + "Sender source ID" + sender.getDataSourceObjectID() + " != relationship source ID" + sourceArtifact.getDataSourceObjectID()); } @@ -378,7 +382,7 @@ public void addRelationships(AccountFileInstance sender, List<AccountFileInstanc for (AccountFileInstance recipient : recipients) { accountIDs.add(recipient.getAccount().getAccountID()); - if (recipient.getDataSourceObjectID() != sourceArtifact.getDataSourceObjectID()) { + if (!recipient.getDataSourceObjectID().equals(sourceArtifact.getDataSourceObjectID())) { throw new TskDataException("Recipient and relationship are from different data sources :" + "Recipient source ID" + recipient.getDataSourceObjectID() + " != relationship source ID" + sourceArtifact.getDataSourceObjectID()); } diff --git a/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java b/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java index f22142a6d..cf051b71d 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java +++ b/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java @@ -1,7 +1,7 @@ /* * Sleuth Kit Data Model * - * Copyright 2020 Basis Technology Corp. + * Copyright 2020-2021 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,24 +18,26 @@ */ package org.sleuthkit.datamodel; +import java.util.Optional; + /** * This class encapsulates a score change. */ final public class ScoreChange { private final long objId; - private final long dataSourceObjectId; + private final Long dataSourceObjectId; private final Score oldScore; private final Score newScore; - ScoreChange(long objId, long dataSourceObjectId, Score oldScore, Score newScore) { + ScoreChange(long objId, Long dataSourceObjectId, Score oldScore, Score newScore) { this.objId = objId; this.dataSourceObjectId = dataSourceObjectId; this.oldScore = oldScore; this.newScore = newScore; } - public long getDataSourceObjectId() { + public Long getDataSourceObjectId() { return dataSourceObjectId; } diff --git a/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java b/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java index 57b05c05b..0669e5ba8 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java @@ -814,7 +814,12 @@ private Optional<TimelineEvent> addArtifactEvent(TimelineEventDescriptionWithTim String shortDescription = eventPayload.getDescription(TimelineLevelOfDetail.LOW); long artifactID = artifact.getArtifactID(); long fileObjId = artifact.getObjectID(); - long dataSourceObjectID = artifact.getDataSourceObjectID(); + Long dataSourceObjectID = artifact.getDataSourceObjectID(); + + if(dataSourceObjectID == null) { + logger.log(Level.SEVERE, String.format("Failed to create timeline event for artifact (%d), artifact data source was null"), artifact.getId()); + return Optional.empty(); + } AbstractFile file = caseDB.getAbstractFileById(fileObjId); boolean hasHashHits = false; -- GitLab