diff --git a/bindings/java/src/org/sleuthkit/datamodel/OsAccountManager.java b/bindings/java/src/org/sleuthkit/datamodel/OsAccountManager.java index 2ad57d7023bceb23177617ac178ae16e622e7547..0f6a64ee9a5498d1bc386faacb2f54fc53b0cbfb 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/OsAccountManager.java +++ b/bindings/java/src/org/sleuthkit/datamodel/OsAccountManager.java @@ -958,7 +958,8 @@ private void mergeOsAccounts(OsAccount sourceAccount, OsAccount destAccount, Cas s.executeUpdate(query); - // TBD: We need to emit another event which tells CT that two accounts are being merged so it can updates other dedicated tables + // register the merged accounts with the transaction to fire off an event + trans.registerMergedOsAccount(sourceAccount.getId(), destAccount.getId()); // Update the source account. Make a dummy signature to prevent problems with the unique constraint. String mergedSignature = makeMergedOsAccountSignature(); diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index 7908409645851d09ca00c9242d77b62b8d5f6e17..209f4d6eb1b88fcc1b748df8188ea46ef16dd8db 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -13713,6 +13713,7 @@ public static final class CaseDbTransaction { private List<Host> hostsAdded = new ArrayList<>(); private List<OsAccount> accountsChanged = new ArrayList<>(); private List<OsAccount> accountsAdded = new ArrayList<>(); + private List<TskEvent.MergedAccountsPair> accountsMerged = new ArrayList<>(); private List<Long> deletedOsAccountObjectIds = new ArrayList<>(); private List<Long> deletedResultObjectIds = new ArrayList<>(); @@ -13800,6 +13801,16 @@ void registerAddedOsAccount(OsAccount account) { } } + /** + * Saves an account that has been merged as part of this transaction. + * + * @param sourceOsAccountObjId + * @param destinationOsAccountObjId + */ + void registerMergedOsAccount(long sourceOsAccountObjId, long destinationOsAccountObjId) { + accountsMerged.add(new TskEvent.MergedAccountsPair(sourceOsAccountObjId, destinationOsAccountObjId)); + } + /** * Saves an analysis result that has been deleted as a part of this * transaction. @@ -13854,6 +13865,9 @@ public void commit() throws TskCoreException { if (!accountsChanged.isEmpty()) { sleuthkitCase.fireTSKEvent(new TskEvent.OsAccountsUpdatedTskEvent(accountsChanged)); } + if (!accountsMerged.isEmpty()) { + sleuthkitCase.fireTSKEvent(new TskEvent.OsAccountsMergedTskEvent(accountsMerged)); + } if (!deletedOsAccountObjectIds.isEmpty()) { sleuthkitCase.fireTSKEvent(new TskEvent.OsAccountsDeletedTskEvent(deletedOsAccountObjectIds)); } diff --git a/bindings/java/src/org/sleuthkit/datamodel/TskEvent.java b/bindings/java/src/org/sleuthkit/datamodel/TskEvent.java index f02623b931fd5b9aa9ff3c7311a85b4657b683c0..723a7bfff7b4c8ddd686077fa5a25e7ecb35506a 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/TskEvent.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TskEvent.java @@ -306,6 +306,63 @@ public List<Long> getOsAccountObjectIds() { } + /** + * An event published when one or more OS accounts are merged. + */ + public final static class OsAccountsMergedTskEvent extends TskObjectsEvent<MergedAccountsPair> { + + /** + * Constructs an event published when one or more OS accounts are + * merged. + * + * @param mergedAccounts List of the merged OS accounts. + */ + OsAccountsMergedTskEvent(List<MergedAccountsPair> mergedAccounts) { + super(mergedAccounts); + } + + + /** + * Gets the pairs of merged accounts + * + * @return + */ + public List<MergedAccountsPair> getMergedAccountPairs() { + return getDataModelObjects(); + } + + } + + /** + * Container to encapsulate the merged account ids, contains both the source and destination account ids. + */ + public final static class MergedAccountsPair { + + private final Long sourceOsAccountId; + private final Long destinationOsAccountId; + + public MergedAccountsPair(Long sourceOsAccountId, Long destinationOsAccountId) { + this.sourceOsAccountId = sourceOsAccountId; + this.destinationOsAccountId = destinationOsAccountId; + } + + /** + * Gets the source os account id. This is the account that was marked as "MERGED" + * @return The TSK object ID of the source os account + */ + public Long getSourceOsAccountId() { + return sourceOsAccountId; + } + + /** + * Gets the destination os account id. This is the account that the source was merged into. + * @return The TSK object ID of the destination os account + */ + public Long getDestinationOsAccountId() { + return destinationOsAccountId; + } + } + /** * An event published when one or more OS account instances are added. */