diff --git a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/CreditCardDAO.java b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/CreditCardDAO.java index 6ff5a419d9..94f85897cc 100644 --- a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/CreditCardDAO.java +++ b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/CreditCardDAO.java @@ -20,17 +20,30 @@ package org.sleuthkit.autopsy.mainui.datamodel; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.collect.Range; import java.beans.PropertyChangeEvent; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.CreditCards; +import org.sleuthkit.autopsy.datamodel.accounts.Accounts; +import org.sleuthkit.autopsy.datamodel.accounts.BINRange; import org.sleuthkit.autopsy.mainui.datamodel.events.CommAccountsEvent; import org.sleuthkit.autopsy.mainui.datamodel.events.DAOEvent; import org.sleuthkit.autopsy.mainui.datamodel.events.TreeCounts; import org.sleuthkit.autopsy.mainui.datamodel.events.TreeEvent; +import org.sleuthkit.datamodel.Account; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskData; /** * DAO for fetching credit card information. @@ -60,11 +73,46 @@ public class CreditCardDAO extends AbstractDAO { } public SearchResultsDTO getCreditCardByFile(CreditCardFileSearchParams searchParams) { - +// String query +// = "SELECT blackboard_artifacts.artifact_obj_id " //NON-NLS +// + " FROM blackboard_artifacts " //NON-NLS +// + " JOIN blackboard_attributes ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_id " //NON-NLS +// + " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.Type.TSK_ACCOUNT.getTypeID() //NON-NLS +// + " AND blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER.getTypeID() //NON-NLS +// + " AND blackboard_attributes.value_text >= '" + bin.getBINStart() + "' AND blackboard_attributes.value_text < '" + (bin.getBINEnd() + 1) + "'" //NON-NLS +// + getFilterByDataSourceClause() +// + getRejectedArtifactFilterClause() +// + " ORDER BY blackboard_attributes.value_text"; //NON-NLS +// try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query); +// ResultSet rs = results.getResultSet();) { +// while (rs.next()) { +// list.add(skCase.getBlackboard().getDataArtifactById(rs.getLong("artifact_obj_id"))); //NON-NLS +// } +// } catch (TskCoreException | SQLException ex) { +// LOGGER.log(Level.SEVERE, "Error querying for account artifacts.", ex); //NON-NLS +// +// } } private SearchResultsDTO fetchCreditCardByFile(CreditCardFileSearchParams searchParams) { - +// String query +// = "SELECT count(blackboard_artifacts.artifact_id ) AS count" //NON-NLS +// + " FROM blackboard_artifacts " //NON-NLS +// + " JOIN blackboard_attributes ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_id " //NON-NLS +// + " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.Type.TSK_ACCOUNT.getTypeID() //NON-NLS +// + " AND blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER.getTypeID() //NON-NLS +// + " 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); +// ResultSet resultSet = results.getResultSet();) { +// while (resultSet.next()) { +// setDisplayName(getBinRangeString(bin) + " (" + resultSet.getLong("count") + ")"); //NON-NLS +// } +// } catch (TskCoreException | SQLException ex) { +// LOGGER.log(Level.SEVERE, "Error querying for account artifacts.", ex); //NON-NLS +// +// } } public SearchResultsDTO getCreditCardByBin(CreditCardBinSearchParams searchParams) { @@ -72,15 +120,88 @@ public class CreditCardDAO extends AbstractDAO { } public SearchResultsDTO fetchCreditCardByBin(CreditCardBinSearchParams searchParams) { - + } public TreeResultsDTO getCreditCardBinCounts(Long dataSourceId) { - +// String query +// = "SELECT blackboard_artifacts.obj_id," //NON-NLS +// + " solr_attribute.value_text AS solr_document_id, "; //NON-NLS +// if (skCase.getDatabaseType().equals(TskData.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()) { +// list.add(new Accounts.FileWithCCN( +// resultSet.getLong("obj_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 +// +// } +// return true; } public TreeResultsDTO getCreditCardFileCounts(Long dataSourceId) { - +// +// String query +// = "SELECT SUBSTR(blackboard_attributes.value_text,1,8) AS BIN, " //NON-NLS +// + " COUNT(blackboard_artifacts.artifact_id) AS count " //NON-NLS +// + " FROM blackboard_artifacts " //NON-NLS +// + " JOIN blackboard_attributes ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_id" //NON-NLS +// + " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.Type.TSK_ACCOUNT.getTypeID() //NON-NLS +// + " AND blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER.getTypeID() //NON-NLS +// + getFilterByDataSourceClause() +// + getRejectedArtifactFilterClause() +// + " GROUP BY BIN " //NON-NLS +// + " ORDER BY BIN "; //NON-NLS +// try (SleuthkitCase.CaseDbQuery results = skCase.executeQuery(query); +// ResultSet resultSet = results.getResultSet();) { +// //sort all te individual bins in to the ranges +// while (resultSet.next()) { +// final Integer bin = Integer.valueOf(resultSet.getString("BIN")); +// long count = resultSet.getLong("count"); +// +// BINRange binRange = (BINRange) CreditCards.getBINInfo(bin); +// Accounts.BinResult previousResult = binRanges.get(bin); +// +// if (previousResult != null) { +// binRanges.remove(Range.closed(previousResult.getBINStart(), previousResult.getBINEnd())); +// count += previousResult.getCount(); +// } +// +// if (binRange == null) { +// binRanges.put(Range.closed(bin, bin), new Accounts.BinResult(count, bin, bin)); +// } else { +// binRanges.put(Range.closed(binRange.getBINstart(), binRange.getBINend()), new Accounts.BinResult(count, binRange)); +// } +// } +// binRanges.asMapOfRanges().values().forEach(list::add); +// } catch (TskCoreException | SQLException ex) { +// LOGGER.log(Level.SEVERE, "Error querying for BINs.", ex); //NON-NLS +// } + } // is account invalidating