19 package org.sleuthkit.autopsy.casemodule.services;
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;
30 import java.util.logging.Level;
31 import org.openide.util.NbBundle;
62 private static final Object
lock =
new Object();
69 if (evt.getNewValue() != null) {
70 Case currentCase = (
Case) evt.getNewValue();
72 CaseDbAccessManager caseDb = currentCase.
getSleuthkitCase().getCaseDbAccessManager();
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);
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);
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(
";"));
113 @NbBundle.Messages({
"TagsManager.notableTagEnding.text= (Notable)"})
120 return Bundle.TagsManager_notableTagEnding_text();
135 Set<String> tagDisplayNames =
new HashSet<>();
137 customNames.forEach((tagType) -> {
138 tagDisplayNames.add(tagType.getDisplayName());
143 tagDisplayNames.add(tagName.getDisplayName());
150 return tagDisplayNames;
161 List<String> tagDisplayNames =
new ArrayList<>();
163 if (tagDef.getKnownStatus() == TskData.FileKnown.BAD) {
164 tagDisplayNames.add(tagDef.getDisplayName());
171 if (tagName.getKnownStatus() == TskData.FileKnown.BAD
172 && !tagDisplayNames.contains(tagName.getDisplayName())) {
173 tagDisplayNames.add(tagName.getDisplayName());
180 }
catch (TskCoreException ex) {
181 LOGGER.log(Level.SEVERE,
"Failed to get list of TagNames from TagsManager.", ex);
183 return tagDisplayNames;
192 List<String> tagList =
new ArrayList<>();
195 tagList.add(tagNameDef.getDisplayName());
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());
208 LOGGER.log(Level.SEVERE,
"Failed to get Project VIC tags from the database.", ex);
249 synchronized (
lock) {
264 TaggingManager taggingMgr = caseDb.getTaggingManager();
266 List<TagSet> tagSetsInCase = taggingMgr.getTagSets();
267 if (tagSetsInCase.isEmpty()) {
271 caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus());
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()));
281 if (!tagNamesInSet.isEmpty()) {
282 taggingMgr.addTagSet(setDef.getName(), tagNamesInSet);
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);
292 for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
293 tagName.saveToCase(caseDb);
305 return caseDb.getTaggingManager().getTagSets();
317 public TagSet
getTagSet(TagName tagName)
throws TskCoreException {
318 return caseDb.getTaggingManager().getTagSet(tagName);
332 public TagSet
addTagSet(String name, List<TagName> tagNameList)
throws TskCoreException {
333 return caseDb.getTaggingManager().addTagSet(name, tagNameList);
344 return caseDb.getAllTagNames();
356 return caseDb.getTagNamesInUse();
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());
377 List<ContentTag> contentTags = caseDb.getAllContentTags();
378 for (ContentTag tag : contentTags) {
379 if (tag.getUserName().equals(userName)) {
380 tagNameSet.add(tag.getName());
383 return new ArrayList<>(tagNameSet);
399 return caseDb.getTagNamesInUse(dsObjId);
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());
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());
430 return new ArrayList<>(tagNameSet);
441 Map<String, TagName> tagNames =
new HashMap<>();
442 for (TagName tagName : caseDb.getAllTagNames()) {
443 tagNames.put(tagName.getDisplayName(), tagName);
463 return addTagName(displayName,
"", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
481 public TagName
addTagName(String displayName, String description)
throws TagNameAlreadyExistsException, TskCoreException {
482 return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
500 public TagName
addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
501 return addTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
521 public TagName
addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
522 synchronized (
lock) {
524 TagName tagName = caseDb.addOrUpdateTagName(displayName, description, color, knownStatus);
526 customTypes.add(
new TagNameDefinition(displayName, description, color, knownStatus));
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();
554 public ContentTag
addContentTag(Content content, TagName tagName)
throws TskCoreException {
572 public ContentTag
addContentTag(Content content, TagName tagName, String comment)
throws TskCoreException {
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);
597 currentCase.
notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
600 throw new TskCoreException(
"Added a tag to a closed case", ex);
602 return tagChange.getAddedTag();
614 caseDb.deleteContentTag(tag);
618 throw new TskCoreException(
"Deleted a tag from a closed case", ex);
631 return caseDb.getAllContentTags();
647 return caseDb.getContentTagsCountByTagName(tagName);
667 for (ContentTag tag : contentTags) {
668 if (userName.equals(tag.getUserName())) {
691 return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
713 for (ContentTag tag : contentTags) {
714 if (userName.equals(tag.getUserName())) {
732 return caseDb.getContentTagByID(tagId);
747 return caseDb.getContentTagsByTagName(tagName);
764 return caseDb.getContentTagsByTagName(tagName, dsObjId);
779 return caseDb.getContentTagsByContent(content);
813 public BlackboardArtifactTag
addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
throws TskCoreException {
814 TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
819 throw new TskCoreException(
"Added a tag to a closed case", ex);
821 return tagChange.getAddedTag();
833 caseDb.deleteBlackboardArtifactTag(tag);
837 throw new TskCoreException(
"Deleted a tag from a closed case", ex);
850 return caseDb.getAllBlackboardArtifactTags();
866 return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
886 for (BlackboardArtifactTag tag : artifactTags) {
887 if (userName.equals(tag.getUserName())) {
909 return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
931 for (BlackboardArtifactTag tag : artifactTags) {
932 if (userName.equals(tag.getUserName())) {
950 return caseDb.getBlackboardArtifactTagByID(tagId);
967 return caseDb.getBlackboardArtifactTagsByTagName(tagName);
985 return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
1000 return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
1006 public static class TagNameAlreadyExistsException
extends Exception {
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);
1040 public void close() throws IOException {
void notifyContentTagDeleted(ContentTag deletedTag)
void notifyBlackBoardArtifactTagDeleted(BlackboardArtifactTag deletedTag)
TagsManager getTagsManager()
static final String TABLE_SCHEMA_SQLITE
static final String TABLE_NAME
SleuthkitCase getSleuthkitCase()
void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
void notifyContentTagAdded(ContentTag newTag)