1
0
mirror of https://github.com/elisspace/autopsy.git synced 2026-08-29 15:43:50 +00:00

Merge pull request #7559 from gdicristofaro/8301-accountsNPE

8301 accounts NPE fix
This commit is contained in:
eugene7646
2022-03-09 12:10:37 -05:00
committed by GitHub
2 changed files with 74 additions and 101 deletions

View File

@@ -248,7 +248,7 @@ public class Artifacts {
return new TypeNodeKey(emailNode, TSK_EMAIL_MSG);
} else if (TSK_ACCOUNT.getTypeID() == typeId) {
Accounts.AccountsRootNode accountsNode = new Accounts(skCase, dsObjId).new AccountsRootNode();
Accounts.AccountsRootNode accountsNode = new Accounts(dsObjId).new AccountsRootNode();
return new TypeNodeKey(accountsNode, TSK_ACCOUNT);
} else if (TSK_KEYWORD_HIT.getTypeID() == typeId) {

View File

@@ -103,7 +103,6 @@ final public class Accounts implements AutopsyVisitableItem {
@NbBundle.Messages("AccountsRootNode.name=Accounts") //used for the viewArtifact navigation
final public static String NAME = Bundle.AccountsRootNode_name();
private SleuthkitCase skCase;
private final long filteringDSObjId; // 0 if not filtering/grouping by data source
private final EventBus reviewStatusBus = new EventBus("ReviewStatusBus");
@@ -124,8 +123,8 @@ final public class Accounts implements AutopsyVisitableItem {
*
* @param skCase The SleuthkitCase object to use for db queries.
*/
public Accounts(SleuthkitCase skCase) {
this(skCase, 0);
public Accounts() {
this(0);
}
/**
@@ -134,8 +133,7 @@ final public class Accounts implements AutopsyVisitableItem {
* @param skCase The SleuthkitCase object to use for db queries.
* @param objId Object id of the data source
*/
public Accounts(SleuthkitCase skCase, long objId) {
this.skCase = skCase;
public Accounts(long objId) {
this.filteringDSObjId = objId;
this.rejectActionInstance = new RejectAccounts();
@@ -281,14 +279,14 @@ final public class Accounts implements AutopsyVisitableItem {
+ " GROUP BY blackboard_artifacts.artifact_id\n"
+ ") res\n";
try (SleuthkitCase.CaseDbQuery executeQuery = skCase.executeQuery(accountTypesInUseQuery);
try (SleuthkitCase.CaseDbQuery executeQuery = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(accountTypesInUseQuery);
ResultSet resultSet = executeQuery.getResultSet()) {
if (resultSet.next()) {
return resultSet.getLong("count");
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for count of all account types", ex);
}
@@ -349,7 +347,7 @@ final public class Accounts implements AutopsyVisitableItem {
+ ") res\n"
+ "GROUP BY res.account_type";
try (SleuthkitCase.CaseDbQuery executeQuery = skCase.executeQuery(accountTypesInUseQuery);
try (SleuthkitCase.CaseDbQuery executeQuery = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(accountTypesInUseQuery);
ResultSet resultSet = executeQuery.getResultSet()) {
counts.clear();
@@ -358,7 +356,7 @@ final public class Accounts implements AutopsyVisitableItem {
Long count = resultSet.getLong("count");
counts.put(accountType, count);
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for account_types", ex);
}
}
@@ -416,12 +414,6 @@ final public class Accounts implements AutopsyVisitableItem {
} catch (NoCurrentCaseException notUsed) {
// Case is closed, do nothing.
}
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
// case was closed. Remove listeners so that we don't get called with a stale case handle
if (evt.getNewValue() == null) {
removeNotify();
skCase = null;
}
}
}
};
@@ -467,7 +459,7 @@ final public class Accounts implements AutopsyVisitableItem {
} else {
try {
Account.Type accountType = skCase.getCommunicationsManager().getAccountType(accountTypeName);
Account.Type accountType = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager().getAccountType(accountTypeName);
if (accountType != null) {
return getNodeArr(new DefaultAccountTypeNode(accountType));
} else {
@@ -476,7 +468,7 @@ final public class Accounts implements AutopsyVisitableItem {
+ "Account type names must match an entry in the display_name column of the account_types table.\n"
+ "Accounts should be created using the CommunicationManager API.");
}
} catch (TskCoreException ex) {
} catch (TskCoreException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error getting display name for account type. ", ex);
}
@@ -553,12 +545,6 @@ final public class Accounts implements AutopsyVisitableItem {
} catch (NoCurrentCaseException notUsed) {
// Case is closed, do nothing.
}
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
// case was closed. Remove listeners so that we don't get called with a stale case handle
if (evt.getNewValue() == null) {
removeNotify();
skCase = null;
}
}
}
};
@@ -591,14 +577,14 @@ final public class Accounts implements AutopsyVisitableItem {
+ " AND blackboard_attributes.value_text = '" + accountType.getTypeName() + "'" //NON-NLS
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause(); //NON-NLS
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet rs = results.getResultSet();) {
List<Long> tempList = new ArrayList<>();
while (rs.next()) {
tempList.add(rs.getLong("artifact_obj_id")); // NON-NLS
}
list.addAll(tempList);
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for account artifacts.", ex); //NON-NLS
}
@@ -608,8 +594,8 @@ final public class Accounts implements AutopsyVisitableItem {
@Override
protected Node[] createNodesForKey(Long t) {
try {
return new Node[]{new BlackboardArtifactNode(skCase.getBlackboard().getDataArtifactById(t))};
} catch (TskCoreException ex) {
return new Node[]{new BlackboardArtifactNode(Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard().getDataArtifactById(t))};
} catch (TskCoreException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error get black board artifact with id " + t, ex);
return new Node[0];
}
@@ -731,12 +717,6 @@ final public class Accounts implements AutopsyVisitableItem {
} catch (NoCurrentCaseException notUsed) {
// Case is closed, do nothing.
}
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
// case was closed. Remove listeners so that we don't get called with a stale case handle
if (evt.getNewValue() == null) {
removeNotify();
skCase = null;
}
}
}
};
@@ -888,12 +868,6 @@ final public class Accounts implements AutopsyVisitableItem {
} catch (NoCurrentCaseException notUsed) {
// Case is closed, do nothing.
}
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
// case was closed. Remove listeners so that we don't get called with a stale case handle
if (evt.getNewValue() == null) {
removeNotify();
skCase = null;
}
}
}
};
@@ -930,46 +904,50 @@ final public class Accounts implements AutopsyVisitableItem {
@Override
protected boolean createKeys(List<FileWithCCN> list) {
String query
= "SELECT blackboard_artifacts.obj_id," //NON-NLS
+ " solr_attribute.value_text AS solr_document_id, "; //NON-NLS
if (skCase.getDatabaseType().equals(DbType.POSTGRESQL)) {
query += " string_agg(blackboard_artifacts.artifact_id::character varying, ',') AS artifact_IDs, " //NON-NLS
+ " string_agg(blackboard_artifacts.review_status_id::character varying, ',') AS review_status_ids, ";
} else {
query += " GROUP_CONCAT(blackboard_artifacts.artifact_id) AS artifact_IDs, " //NON-NLS
+ " GROUP_CONCAT(blackboard_artifacts.review_status_id) AS review_status_ids, ";
}
query += " COUNT( blackboard_artifacts.artifact_id) AS hits " //NON-NLS
+ " FROM blackboard_artifacts " //NON-NLS
+ " LEFT JOIN blackboard_attributes as solr_attribute ON blackboard_artifacts.artifact_id = solr_attribute.artifact_id " //NON-NLS
+ " AND solr_attribute.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID.getTypeID() //NON-NLS
+ " LEFT JOIN blackboard_attributes as account_type ON blackboard_artifacts.artifact_id = account_type.artifact_id " //NON-NLS
+ " AND account_type.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE.getTypeID() //NON-NLS
+ " AND account_type.value_text = '" + Account.Type.CREDIT_CARD.getTypeName() + "'" //NON-NLS
+ " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.Type.TSK_ACCOUNT.getTypeID() //NON-NLS
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause()
+ " GROUP BY blackboard_artifacts.obj_id, solr_document_id " //NON-NLS
+ " ORDER BY hits DESC "; //NON-NLS
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
while (resultSet.next()) {
long file_id = resultSet.getLong("obj_id");
AbstractFile abstractFileById = skCase.getAbstractFileById(file_id);
if(abstractFileById != null) {
list.add(new FileWithCCN(
abstractFileById,
file_id, //NON-NLS
resultSet.getString("solr_document_id"), //NON-NLS
unGroupConcat(resultSet.getString("artifact_IDs"), Long::valueOf), //NON-NLS
resultSet.getLong("hits"), //NON-NLS
new HashSet<>(unGroupConcat(resultSet.getString("review_status_ids"), reviewStatusID -> BlackboardArtifact.ReviewStatus.withID(Integer.valueOf(reviewStatusID)))))); //NON-NLS
}
try {
String query
= "SELECT blackboard_artifacts.obj_id," //NON-NLS
+ " solr_attribute.value_text AS solr_document_id, "; //NON-NLS
if (Case.getCurrentCaseThrows().getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
query += " string_agg(blackboard_artifacts.artifact_id::character varying, ',') AS artifact_IDs, " //NON-NLS
+ " string_agg(blackboard_artifacts.review_status_id::character varying, ',') AS review_status_ids, ";
} else {
query += " GROUP_CONCAT(blackboard_artifacts.artifact_id) AS artifact_IDs, " //NON-NLS
+ " GROUP_CONCAT(blackboard_artifacts.review_status_id) AS review_status_ids, ";
}
} catch (TskCoreException | SQLException ex) {
LOGGER.log(Level.SEVERE, "Error querying for files with ccn hits.", ex); //NON-NLS
query += " COUNT( blackboard_artifacts.artifact_id) AS hits " //NON-NLS
+ " FROM blackboard_artifacts " //NON-NLS
+ " LEFT JOIN blackboard_attributes as solr_attribute ON blackboard_artifacts.artifact_id = solr_attribute.artifact_id " //NON-NLS
+ " AND solr_attribute.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID.getTypeID() //NON-NLS
+ " LEFT JOIN blackboard_attributes as account_type ON blackboard_artifacts.artifact_id = account_type.artifact_id " //NON-NLS
+ " AND account_type.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE.getTypeID() //NON-NLS
+ " AND account_type.value_text = '" + Account.Type.CREDIT_CARD.getTypeName() + "'" //NON-NLS
+ " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.Type.TSK_ACCOUNT.getTypeID() //NON-NLS
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause()
+ " GROUP BY blackboard_artifacts.obj_id, solr_document_id " //NON-NLS
+ " ORDER BY hits DESC "; //NON-NLS
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
while (resultSet.next()) {
long file_id = resultSet.getLong("obj_id");
AbstractFile abstractFileById = Case.getCurrentCaseThrows().getSleuthkitCase().getAbstractFileById(file_id);
if (abstractFileById != null) {
list.add(new FileWithCCN(
abstractFileById,
file_id, //NON-NLS
resultSet.getString("solr_document_id"), //NON-NLS
unGroupConcat(resultSet.getString("artifact_IDs"), Long::valueOf), //NON-NLS
resultSet.getLong("hits"), //NON-NLS
new HashSet<>(unGroupConcat(resultSet.getString("review_status_ids"), reviewStatusID -> BlackboardArtifact.ReviewStatus.withID(Integer.valueOf(reviewStatusID)))))); //NON-NLS
}
}
} catch (TskCoreException | SQLException ex) {
LOGGER.log(Level.SEVERE, "Error querying for files with ccn hits.", ex); //NON-NLS
}
} catch (NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error getting case.", ex);
}
return true;
}
@@ -980,12 +958,12 @@ final public class Accounts implements AutopsyVisitableItem {
try {
List<Object> lookupContents = new ArrayList<>();
for (long artId : key.artifactIDs) {
lookupContents.add(skCase.getBlackboardArtifact(artId));
lookupContents.add(Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboardArtifact(artId));
}
AbstractFile abstractFileById = key.getFile();
lookupContents.add(abstractFileById);
return new Node[]{new FileWithCCNNode(key, abstractFileById, lookupContents.toArray())};
} catch (TskCoreException ex) {
} catch (TskCoreException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error getting content for file with ccn hits.", ex); //NON-NLS
return new Node[0];
}
@@ -1025,16 +1003,16 @@ final public class Accounts implements AutopsyVisitableItem {
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause()
+ " GROUP BY blackboard_artifacts.obj_id, solr_attribute.value_text ) AS foo";
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
while (resultSet.next()) {
if (skCase.getDatabaseType().equals(DbType.POSTGRESQL)) {
if (Case.getCurrentCaseThrows().getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
setDisplayName(Bundle.Accounts_ByFileNode_displayName(resultSet.getLong("count")));
} else {
setDisplayName(Bundle.Accounts_ByFileNode_displayName(resultSet.getLong("count(*)")));
}
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for files with ccn hits.", ex); //NON-NLS
}
@@ -1110,11 +1088,6 @@ final public class Accounts implements AutopsyVisitableItem {
} catch (NoCurrentCaseException notUsed) { //NOPMD empy catch clause
// Case is closed, do nothing.
}
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())
&& (evt.getNewValue() == null)) {
// case was closed. Remove listeners so that we don't get called with a stale case handle
removeNotify();
skCase = null;
}
}
};
@@ -1165,7 +1138,7 @@ final public class Accounts implements AutopsyVisitableItem {
+ getRejectedArtifactFilterClause()
+ " GROUP BY BIN " //NON-NLS
+ " ORDER BY BIN "; //NON-NLS
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
//sort all te individual bins in to the ranges
while (resultSet.next()) {
@@ -1187,7 +1160,7 @@ final public class Accounts implements AutopsyVisitableItem {
}
}
binRanges.asMapOfRanges().values().forEach(list::add);
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for BINs.", ex); //NON-NLS
}
@@ -1230,12 +1203,12 @@ final public class Accounts implements AutopsyVisitableItem {
+ " AND blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER.getTypeID() //NON-NLS
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause(); //NON-NLS
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
while (resultSet.next()) {
setDisplayName(Bundle.Accounts_ByBINNode_displayName(resultSet.getLong("BINs")));
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for BINs.", ex); //NON-NLS
}
}
@@ -1375,7 +1348,7 @@ final public class Accounts implements AutopsyVisitableItem {
public Set<BlackboardArtifact.ReviewStatus> getStatuses() {
return Collections.unmodifiableSet(statuses);
}
AbstractFile getFile() {
return file;
}
@@ -1487,8 +1460,8 @@ final public class Accounts implements AutopsyVisitableItem {
Action[] actions = super.getActions(context);
ArrayList<Action> arrayList = new ArrayList<>();
try {
arrayList.addAll(DataModelActionsFactory.getActions(Accounts.this.skCase.getContentById(fileKey.getObjID()), false));
} catch (TskCoreException ex) {
arrayList.addAll(DataModelActionsFactory.getActions(Case.getCurrentCaseThrows().getSleuthkitCase().getContentById(fileKey.getObjID()), false));
} catch (TskCoreException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error gettung content by id", ex);
}
@@ -1533,12 +1506,12 @@ final public class Accounts implements AutopsyVisitableItem {
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause()
+ " ORDER BY blackboard_attributes.value_text"; //NON-NLS
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet rs = results.getResultSet();) {
while (rs.next()) {
list.add(skCase.getBlackboard().getDataArtifactById(rs.getLong("artifact_obj_id"))); //NON-NLS
list.add(Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard().getDataArtifactById(rs.getLong("artifact_obj_id"))); //NON-NLS
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for account artifacts.", ex); //NON-NLS
}
@@ -1596,12 +1569,12 @@ final public class Accounts implements AutopsyVisitableItem {
+ " AND blackboard_attributes.value_text >= '" + bin.getBINStart() + "' AND blackboard_attributes.value_text < '" + (bin.getBINEnd() + 1) + "'" //NON-NLS
+ getFilterByDataSourceClause()
+ getRejectedArtifactFilterClause();
try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query);
try (SleuthkitCase.CaseDbQuery results = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query);
ResultSet resultSet = results.getResultSet();) {
while (resultSet.next()) {
setDisplayName(getBinRangeString(bin) + " (" + resultSet.getLong("count") + ")"); //NON-NLS
}
} catch (TskCoreException | SQLException ex) {
} catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
LOGGER.log(Level.SEVERE, "Error querying for account artifacts.", ex); //NON-NLS
}