Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
TagsManager.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2013-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.casemodule.services;
20 
21 import java.io.Closeable;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.EnumSet;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30 import java.util.logging.Level;
31 import org.openide.util.NbBundle;
36 import org.sleuthkit.datamodel.BlackboardArtifact;
37 import org.sleuthkit.datamodel.BlackboardArtifactTag;
38 import org.sleuthkit.datamodel.CaseDbAccessManager;
39 import org.sleuthkit.datamodel.Content;
40 import org.sleuthkit.datamodel.ContentTag;
41 import org.sleuthkit.datamodel.SleuthkitCase;
42 import org.sleuthkit.datamodel.TagName;
43 import org.sleuthkit.datamodel.TagSet;
44 import org.sleuthkit.datamodel.TaggingManager;
45 import org.sleuthkit.datamodel.TskCoreException;
46 import org.sleuthkit.datamodel.TskData;
47 import org.sleuthkit.datamodel.TskData.DbType;
48 
53 public class TagsManager implements Closeable {
54 
55  private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName());
56  private final SleuthkitCase caseDb;
57 
58  private static String DEFAULT_TAG_SET_NAME = "Project VIC";
59 
60  private static final Object lock = new Object();
61 
62  static {
63 
64  //Create the contentviewer tags table if the current case does not
65  //have the table present
66  Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> {
67  if (evt.getNewValue() != null) {
68  Case currentCase = (Case) evt.getNewValue();
69  try {
70  CaseDbAccessManager caseDb = currentCase.getSleuthkitCase().getCaseDbAccessManager();
71  if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) {
72  return;
73  }
74 
75  if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
77  } else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
78  caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_POSTGRESQL);
79  }
80  } catch (TskCoreException ex) {
81  LOGGER.log(Level.SEVERE,
82  String.format("Unable to create the %s table for image tag storage.",
83  ContentViewerTagManager.TABLE_NAME), ex);
84  }
85  }
86  });
87  }
88 
97  public static boolean containsIllegalCharacters(String tagDisplayName) {
98  return (tagDisplayName.contains("\\")
99  || tagDisplayName.contains(":")
100  || tagDisplayName.contains("*")
101  || tagDisplayName.contains("?")
102  || tagDisplayName.contains("\"")
103  || tagDisplayName.contains("<")
104  || tagDisplayName.contains(">")
105  || tagDisplayName.contains("|")
106  || tagDisplayName.contains(",")
107  || tagDisplayName.contains(";"));
108 
109  }
110 
111  @NbBundle.Messages({"TagsManager.notableTagEnding.text= (Notable)"})
117  public static String getNotableTagLabel() {
118  return Bundle.TagsManager_notableTagEnding_text();
119  }
120 
132  public static Set<String> getTagDisplayNames() throws TskCoreException {
133  Set<String> tagDisplayNames = new HashSet<>();
134  Set<TagNameDefinition> customNames = TagNameDefinition.getTagNameDefinitions();
135  customNames.forEach((tagType) -> {
136  tagDisplayNames.add(tagType.getDisplayName());
137  });
138  try {
140  for (TagName tagName : tagsManager.getAllTagNames()) {
141  tagDisplayNames.add(tagName.getDisplayName());
142  }
143  } catch (NoCurrentCaseException ignored) {
144  /*
145  * No current case, nothing more to add to the set.
146  */
147  }
148  return tagDisplayNames;
149  }
150 
158  public static List<String> getNotableTagDisplayNames() {
159  List<String> tagDisplayNames = new ArrayList<>();
160  for (TagNameDefinition tagDef : TagNameDefinition.getTagNameDefinitions()) {
161  if (tagDef.getKnownStatus() == TskData.FileKnown.BAD) {
162  tagDisplayNames.add(tagDef.getDisplayName());
163  }
164  }
165 
166  try {
168  for (TagName tagName : tagsManager.getAllTagNames()) {
169  if (tagName.getKnownStatus() == TskData.FileKnown.BAD
170  && !tagDisplayNames.contains(tagName.getDisplayName())) {
171  tagDisplayNames.add(tagName.getDisplayName());
172  }
173  }
174  } catch (NoCurrentCaseException ignored) {
175  /*
176  * No current case, nothing more to add to the set.
177  */
178  } catch (TskCoreException ex) {
179  LOGGER.log(Level.SEVERE, "Failed to get list of TagNames from TagsManager.", ex);
180  }
181  return tagDisplayNames;
182  }
183 
189  public static List<String> getStandardTagNames() {
190  List<String> tagList = new ArrayList<>();
191 
192  for (TagNameDefinition tagNameDef : TagNameDefinition.getStandardTagNameDefinitions()) {
193  tagList.add(tagNameDef.getDisplayName());
194  }
195 
196  try {
197  List<TagSet> tagSetList = Case.getCurrentCaseThrows().getSleuthkitCase().getTaggingManager().getTagSets();
198  for (TagSet tagSet : tagSetList) {
199  if (tagSet.getName().equals(DEFAULT_TAG_SET_NAME)) {
200  for (TagName tagName : tagSet.getTagNames()) {
201  tagList.add(tagName.getDisplayName());
202  }
203  }
204  }
205  } catch (NoCurrentCaseException | TskCoreException ex) {
206  LOGGER.log(Level.SEVERE, "Failed to get Project VIC tags from the database.", ex);
207  }
208 
209  return tagList;
210  }
211 
217  public static String getBookmarkTagDisplayName() {
218  return TagNameDefinition.getBookmarkTagDisplayName();
219  }
220 
226  public static String getFollowUpTagDisplayName() {
227  return TagNameDefinition.getFollowUpTagDisplayName();
228  }
229 
235  public static String getNotableTagDisplayName() {
236  return TagNameDefinition.getNotableTagDisplayName();
237  }
238 
246  public static void addTagSetDefinition(TagSetDefinition tagSetDef) throws IOException {
247  synchronized (lock) {
248  TagSetDefinition.writeTagSetDefinition(tagSetDef);
249  }
250  }
251 
258  TagsManager(SleuthkitCase caseDb) {
259  this.caseDb = caseDb;
260 
261  // Add standard tags and the Project VIC default tag set and tags.
262  TaggingManager taggingMgr = caseDb.getTaggingManager();
263  try {
264  List<TagSet> setList = taggingMgr.getTagSets();
265  if (setList.isEmpty()) {
266  for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) {
267  caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus());
268  }
269  //Assume new case and add tag sets
270  for (TagSetDefinition setDef : TagSetDefinition.readTagSetDefinitions()) {
271  List<TagName> tagNameList = new ArrayList<>();
272  for (TagNameDefinition tagNameDef : setDef.getTagNameDefinitions()) {
273  tagNameList.add(caseDb.addOrUpdateTagName(tagNameDef.getDisplayName(), tagNameDef.getDescription(), tagNameDef.getColor(), tagNameDef.getKnownStatus()));
274  }
275 
276  if (!tagNameList.isEmpty()) {
277  taggingMgr.addTagSet(setDef.getName(), tagNameList);
278  }
279  }
280  }
281  } catch (TskCoreException ex) {
282  LOGGER.log(Level.SEVERE, "Error updating standard tag name and tag set definitions", ex);
283  } catch (IOException ex) {
284  LOGGER.log(Level.SEVERE, "Error loading tag set JSON files", ex);
285  }
286 
287  for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
288  tagName.saveToCase(caseDb);
289  }
290  }
291 
299  public List<TagSet> getAllTagSets() throws TskCoreException {
300  return caseDb.getTaggingManager().getTagSets();
301  }
302 
312  public TagSet getTagSet(TagName tagName) throws TskCoreException {
313  return caseDb.getTaggingManager().getTagSet(tagName);
314  }
315 
327  public TagSet addTagSet(String name, List<TagName> tagNameList) throws TskCoreException {
328  return caseDb.getTaggingManager().addTagSet(name, tagNameList);
329  }
330 
338  public List<TagName> getAllTagNames() throws TskCoreException {
339  return caseDb.getAllTagNames();
340  }
341 
350  public List<TagName> getTagNamesInUse() throws TskCoreException {
351  return caseDb.getTagNamesInUse();
352  }
353 
364  public List<TagName> getTagNamesInUseForUser(String userName) throws TskCoreException {
365  Set<TagName> tagNameSet = new HashSet<>();
366  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
367  for (BlackboardArtifactTag tag : artifactTags) {
368  if (tag.getUserName().equals(userName)) {
369  tagNameSet.add(tag.getName());
370  }
371  }
372  List<ContentTag> contentTags = caseDb.getAllContentTags();
373  for (ContentTag tag : contentTags) {
374  if (tag.getUserName().equals(userName)) {
375  tagNameSet.add(tag.getName());
376  }
377  }
378  return new ArrayList<>(tagNameSet);
379  }
380 
393  public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
394  return caseDb.getTagNamesInUse(dsObjId);
395  }
396 
411  public List<TagName> getTagNamesInUseForUser(long dsObjId, String userName) throws TskCoreException {
412  Set<TagName> tagNameSet = new HashSet<>();
413  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
414  for (BlackboardArtifactTag tag : artifactTags) {
415  if (tag.getUserName().equals(userName) && tag.getArtifact().getDataSource().getId() == dsObjId) {
416  tagNameSet.add(tag.getName());
417  }
418  }
419  List<ContentTag> contentTags = caseDb.getAllContentTags();
420  for (ContentTag tag : contentTags) {
421  if (tag.getUserName().equals(userName) && tag.getContent().getDataSource().getId() == dsObjId) {
422  tagNameSet.add(tag.getName());
423  }
424  }
425  return new ArrayList<>(tagNameSet);
426  }
427 
435  public Map<String, TagName> getDisplayNamesToTagNamesMap() throws TskCoreException {
436  Map<String, TagName> tagNames = new HashMap<>();
437  for (TagName tagName : caseDb.getAllTagNames()) {
438  tagNames.put(tagName.getDisplayName(), tagName);
439  }
440  return tagNames;
441  }
442 
457  public TagName addTagName(String displayName) throws TagNameAlreadyExistsException, TskCoreException {
458  return addTagName(displayName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
459  }
460 
476  public TagName addTagName(String displayName, String description) throws TagNameAlreadyExistsException, TskCoreException {
477  return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
478  }
479 
495  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
496  return addTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
497  }
498 
516  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
517  synchronized (lock) {
518  try {
519  TagName tagName = caseDb.addOrUpdateTagName(displayName, description, color, knownStatus);
520  Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
521  customTypes.add(new TagNameDefinition(displayName, description, color, knownStatus));
522  TagNameDefinition.setTagNameDefinitions(customTypes);
523  return tagName;
524  } catch (TskCoreException ex) {
525  List<TagName> existingTagNames = caseDb.getAllTagNames();
526  for (TagName tagName : existingTagNames) {
527  if (tagName.getDisplayName().equals(displayName)) {
528  throw new TagNameAlreadyExistsException();
529  }
530  }
531  throw ex;
532  }
533  }
534  }
535 
549  public ContentTag addContentTag(Content content, TagName tagName) throws TskCoreException {
550  return addContentTag(content, tagName, "", -1, -1);
551  }
552 
567  public ContentTag addContentTag(Content content, TagName tagName, String comment) throws TskCoreException {
568  return addContentTag(content, tagName, comment, -1, -1);
569  }
570 
587  public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
588  TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
589  try {
590  Case currentCase = Case.getCurrentCaseThrows();
591 
592  currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
593 
594  } catch (NoCurrentCaseException ex) {
595  throw new TskCoreException("Added a tag to a closed case", ex);
596  }
597  return tagChange.getAddedTag();
598  }
599 
608  public void deleteContentTag(ContentTag tag) throws TskCoreException {
609  caseDb.deleteContentTag(tag);
610  try {
612  } catch (NoCurrentCaseException ex) {
613  throw new TskCoreException("Deleted a tag from a closed case", ex);
614  }
615  }
616 
625  public List<ContentTag> getAllContentTags() throws TskCoreException {
626  return caseDb.getAllContentTags();
627  }
628 
641  public long getContentTagsCountByTagName(TagName tagName) throws TskCoreException {
642  return caseDb.getContentTagsCountByTagName(tagName);
643  }
644 
659  public long getContentTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
660  long count = 0;
661  List<ContentTag> contentTags = getContentTagsByTagName(tagName);
662  for (ContentTag tag : contentTags) {
663  if (userName.equals(tag.getUserName())) {
664  count++;
665  }
666  }
667  return count;
668  }
669 
685  public long getContentTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
686  return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
687  }
688 
705  public long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
706  long count = 0;
707  List<ContentTag> contentTags = getContentTagsByTagName(tagName, dsObjId);
708  for (ContentTag tag : contentTags) {
709  if (userName.equals(tag.getUserName())) {
710  count++;
711  }
712  }
713  return count;
714  }
715 
726  public ContentTag getContentTagByTagID(long tagId) throws TskCoreException {
727  return caseDb.getContentTagByID(tagId);
728  }
729 
741  public List<ContentTag> getContentTagsByTagName(TagName tagName) throws TskCoreException {
742  return caseDb.getContentTagsByTagName(tagName);
743  }
744 
758  public List<ContentTag> getContentTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
759  return caseDb.getContentTagsByTagName(tagName, dsObjId);
760  }
761 
773  public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreException {
774  return caseDb.getContentTagsByContent(content);
775  }
776 
790  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName) throws TskCoreException {
791  return addBlackboardArtifactTag(artifact, tagName, "");
792  }
793 
808  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException {
809  TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
810  try {
811  Case currentCase = Case.getCurrentCaseThrows();
812  currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
813  } catch (NoCurrentCaseException ex) {
814  throw new TskCoreException("Added a tag to a closed case", ex);
815  }
816  return tagChange.getAddedTag();
817  }
818 
827  public void deleteBlackboardArtifactTag(BlackboardArtifactTag tag) throws TskCoreException {
828  caseDb.deleteBlackboardArtifactTag(tag);
829  try {
831  } catch (NoCurrentCaseException ex) {
832  throw new TskCoreException("Deleted a tag from a closed case", ex);
833  }
834  }
835 
844  public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCoreException {
845  return caseDb.getAllBlackboardArtifactTags();
846  }
847 
860  public long getBlackboardArtifactTagsCountByTagName(TagName tagName) throws TskCoreException {
861  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
862  }
863 
878  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
879  long count = 0;
880  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName);
881  for (BlackboardArtifactTag tag : artifactTags) {
882  if (userName.equals(tag.getUserName())) {
883  count++;
884  }
885  }
886  return count;
887  }
888 
903  public long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
904  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
905  }
906 
923  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
924  long count = 0;
925  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName, dsObjId);
926  for (BlackboardArtifactTag tag : artifactTags) {
927  if (userName.equals(tag.getUserName())) {
928  count++;
929  }
930  }
931  return count;
932  }
933 
944  public BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagId) throws TskCoreException {
945  return caseDb.getBlackboardArtifactTagByID(tagId);
946  }
947 
961  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName) throws TskCoreException {
962  return caseDb.getBlackboardArtifactTagsByTagName(tagName);
963  }
964 
979  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
980  return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
981  }
982 
994  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact) throws TskCoreException {
995  return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
996  }
997 
1001  public static class TagNameAlreadyExistsException extends Exception {
1002 
1003  private static final long serialVersionUID = 1L;
1004  }
1005 
1016  @Deprecated
1017  public boolean tagNameExists(String tagDisplayName) {
1018  try {
1019  Map<String, TagName> tagNames = getDisplayNamesToTagNamesMap();
1020  return tagNames.containsKey(tagDisplayName) && (tagNames.get(tagDisplayName) != null);
1021  } catch (TskCoreException ex) {
1022  LOGGER.log(Level.SEVERE, "Error querying case database for tag names", ex);
1023  return false;
1024  }
1025  }
1026 
1033  @Deprecated
1034  @Override
1035  public void close() throws IOException {
1036  }
1037 
1038 }
void notifyContentTagDeleted(ContentTag deletedTag)
Definition: Case.java:1581
void notifyBlackBoardArtifactTagDeleted(BlackboardArtifactTag deletedTag)
Definition: Case.java:1646
static void addTagSetDefinition(TagSetDefinition tagSetDef)
List< TagName > getTagNamesInUseForUser(String userName)
long getContentTagsCountByTagName(TagName tagName, long dsObjId)
List< ContentTag > getContentTagsByContent(Content content)
BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId)
TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus)
long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName)
TagName addTagName(String displayName, String description)
static boolean containsIllegalCharacters(String tagDisplayName)
List< ContentTag > getContentTagsByTagName(TagName tagName, long dsObjId)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName)
ContentTag addContentTag(Content content, TagName tagName)
void deleteBlackboardArtifactTag(BlackboardArtifactTag tag)
BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagId)
ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset)
List< BlackboardArtifactTag > getAllBlackboardArtifactTags()
TagSet addTagSet(String name, List< TagName > tagNameList)
void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag)
Definition: Case.java:1622
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName)
List< TagName > getTagNamesInUseForUser(long dsObjId, String userName)
long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
TagName addTagName(String displayName, String description, TagName.HTML_COLOR color)
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:491
void notifyContentTagAdded(ContentTag newTag)
Definition: Case.java:1557
List< ContentTag > getContentTagsByTagName(TagName tagName)
long getContentTagsCountByTagNameForUser(TagName tagName, String userName)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName)
ContentTag addContentTag(Content content, TagName tagName, String comment)
BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact)

Copyright © 2012-2020 Basis Technology. Generated on: Mon Jul 6 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.