Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
ContactNode.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2019 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 */
19package org.sleuthkit.autopsy.communications.relationships;
20
21import java.util.ArrayList;
22import java.util.List;
23import java.util.TimeZone;
24import java.util.logging.Level;
25import org.openide.nodes.Sheet;
26import org.openide.util.NbBundle.Messages;
27import org.sleuthkit.autopsy.coreutils.Logger;
28import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
29import org.sleuthkit.autopsy.datamodel.NodeProperty;
30import org.sleuthkit.datamodel.BlackboardArtifact;
31import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT;
32import org.sleuthkit.datamodel.BlackboardAttribute;
33import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME;
34import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON;
35import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME;
36import org.sleuthkit.datamodel.TimeUtilities;
37import org.sleuthkit.datamodel.TskCoreException;
38import org.sleuthkit.autopsy.communications.Utils;
39import org.sleuthkit.datamodel.AbstractFile;
40import org.sleuthkit.datamodel.Content;
41
46final class ContactNode extends BlackboardArtifactNode {
47
48 private static final Logger logger = Logger.getLogger(ContactNode.class.getName());
49
50 @Messages({
51 "ContactNode_Name=Name",
52 "ContactNode_Phone=Phone Number",
53 "ContactNode_Email=Email Address",
54 "ContactNode_Mobile_Number=Mobile Number",
55 "ContactNode_Office_Number=Office Number",
56 "ContactNode_URL=URL",
57 "ContactNode_Home_Number=Home Number",})
58
59 ContactNode(BlackboardArtifact artifact) {
60 super(artifact);
61
62 String name = getAttributeDisplayString(artifact, TSK_NAME);
63 if (name == null || name.trim().isEmpty()) {
64 // VCards use TSK_NAME_PERSON instead of TSK_NAME
65 name = getAttributeDisplayString(artifact, TSK_NAME_PERSON);
66 }
67 setDisplayName(name);
68 }
69
70 @Override
71 protected Sheet createSheet() {
72 Sheet sheet = new Sheet();
73
74 final BlackboardArtifact artifact = getArtifact();
75 BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
76 if (fromID != TSK_CONTACT) {
77 return sheet;
78 }
79
80 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
81 if (sheetSet == null) {
82 sheetSet = Sheet.createPropertiesSet();
83 sheet.put(sheetSet);
84 }
85
86 // Sorting the attributes by type so that the duplicates can be removed
87 // and they can be grouped by type for display. The attribute prefixes
88 // are used so that all attributed of that type are found, including
89 // ones that are not predefined as part of BlackboardAttributes
90 try {
91 List<BlackboardAttribute> phoneNumList = new ArrayList<>();
92 List<BlackboardAttribute> emailList = new ArrayList<>();
93 List<BlackboardAttribute> nameList = new ArrayList<>();
94 List<BlackboardAttribute> otherList = new ArrayList<>();
95 for (BlackboardAttribute bba : artifact.getAttributes()) {
96 if (bba.getAttributeType().getTypeName().startsWith("TSK_PHONE")) {
97 phoneNumList.add(bba);
98 } else if (bba.getAttributeType().getTypeName().startsWith("TSK_EMAIL")) {
99 emailList.add(bba);
100 } else if (bba.getAttributeType().getTypeName().startsWith("TSK_NAME")) {
101 nameList.add(bba);
102 } else {
103 otherList.add(bba);
104 }
105 }
106
107 addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getLabel(),
108 sheetSet, nameList);
109 addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getLabel(),
110 sheetSet, phoneNumList);
111 addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getLabel(),
112 sheetSet, emailList);
113
114 for (BlackboardAttribute bba : otherList) {
115 sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
116 }
117
118 List<Content> children = artifact.getChildren();
119 if (children != null) {
120 int count = 0;
121 String imageLabelPrefix = "Image";
122 for (Content child : children) {
123 if (child instanceof AbstractFile) {
124 String imageLabel = imageLabelPrefix;
125 if (count > 0) {
126 imageLabel = imageLabelPrefix + "-" + count;
127 }
128 sheetSet.put(new NodeProperty<>(imageLabel, imageLabel, imageLabel, child.getName()));
129 }
130 }
131 }
132
133 } catch (TskCoreException ex) {
134 logger.log(Level.WARNING, "Error getting attribute values.", ex); //NON-NLS
135 }
136
137 return sheet;
138 }
139
140 private void addPropertiesToSheet(String propertyID, Sheet.Set sheetSet, List<BlackboardAttribute> attributeList) {
141 int count = 0;
142 for (BlackboardAttribute bba : attributeList) {
143 if (count++ > 0) {
144 if (bba.getAttributeType().getTypeName().startsWith("TSK_PHONE")) {
145 String phoneNumCountry = PhoneNumUtil.getCountryCode(bba.getValueString());
146 if (phoneNumCountry.equals("")) {
147 sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
148 } else {
149 sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString() + " [" + phoneNumCountry + "]"));
150 }
151 } else {
152 sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
153 }
154 } else {
155 if (bba.getAttributeType().getTypeName().startsWith("TSK_PHONE")) {
156 String phoneNumCountry = PhoneNumUtil.getCountryCode(bba.getValueString());
157 if (phoneNumCountry.equals("")) {
158 sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
159 } else {
160 sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString() + " [" + phoneNumCountry + "]"));
161 }
162 } else {
163 sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
164 }
165 }
166 }
167 }
168
169 private static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) {
170 try {
171 BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID())));
172 if (attribute == null) {
173 return "";
174 } else if (attributeType.getValueType() == DATETIME) {
175 return TimeUtilities.epochToTime(attribute.getValueLong(),
176 TimeZone.getTimeZone(Utils.getUserPreferredZoneId()));
177 } else {
178 return attribute.getDisplayString();
179 }
180 } catch (TskCoreException tskCoreException) {
181 logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); //NON-NLS
182 return "";
183 }
184 }
185
192 @Override
193 public String getSourceName() {
194 return getDisplayName();
195 }
196
197}

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.