Autopsy  4.17.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
CorrelationAttributeUtil.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2017-2020 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.centralrepository.datamodel;
20 
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.HashSet;
24 import java.util.List;
25 import java.util.Set;
26 import java.util.logging.Level;
27 import org.openide.util.NbBundle.Messages;
32 import org.sleuthkit.datamodel.AbstractFile;
33 import org.sleuthkit.datamodel.Account;
34 import org.sleuthkit.datamodel.BlackboardArtifact;
35 import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
36 import org.sleuthkit.datamodel.BlackboardAttribute;
37 import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
38 import org.sleuthkit.datamodel.HashUtility;
39 import org.sleuthkit.datamodel.InvalidAccountIDException;
40 import org.sleuthkit.datamodel.TskCoreException;
41 import org.sleuthkit.datamodel.TskData;
42 
48 
49  private static final Logger logger = Logger.getLogger(CorrelationAttributeUtil.class.getName());
50  private static final List<String> domainsToSkip = Arrays.asList("localhost", "127.0.0.1");
51 
52  // artifact ids that specifically have a TSK_DOMAIN attribute that should be handled by CR
53  private static Set<Integer> DOMAIN_ARTIFACT_TYPE_IDS = new HashSet<>(Arrays.asList(
54  ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID(),
55  ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID(),
56  ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID(),
57  ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID(),
58  ARTIFACT_TYPE.TSK_WEB_CACHE.getTypeID()
59  ));
60 
71  @Messages({"CorrelationAttributeUtil.emailaddresses.text=Email Addresses"})
72  private static String getEmailAddressAttrDisplayName() {
73  return Bundle.CorrelationAttributeUtil_emailaddresses_text();
74  }
75 
76  // Defines which artifact types act as the sources for CR data.
77  // Most notably, does not include KEYWORD HIT, CALLLOGS, MESSAGES, CONTACTS
78  // TSK_INTERESTING_ARTIFACT_HIT (See JIRA-6129 for more details on the
79  // interesting artifact hit).
80  // IMPORTANT: This set should be updated for new artifacts types that need to
81  // be inserted into the CR.
82  private static final Set<Integer> SOURCE_TYPES_FOR_CR_INSERT = new HashSet<Integer>() {
83  {
84  addAll(DOMAIN_ARTIFACT_TYPE_IDS);
85 
86  add(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID());
87  add(ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID());
88  add(ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID());
89  add(ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID());
90  add(ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID());
91  add(ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID());
92  add(ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID());
93  add(ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID());
94  add(ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID());
95  }
96  };
97 
111  public static List<CorrelationAttributeInstance> makeCorrAttrsToSave(BlackboardArtifact artifact) {
112  if (SOURCE_TYPES_FOR_CR_INSERT.contains(artifact.getArtifactTypeID())) {
113  // Restrict the correlation attributes to use for saving.
114  // The artifacts which are suitable for saving are a subset of the
115  // artifacts that are suitable for correlating.
116  return makeCorrAttrsForCorrelation(artifact);
117  }
118  // Return an empty collection.
119  return new ArrayList<>();
120  }
121 
146  public static List<CorrelationAttributeInstance> makeCorrAttrsForCorrelation(BlackboardArtifact artifact) {
147  List<CorrelationAttributeInstance> correlationAttrs = new ArrayList<>();
148  try {
149  BlackboardArtifact sourceArtifact = getCorrAttrSourceArtifact(artifact);
150  if (sourceArtifact != null) {
151  int artifactTypeID = sourceArtifact.getArtifactTypeID();
152  if (artifactTypeID == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
153  BlackboardAttribute setNameAttr = sourceArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
154  if (setNameAttr != null && CorrelationAttributeUtil.getEmailAddressAttrDisplayName().equals(setNameAttr.getValueString())) {
155  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD, CorrelationAttributeInstance.EMAIL_TYPE_ID);
156  }
157  } else if (DOMAIN_ARTIFACT_TYPE_IDS.contains(artifactTypeID)) {
158  BlackboardAttribute domainAttr = sourceArtifact.getAttribute(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DOMAIN));
159  if ((domainAttr != null)
160  && !domainsToSkip.contains(domainAttr.getValueString())) {
161  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
162  }
163  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
164  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID, CorrelationAttributeInstance.USBID_TYPE_ID);
165  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
166 
167  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID()) {
168  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SSID, CorrelationAttributeInstance.SSID_TYPE_ID);
169 
170  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID()
171  || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
172  || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID()) {
173  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
174 
175  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID()) {
176  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMEI, CorrelationAttributeInstance.IMEI_TYPE_ID);
177  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
178  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
179 
180  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID()) {
181  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
182  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
183 
184  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID()) {
185  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER, CorrelationAttributeInstance.PHONE_TYPE_ID);
186  makeCorrAttrFromArtifactAttr(correlationAttrs, sourceArtifact, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL, CorrelationAttributeInstance.EMAIL_TYPE_ID);
187 
188  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
189  makeCorrAttrFromAcctArtifact(correlationAttrs, sourceArtifact);
190 
191  } else if (artifactTypeID == ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
192  || artifactTypeID == ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
193  || artifactTypeID == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
194  makeCorrAttrsFromCommunicationArtifacts(correlationAttrs, sourceArtifact);
195  }
196  }
198  logger.log(Level.WARNING, String.format("Error normalizing correlation attribute (%s)", artifact), ex); // NON-NLS
199  return correlationAttrs;
200  } catch (InvalidAccountIDException ex) {
201  logger.log(Level.WARNING, String.format("Invalid account identifier (artifactID: %d)", artifact.getId())); // NON-NLS
202  return correlationAttrs;
203  } catch (CentralRepoException ex) {
204  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", artifact), ex); // NON-NLS
205  return correlationAttrs;
206  } catch (TskCoreException ex) {
207  logger.log(Level.SEVERE, String.format("Error getting querying case database (%s)", artifact), ex); // NON-NLS
208  return correlationAttrs;
209  } catch (NoCurrentCaseException ex) {
210  logger.log(Level.SEVERE, "Error getting current case", ex); // NON-NLS
211  return correlationAttrs;
212  }
213  return correlationAttrs;
214  }
215 
229  private static void makeCorrAttrsFromCommunicationArtifacts(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact artifact) throws TskCoreException, CentralRepoException, CorrelationAttributeNormalizationException {
230  CorrelationAttributeInstance corrAttr = null;
231 
232  /*
233  * Extract the phone number from the artifact attribute.
234  */
235  String value = null;
236  if (null != artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))) {
237  value = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)).getValueString();
238  } else if (null != artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))) {
239  value = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)).getValueString();
240  } else if (null != artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))) {
241  value = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)).getValueString();
242  }
243 
244  /*
245  * Normalize the phone number.
246  */
247  if (value != null
248  && CorrelationAttributeNormalizer.isValidPhoneNumber(value)) {
249 
250  value = CorrelationAttributeNormalizer.normalizePhone(value);
252  if (corrAttr != null) {
253  corrAttrInstances.add(corrAttr);
254  }
255  }
256  }
257 
271  private static BlackboardArtifact getCorrAttrSourceArtifact(BlackboardArtifact artifact) throws NoCurrentCaseException, TskCoreException {
272  BlackboardArtifact sourceArtifact = null;
273  if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifact.getArtifactTypeID()) {
274  BlackboardAttribute assocArtifactAttr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
275  if (assocArtifactAttr != null) {
276  sourceArtifact = Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboardArtifact(assocArtifactAttr.getValueLong());
277  }
278  } else {
279  sourceArtifact = artifact;
280  }
281  return sourceArtifact;
282  }
283 
297  private static void makeCorrAttrFromAcctArtifact(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact acctArtifact) throws InvalidAccountIDException, TskCoreException, CentralRepoException {
298 
299  // Get the account type from the artifact
300  BlackboardAttribute accountTypeAttribute = acctArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
301  String accountTypeStr = accountTypeAttribute.getValueString();
302 
303  // @@TODO Vik-6136: CR currently does not know of custom account types.
304  // Ensure there is a predefined account type for this account.
305  Account.Type predefinedAccountType = Account.Type.PREDEFINED_ACCOUNT_TYPES.stream().filter(type -> type.getTypeName().equalsIgnoreCase(accountTypeStr)).findAny().orElse(null);
306 
307  // do not create any correlation attribute instance for a Device account
308  if (Account.Type.DEVICE.getTypeName().equalsIgnoreCase(accountTypeStr) == false && predefinedAccountType != null) {
309 
310  // Get the corresponding CentralRepoAccountType from the database.
312 
313  int corrTypeId = crAccountType.getCorrelationTypeId();
315 
316  // Get the account identifier
317  BlackboardAttribute accountIdAttribute = acctArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ID));
318  String accountIdStr = accountIdAttribute.getValueString();
319 
320  // add/get the account and get its accountId.
321  CentralRepoAccount crAccount = CentralRepository.getInstance().getOrCreateAccount(crAccountType, accountIdStr);
322 
323  CorrelationAttributeInstance corrAttr = makeCorrAttr(acctArtifact, corrType, accountIdStr);
324  if (corrAttr != null) {
325  // set the account_id in correlation attribute
326  corrAttr.setAccountId(crAccount.getId());
327  corrAttrInstances.add(corrAttr);
328  }
329  }
330  }
331 
346  private static void makeCorrAttrFromArtifactAttr(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType, int typeId) throws CentralRepoException, TskCoreException {
347  BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(artAttrType));
348  if (attribute != null) {
349  String value = attribute.getValueString();
350  if ((null != value) && (value.isEmpty() == false)) {
352  if (inst != null) {
353  corrAttrInstances.add(inst);
354  }
355  }
356  }
357  }
358 
376  private static CorrelationAttributeInstance makeCorrAttr(BlackboardArtifact artifact, CorrelationAttributeInstance.Type correlationType, String value) {
377  try {
378  Case currentCase = Case.getCurrentCaseThrows();
379  AbstractFile bbSourceFile = currentCase.getSleuthkitCase().getAbstractFileById(artifact.getObjectID());
380  if (null == bbSourceFile) {
381  logger.log(Level.SEVERE, "Error creating artifact instance. Abstract File was null."); // NON-NLS
382  return null;
383  }
384 
386  return new CorrelationAttributeInstance(
387  correlationType,
388  value,
389  correlationCase,
390  CorrelationDataSource.fromTSKDataSource(correlationCase, bbSourceFile.getDataSource()),
391  bbSourceFile.getParentPath() + bbSourceFile.getName(),
392  "",
393  TskData.FileKnown.UNKNOWN,
394  bbSourceFile.getId());
395 
396  } catch (TskCoreException ex) {
397  logger.log(Level.SEVERE, String.format("Error getting querying case database (%s)", artifact), ex); // NON-NLS
398  return null;
399  } catch (CentralRepoException ex) {
400  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", artifact), ex); // NON-NLS
401  return null;
403  logger.log(Level.WARNING, String.format("Error creating correlation attribute instance (%s)", artifact), ex); // NON-NLS
404  return null;
405  } catch (NoCurrentCaseException ex) {
406  logger.log(Level.SEVERE, "Error getting current case", ex); // NON-NLS
407  return null;
408  }
409  }
410 
427  public static CorrelationAttributeInstance getCorrAttrForFile(AbstractFile file) {
428 
429  if (!isSupportedAbstractFileType(file)) {
430  return null;
431  }
432 
434  CorrelationCase correlationCase;
435  CorrelationDataSource correlationDataSource;
436 
437  try {
440  if (null == correlationCase) {
441  //if the correlationCase is not in the Central repo then attributes generated in relation to it will not be
442  return null;
443  }
444  correlationDataSource = CorrelationDataSource.fromTSKDataSource(correlationCase, file.getDataSource());
445  } catch (TskCoreException ex) {
446  logger.log(Level.SEVERE, String.format("Error getting querying case database (%s)", file), ex); // NON-NLS
447  return null;
448  } catch (CentralRepoException ex) {
449  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", file), ex); // NON-NLS
450  return null;
451  } catch (NoCurrentCaseException ex) {
452  logger.log(Level.SEVERE, "Error getting current case", ex); // NON-NLS
453  return null;
454  }
455 
456  CorrelationAttributeInstance correlationAttributeInstance;
457  try {
458  correlationAttributeInstance = CentralRepository.getInstance().getCorrelationAttributeInstance(type, correlationCase, correlationDataSource, file.getId());
459  } catch (CentralRepoException ex) {
460  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", file), ex); // NON-NLS
461  return null;
463  logger.log(Level.WARNING, String.format("Error creating correlation attribute instance (%s)", file), ex); // NON-NLS
464  return null;
465  }
466 
467  /*
468  * If no correlation attribute instance was found when querying by file
469  * object ID, try searching by file path instead. This is necessary
470  * because file object IDs were not stored in the central repository in
471  * early versions of its schema.
472  */
473  if (correlationAttributeInstance == null && file.getMd5Hash() != null) {
474  String filePath = (file.getParentPath() + file.getName()).toLowerCase();
475  try {
476  correlationAttributeInstance = CentralRepository.getInstance().getCorrelationAttributeInstance(type, correlationCase, correlationDataSource, file.getMd5Hash(), filePath);
477  } catch (CentralRepoException ex) {
478  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", file), ex); // NON-NLS
479  return null;
481  logger.log(Level.WARNING, String.format("Error creating correlation attribute instance (%s)", file), ex); // NON-NLS
482  return null;
483  }
484  }
485 
486  return correlationAttributeInstance;
487  }
488 
507  public static CorrelationAttributeInstance makeCorrAttrFromFile(AbstractFile file) {
508 
509  if (!isSupportedAbstractFileType(file)) {
510  return null;
511  }
512 
513  // We need a hash to make the correlation artifact instance.
514  String md5 = file.getMd5Hash();
515  if (md5 == null || md5.isEmpty() || HashUtility.isNoDataMd5(md5)) {
516  return null;
517  }
518 
519  try {
521 
523  return new CorrelationAttributeInstance(
524  filesType,
525  file.getMd5Hash(),
526  correlationCase,
527  CorrelationDataSource.fromTSKDataSource(correlationCase, file.getDataSource()),
528  file.getParentPath() + file.getName(),
529  "",
530  TskData.FileKnown.UNKNOWN,
531  file.getId());
532 
533  } catch (TskCoreException ex) {
534  logger.log(Level.SEVERE, String.format("Error querying case database (%s)", file), ex); // NON-NLS
535  return null;
536  } catch (CentralRepoException ex) {
537  logger.log(Level.SEVERE, String.format("Error querying central repository (%s)", file), ex); // NON-NLS
538  return null;
540  logger.log(Level.WARNING, String.format("Error creating correlation attribute instance (%s)", file), ex); // NON-NLS
541  return null;
542  } catch (NoCurrentCaseException ex) {
543  logger.log(Level.SEVERE, "Error getting current case", ex); // NON-NLS
544  return null;
545  }
546  }
547 
556  public static boolean isSupportedAbstractFileType(AbstractFile file) {
557  if (file == null) {
558  return false;
559  }
560  switch (file.getType()) {
561  case UNALLOC_BLOCKS:
562  case UNUSED_BLOCKS:
563  case SLACK:
564  case VIRTUAL_DIR:
565  case LOCAL_DIR:
566  return false;
567  case CARVED:
568  case DERIVED:
569  case LOCAL:
570  case LAYOUT_FILE:
571  return true;
572  case FS:
573  return file.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC);
574  default:
575  logger.log(Level.WARNING, "Unexpected file type {0}", file.getType().getName());
576  return false;
577  }
578  }
579 
584  }
585 
586 }
static CorrelationAttributeInstance makeCorrAttr(BlackboardArtifact artifact, CorrelationAttributeInstance.Type correlationType, String value)
static CorrelationDataSource fromTSKDataSource(CorrelationCase correlationCase, Content dataSource)
static CorrelationAttributeInstance makeCorrAttrFromFile(AbstractFile file)
static List< CorrelationAttributeInstance > makeCorrAttrsForCorrelation(BlackboardArtifact artifact)
static void makeCorrAttrsFromCommunicationArtifacts(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact)
static CorrelationAttributeInstance getCorrAttrForFile(AbstractFile file)
static void makeCorrAttrFromArtifactAttr(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType, int typeId)
CorrelationAttributeInstance getCorrelationAttributeInstance(CorrelationAttributeInstance.Type type, CorrelationCase correlationCase, CorrelationDataSource correlationDataSource, String value, String filePath)
static BlackboardArtifact getCorrAttrSourceArtifact(BlackboardArtifact artifact)
static List< CorrelationAttributeInstance > makeCorrAttrsToSave(BlackboardArtifact artifact)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static void makeCorrAttrFromAcctArtifact(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact acctArtifact)
CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId)
CentralRepoAccountType getAccountTypeByName(String accountTypeName)
CentralRepoAccount getOrCreateAccount(CentralRepoAccount.CentralRepoAccountType crAccountType, String accountUniqueID)

Copyright © 2012-2021 Basis Technology. Generated on: Tue Jan 19 2021
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.