Autopsy  4.18.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  // NOTE: This name is also hard coded in Image Gallery and Projet Vic module.
59  // They need to stay in sync
60  private static String PROJECT_VIC_TAG_SET_NAME = "Project VIC";
61 
62  private static final Object lock = new Object();
63 
64  static {
65 
66  //Create the contentviewer tags table if the current case does not
67  //have the table present
68  Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> {
69  if (evt.getNewValue() != null) {
70  Case currentCase = (Case) evt.getNewValue();
71  try {
72  CaseDbAccessManager caseDb = currentCase.getSleuthkitCase().getCaseDbAccessManager();
73  if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) {
74  return;
75  }
76 
77  if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
79  } else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
80  caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_POSTGRESQL);
81  }
82  } catch (TskCoreException ex) {
83  LOGGER.log(Level.SEVERE,
84  String.format("Unable to create the %s table for image tag storage.",
85  ContentViewerTagManager.TABLE_NAME), ex);
86  }
87  }
88  });
89  }
90 
99  public static boolean containsIllegalCharacters(String tagDisplayName) {
100  return (tagDisplayName.contains("\\")
101  || tagDisplayName.contains(":")
102  || tagDisplayName.contains("*")
103  || tagDisplayName.contains("?")
104  || tagDisplayName.contains("\"")
105  || tagDisplayName.contains("<")
106  || tagDisplayName.contains(">")
107  || tagDisplayName.contains("|")
108  || tagDisplayName.contains(",")
109  || tagDisplayName.contains(";"));
110 
111  }
112 
113  @NbBundle.Messages({"TagsManager.notableTagEnding.text= (Notable)"})
119  public static String getNotableTagLabel() {
120  return Bundle.TagsManager_notableTagEnding_text();
121  }
122 
134  public static Set<String> getTagDisplayNames() throws TskCoreException {
135  Set<String> tagDisplayNames = new HashSet<>();
136  Set<TagNameDefinition> customNames = TagNameDefinition.getTagNameDefinitions();
137  customNames.forEach((tagType) -> {
138  tagDisplayNames.add(tagType.getDisplayName());
139  });
140  try {
142  for (TagName tagName : tagsManager.getAllTagNames()) {
143  tagDisplayNames.add(tagName.getDisplayName());
144  }
145  } catch (NoCurrentCaseException ignored) {
146  /*
147  * No current case, nothing more to add to the set.
148  */
149  }
150  return tagDisplayNames;
151  }
152 
160  public static List<String> getNotableTagDisplayNames() {
161  List<String> tagDisplayNames = new ArrayList<>();
162  for (TagNameDefinition tagDef : TagNameDefinition.getTagNameDefinitions()) {
163  if (tagDef.getKnownStatus() == TskData.FileKnown.BAD) {
164  tagDisplayNames.add(tagDef.getDisplayName());
165  }
166  }
167 
168  try {
170  for (TagName tagName : tagsManager.getAllTagNames()) {
171  if (tagName.getKnownStatus() == TskData.FileKnown.BAD
172  && !tagDisplayNames.contains(tagName.getDisplayName())) {
173  tagDisplayNames.add(tagName.getDisplayName());
174  }
175  }
176  } catch (NoCurrentCaseException ignored) {
177  /*
178  * No current case, nothing more to add to the set.
179  */
180  } catch (TskCoreException ex) {
181  LOGGER.log(Level.SEVERE, "Failed to get list of TagNames from TagsManager.", ex);
182  }
183  return tagDisplayNames;
184  }
185 
191  public static List<String> getStandardTagNames() {
192  List<String> tagList = new ArrayList<>();
193 
194  for (TagNameDefinition tagNameDef : TagNameDefinition.getStandardTagNameDefinitions()) {
195  tagList.add(tagNameDef.getDisplayName());
196  }
197 
198  try {
199  List<TagSet> tagSetList = Case.getCurrentCaseThrows().getSleuthkitCase().getTaggingManager().getTagSets();
200  for (TagSet tagSet : tagSetList) {
201  if (tagSet.getName().equals(PROJECT_VIC_TAG_SET_NAME)) {
202  for (TagName tagName : tagSet.getTagNames()) {
203  tagList.add(tagName.getDisplayName());
204  }
205  }
206  }
207  } catch (NoCurrentCaseException | TskCoreException ex) {
208  LOGGER.log(Level.SEVERE, "Failed to get Project VIC tags from the database.", ex);
209  }
210 
211  return tagList;
212  }
213 
219  public static String getBookmarkTagDisplayName() {
220  return TagNameDefinition.getBookmarkTagDisplayName();
221  }
222 
228  public static String getFollowUpTagDisplayName() {
229  return TagNameDefinition.getFollowUpTagDisplayName();
230  }
231 
237  public static String getNotableTagDisplayName() {
238  return TagNameDefinition.getNotableTagDisplayName();
239  }
240 
248  public static void addTagSetDefinition(TagSetDefinition tagSetDef) throws IOException {
249  synchronized (lock) {
250  TagSetDefinition.writeTagSetDefinition(tagSetDef);
251  }
252  }
253 
260  TagsManager(SleuthkitCase caseDb) {
261  this.caseDb = caseDb;
262 
263  // Add standard tags and any configured tag sets.
264  TaggingManager taggingMgr = caseDb.getTaggingManager();
265  try {
266  List<TagSet> tagSetsInCase = taggingMgr.getTagSets();
267  if (tagSetsInCase.isEmpty()) {
268 
269  // add the standard tag names
270  for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) {
271  caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus());
272  }
273 
274  //Assume new case and add all tag sets
275  for (TagSetDefinition setDef : TagSetDefinition.readTagSetDefinitions()) {
276  List<TagName> tagNamesInSet = new ArrayList<>();
277  for (TagNameDefinition tagNameDef : setDef.getTagNameDefinitions()) {
278  tagNamesInSet.add(caseDb.addOrUpdateTagName(tagNameDef.getDisplayName(), tagNameDef.getDescription(), tagNameDef.getColor(), tagNameDef.getKnownStatus()));
279  }
280 
281  if (!tagNamesInSet.isEmpty()) {
282  taggingMgr.addTagSet(setDef.getName(), tagNamesInSet);
283  }
284  }
285  }
286  } catch (TskCoreException ex) {
287  LOGGER.log(Level.SEVERE, "Error updating standard tag name and tag set definitions", ex);
288  } catch (IOException ex) {
289  LOGGER.log(Level.SEVERE, "Error loading tag set JSON files", ex);
290  }
291 
292  for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
293  tagName.saveToCase(caseDb);
294  }
295  }
296 
304  public List<TagSet> getAllTagSets() throws TskCoreException {
305  return caseDb.getTaggingManager().getTagSets();
306  }
307 
317  public TagSet getTagSet(TagName tagName) throws TskCoreException {
318  return caseDb.getTaggingManager().getTagSet(tagName);
319  }
320 
332  public TagSet addTagSet(String name, List<TagName> tagNameList) throws TskCoreException {
333  return caseDb.getTaggingManager().addTagSet(name, tagNameList);
334  }
335 
343  public List<TagName> getAllTagNames() throws TskCoreException {
344  return caseDb.getAllTagNames();
345  }
346 
355  public List<TagName> getTagNamesInUse() throws TskCoreException {
356  return caseDb.getTagNamesInUse();
357  }
358 
369  public List<TagName> getTagNamesInUseForUser(String userName) throws TskCoreException {
370  Set<TagName> tagNameSet = new HashSet<>();
371  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
372  for (BlackboardArtifactTag tag : artifactTags) {
373  if (tag.getUserName().equals(userName)) {
374  tagNameSet.add(tag.getName());
375  }
376  }
377  List<ContentTag> contentTags = caseDb.getAllContentTags();
378  for (ContentTag tag : contentTags) {
379  if (tag.getUserName().equals(userName)) {
380  tagNameSet.add(tag.getName());
381  }
382  }
383  return new ArrayList<>(tagNameSet);
384  }
385 
398  public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
399  return caseDb.getTagNamesInUse(dsObjId);
400  }
401 
416  public List<TagName> getTagNamesInUseForUser(long dsObjId, String userName) throws TskCoreException {
417  Set<TagName> tagNameSet = new HashSet<>();
418  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
419  for (BlackboardArtifactTag tag : artifactTags) {
420  if (tag.getUserName().equals(userName) && tag.getArtifact().getDataSource().getId() == dsObjId) {
421  tagNameSet.add(tag.getName());
422  }
423  }
424  List<ContentTag> contentTags = caseDb.getAllContentTags();
425  for (ContentTag tag : contentTags) {
426  if (tag.getUserName().equals(userName) && tag.getContent().getDataSource().getId() == dsObjId) {
427  tagNameSet.add(tag.getName());
428  }
429  }
430  return new ArrayList<>(tagNameSet);
431  }
432 
440  public Map<String, TagName> getDisplayNamesToTagNamesMap() throws TskCoreException {
441  Map<String, TagName> tagNames = new HashMap<>();
442  for (TagName tagName : caseDb.getAllTagNames()) {
443  tagNames.put(tagName.getDisplayName(), tagName);
444  }
445  return tagNames;
446  }
447 
462  public TagName addTagName(String displayName) throws TagNameAlreadyExistsException, TskCoreException {
463  return addTagName(displayName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
464  }
465 
481  public TagName addTagName(String displayName, String description) throws TagNameAlreadyExistsException, TskCoreException {
482  return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
483  }
484 
500  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
501  return addTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
502  }
503 
521  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
522  synchronized (lock) {
523  try {
524  TagName tagName = caseDb.addOrUpdateTagName(displayName, description, color, knownStatus);
525  Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
526  customTypes.add(new TagNameDefinition(displayName, description, color, knownStatus));
527  TagNameDefinition.setTagNameDefinitions(customTypes);
528  return tagName;
529  } catch (TskCoreException ex) {
530  List<TagName> existingTagNames = caseDb.getAllTagNames();
531  for (TagName tagName : existingTagNames) {
532  if (tagName.getDisplayName().equals(displayName)) {
533  throw new TagNameAlreadyExistsException();
534  }
535  }
536  throw ex;
537  }
538  }
539  }
540 
554  public ContentTag addContentTag(Content content, TagName tagName) throws TskCoreException {
555  return addContentTag(content, tagName, "", -1, -1);
556  }
557 
572  public ContentTag addContentTag(Content content, TagName tagName, String comment) throws TskCoreException {
573  return addContentTag(content, tagName, comment, -1, -1);
574  }
575 
592  public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
593  TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
594  try {
595  Case currentCase = Case.getCurrentCaseThrows();
596 
597  currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
598 
599  } catch (NoCurrentCaseException ex) {
600  throw new TskCoreException("Added a tag to a closed case", ex);
601  }
602  return tagChange.getAddedTag();
603  }
604 
613  public void deleteContentTag(ContentTag tag) throws TskCoreException {
614  caseDb.deleteContentTag(tag);
615  try {
617  } catch (NoCurrentCaseException ex) {
618  throw new TskCoreException("Deleted a tag from a closed case", ex);
619  }
620  }
621 
630  public List<ContentTag> getAllContentTags() throws TskCoreException {
631  return caseDb.getAllContentTags();
632  }
633 
646  public long getContentTagsCountByTagName(TagName tagName) throws TskCoreException {
647  return caseDb.getContentTagsCountByTagName(tagName);
648  }
649 
664  public long getContentTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
665  long count = 0;
666  List<ContentTag> contentTags = getContentTagsByTagName(tagName);
667  for (ContentTag tag : contentTags) {
668  if (userName.equals(tag.getUserName())) {
669  count++;
670  }
671  }
672  return count;
673  }
674 
690  public long getContentTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
691  return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
692  }
693 
710  public long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
711  long count = 0;
712  List<ContentTag> contentTags = getContentTagsByTagName(tagName, dsObjId);
713  for (ContentTag tag : contentTags) {
714  if (userName.equals(tag.getUserName())) {
715  count++;
716  }
717  }
718  return count;
719  }
720 
731  public ContentTag getContentTagByTagID(long tagId) throws TskCoreException {
732  return caseDb.getContentTagByID(tagId);
733  }
734 
746  public List<ContentTag> getContentTagsByTagName(TagName tagName) throws TskCoreException {
747  return caseDb.getContentTagsByTagName(tagName);
748  }
749 
763  public List<ContentTag> getContentTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
764  return caseDb.getContentTagsByTagName(tagName, dsObjId);
765  }
766 
778  public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreException {
779  return caseDb.getContentTagsByContent(content);
780  }
781 
795  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName) throws TskCoreException {
796  return addBlackboardArtifactTag(artifact, tagName, "");
797  }
798 
813  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException {
814  TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
815  try {
816  Case currentCase = Case.getCurrentCaseThrows();
817  currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
818  } catch (NoCurrentCaseException ex) {
819  throw new TskCoreException("Added a tag to a closed case", ex);
820  }
821  return tagChange.getAddedTag();
822  }
823 
832  public void deleteBlackboardArtifactTag(BlackboardArtifactTag tag) throws TskCoreException {
833  caseDb.deleteBlackboardArtifactTag(tag);
834  try {
836  } catch (NoCurrentCaseException ex) {
837  throw new TskCoreException("Deleted a tag from a closed case", ex);
838  }
839  }
840 
849  public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCoreException {
850  return caseDb.getAllBlackboardArtifactTags();
851  }
852 
865  public long getBlackboardArtifactTagsCountByTagName(TagName tagName) throws TskCoreException {
866  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
867  }
868 
883  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
884  long count = 0;
885  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName);
886  for (BlackboardArtifactTag tag : artifactTags) {
887  if (userName.equals(tag.getUserName())) {
888  count++;
889  }
890  }
891  return count;
892  }
893 
908  public long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
909  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
910  }
911 
928  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
929  long count = 0;
930  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName, dsObjId);
931  for (BlackboardArtifactTag tag : artifactTags) {
932  if (userName.equals(tag.getUserName())) {
933  count++;
934  }
935  }
936  return count;
937  }
938 
949  public BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagId) throws TskCoreException {
950  return caseDb.getBlackboardArtifactTagByID(tagId);
951  }
952 
966  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName) throws TskCoreException {
967  return caseDb.getBlackboardArtifactTagsByTagName(tagName);
968  }
969 
984  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
985  return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
986  }
987 
999  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact) throws TskCoreException {
1000  return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
1001  }
1002 
1006  public static class TagNameAlreadyExistsException extends Exception {
1007 
1008  private static final long serialVersionUID = 1L;
1009  }
1010 
1021  @Deprecated
1022  public boolean tagNameExists(String tagDisplayName) {
1023  try {
1024  Map<String, TagName> tagNames = getDisplayNamesToTagNamesMap();
1025  return tagNames.containsKey(tagDisplayName) && (tagNames.get(tagDisplayName) != null);
1026  } catch (TskCoreException ex) {
1027  LOGGER.log(Level.SEVERE, "Error querying case database for tag names", ex);
1028  return false;
1029  }
1030  }
1031 
1038  @Deprecated
1039  @Override
1040  public void close() throws IOException {
1041  }
1042 
1043 }
void notifyContentTagDeleted(ContentTag deletedTag)
Definition: Case.java:1811
void notifyBlackBoardArtifactTagDeleted(BlackboardArtifactTag deletedTag)
Definition: Case.java:1876
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:1852
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:676
void notifyContentTagAdded(ContentTag newTag)
Definition: Case.java:1787
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-2021 Basis Technology. Generated on: Thu Jul 8 2021
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.