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;
60 if (evt.getNewValue() != null) {
61 Case currentCase = (
Case) evt.getNewValue();
63 CaseDbAccessManager caseDb = currentCase.
getSleuthkitCase().getCaseDbAccessManager();
68 if (currentCase.
getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
70 }
else if (currentCase.
getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
73 }
catch (TskCoreException ex) {
74 LOGGER.log(Level.SEVERE,
75 String.format(
"Unable to create the %s table for image tag storage.",
91 return (tagDisplayName.contains(
"\\")
92 || tagDisplayName.contains(
":")
93 || tagDisplayName.contains(
"*")
94 || tagDisplayName.contains(
"?")
95 || tagDisplayName.contains(
"\"")
96 || tagDisplayName.contains(
"<")
97 || tagDisplayName.contains(
">")
98 || tagDisplayName.contains(
"|")
99 || tagDisplayName.contains(
",")
100 || tagDisplayName.contains(
";"));
104 @NbBundle.Messages({
"TagsManager.notableTagEnding.text= (Notable)"})
111 return Bundle.TagsManager_notableTagEnding_text();
126 Set<String> tagDisplayNames =
new HashSet<>();
127 Set<TagNameDefinition> customNames = TagNameDefinition.getTagNameDefinitions();
128 customNames.forEach((tagType) -> {
129 tagDisplayNames.add(tagType.getDisplayName());
134 tagDisplayNames.add(tagName.getDisplayName());
141 return tagDisplayNames;
145 List<String> tagDisplayNames =
new ArrayList<>();
146 for (TagNameDefinition tagDef : TagNameDefinition.getTagNameDefinitions()) {
147 if (tagDef.getKnownStatus() == TskData.FileKnown.BAD) {
148 tagDisplayNames.add(tagDef.getDisplayName());
151 return tagDisplayNames;
160 return TagNameDefinition.getStandardTagNames();
171 for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
172 tagName.saveToCase(caseDb);
184 return caseDb.getAllTagNames();
196 return caseDb.getTagNamesInUse();
210 Set<TagName> tagNameSet =
new HashSet<>();
211 List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
212 for (BlackboardArtifactTag tag : artifactTags) {
213 if (tag.getUserName().equals(userName)) {
214 tagNameSet.add(tag.getName());
217 List<ContentTag> contentTags = caseDb.getAllContentTags();
218 for (ContentTag tag : contentTags) {
219 if (tag.getUserName().equals(userName)) {
220 tagNameSet.add(tag.getName());
223 return new ArrayList<>(tagNameSet);
239 return caseDb.getTagNamesInUse(dsObjId);
256 Set<TagName> tagNameSet =
new HashSet<>();
257 List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
258 for (BlackboardArtifactTag tag : artifactTags) {
259 if (tag.getUserName().equals(userName) && tag.getArtifact().getDataSource().getId() == dsObjId) {
260 tagNameSet.add(tag.getName());
263 List<ContentTag> contentTags = caseDb.getAllContentTags();
264 for (ContentTag tag : contentTags) {
265 if (tag.getUserName().equals(userName) && tag.getContent().getDataSource().getId() == dsObjId) {
266 tagNameSet.add(tag.getName());
269 return new ArrayList<>(tagNameSet);
298 Map<String, TagName> tagNames =
new HashMap<>();
299 Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
300 for (TagNameDefinition tagType : customTypes) {
301 tagNames.put(tagType.getDisplayName(), null);
303 for (TagName tagName : caseDb.getAllTagNames()) {
304 tagNames.put(tagName.getDisplayName(), tagName);
306 return new HashMap<>(tagNames);
324 return addTagName(displayName,
"", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
342 public synchronized TagName
addTagName(String displayName, String description)
throws TagNameAlreadyExistsException, TskCoreException {
343 return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
361 public synchronized TagName
addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
362 return addTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
382 public synchronized TagName
addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
384 TagName tagName = caseDb.addOrUpdateTagName(displayName, description, color, knownStatus);
385 Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
386 customTypes.add(
new TagNameDefinition(displayName, description, color, knownStatus));
387 TagNameDefinition.setTagNameDefinitions(customTypes);
389 }
catch (TskCoreException ex) {
390 List<TagName> existingTagNames = caseDb.getAllTagNames();
391 for (TagName tagName : existingTagNames) {
392 if (tagName.getDisplayName().equals(displayName)) {
393 throw new TagNameAlreadyExistsException();
413 public ContentTag
addContentTag(Content content, TagName tagName)
throws TskCoreException {
431 public ContentTag
addContentTag(Content content, TagName tagName, String comment)
throws TskCoreException {
451 public ContentTag
addContentTag(Content content, TagName tagName, String comment,
long beginByteOffset,
long endByteOffset)
throws TskCoreException {
453 tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
457 throw new TskCoreException(
"Added a tag to a closed case", ex);
471 caseDb.deleteContentTag(tag);
475 throw new TskCoreException(
"Deleted a tag from a closed case", ex);
488 return caseDb.getAllContentTags();
504 return caseDb.getContentTagsCountByTagName(tagName);
524 for (ContentTag tag : contentTags) {
525 if (userName.equals(tag.getUserName())) {
548 return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
570 for (ContentTag tag : contentTags) {
571 if (userName.equals(tag.getUserName())) {
589 return caseDb.getContentTagByID(tagId);
604 return caseDb.getContentTagsByTagName(tagName);
621 return caseDb.getContentTagsByTagName(tagName, dsObjId);
636 return caseDb.getContentTagsByContent(content);
670 public BlackboardArtifactTag
addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
throws TskCoreException {
671 BlackboardArtifactTag tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment);
675 throw new TskCoreException(
"Added a tag to a closed case", ex);
689 caseDb.deleteBlackboardArtifactTag(tag);
693 throw new TskCoreException(
"Deleted a tag from a closed case", ex);
706 return caseDb.getAllBlackboardArtifactTags();
722 return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
742 for (BlackboardArtifactTag tag : artifactTags) {
743 if (userName.equals(tag.getUserName())) {
765 return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
787 for (BlackboardArtifactTag tag : artifactTags) {
788 if (userName.equals(tag.getUserName())) {
806 return caseDb.getBlackboardArtifactTagByID(tagId);
823 return caseDb.getBlackboardArtifactTagsByTagName(tagName);
841 return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
856 return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
862 public static class TagNameAlreadyExistsException
extends Exception {
881 return tagNames.containsKey(tagDisplayName) && (tagNames.get(tagDisplayName) != null);
882 }
catch (TskCoreException ex) {
883 LOGGER.log(Level.SEVERE,
"Error querying case database for tag names", ex);
896 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)
static final String TABLE_SCHEMA_POSTGRESQL