19 package org.sleuthkit.autopsy.modules.stix;
25 import java.util.List;
26 import java.util.ArrayList;
28 import org.mitre.cybox.objects.EmailMessage;
29 import org.mitre.cybox.objects.Address;
34 class EvalEmailObj
extends EvaluatableObject {
36 private final EmailMessage obj;
38 private List<BlackboardArtifact> finalHits;
40 public EvalEmailObj(EmailMessage a_obj, String a_id, String a_spacing) {
49 public synchronized ObservableResult evaluate() {
53 List<BlackboardArtifact> toHits = null;
54 boolean hadToFields =
false;
55 List<BlackboardArtifact> ccHits = null;
56 boolean hadCcFields =
false;
57 List<BlackboardArtifact> fromHits = null;
58 boolean hadFromField =
false;
59 List<BlackboardArtifact> subjectHits = null;
60 boolean hadSubjectField =
false;
62 if (obj.getHeader() != null) {
63 if ((obj.getHeader().getTo() != null)
64 && (obj.getHeader().getTo().getRecipients() != null)
65 && (!obj.getHeader().getTo().getRecipients().isEmpty())) {
66 for (Address addr : obj.getHeader().getTo().getRecipients()) {
67 if (addr.getAddressValue() != null) {
72 toHits = findArtifactsBySubstring(addr.getAddressValue(),
73 BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO);
74 }
catch (TskCoreException ex) {
75 addWarning(ex.getLocalizedMessage());
81 if ((obj.getHeader().getCC() != null)
82 && (obj.getHeader().getCC().getRecipients() != null)
83 && (!obj.getHeader().getCC().getRecipients().isEmpty())) {
84 for (Address addr : obj.getHeader().getCC().getRecipients()) {
85 if (addr.getAddressValue() != null) {
90 ccHits = findArtifactsBySubstring(addr.getAddressValue(),
91 BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC);
92 }
catch (TskCoreException ex) {
93 addWarning(ex.getLocalizedMessage());
99 if ((obj.getHeader().getFrom() != null)
100 && (obj.getHeader().getFrom().getAddressValue() != null)) {
105 fromHits = findArtifactsBySubstring(obj.getHeader().getFrom().getAddressValue(),
106 BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM);
107 }
catch (TskCoreException ex) {
108 addWarning(ex.getLocalizedMessage());
112 if ((obj.getHeader().getSubject() != null)
113 && (obj.getHeader().getSubject().getValue() != null)) {
115 hadSubjectField =
true;
118 subjectHits = findArtifactsBySubstring(obj.getHeader().getSubject(),
119 BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT);
120 }
catch (TskCoreException ex) {
121 addWarning(ex.getLocalizedMessage());
127 if ((!hadToFields) && (!hadFromField) && (!hadCcFields) && (!hadSubjectField)) {
128 return new ObservableResult(
id,
"EmailMessage: Could not find any parsable EmailMessage fields "
129 + getPrintableWarnings(),
130 spacing, ObservableResult.ObservableState.INDETERMINATE, null);
134 String fieldNames = getListOfUnsupportedFields();
135 if (fieldNames.length() > 0) {
136 addWarning(
"Unsupported field(s) found: " + fieldNames);
141 boolean finalHitsStarted =
false;
144 combineHits(toHits, finalHitsStarted);
145 finalHitsStarted =
true;
148 combineHits(ccHits, finalHitsStarted);
149 finalHitsStarted =
true;
152 combineHits(fromHits, finalHitsStarted);
153 finalHitsStarted =
true;
155 if (hadSubjectField) {
156 combineHits(subjectHits, finalHitsStarted);
157 finalHitsStarted =
true;
160 if (!finalHitsStarted) {
162 return new ObservableResult(
id,
"EmailMessage: EmailObj parsing incomplete " + getPrintableWarnings(),
163 spacing, ObservableResult.ObservableState.INDETERMINATE, null);
167 if (finalHits.size() > 0) {
168 List<StixArtifactData> artData =
new ArrayList<StixArtifactData>();
169 for (BlackboardArtifact a : finalHits) {
170 artData.add(
new StixArtifactData(a.getObjectID(), id,
"EmailMessage"));
172 return new ObservableResult(
id,
"EmailMessage: " + finalHits.size() +
" matching artifacts found " + getPrintableWarnings(),
173 spacing, ObservableResult.ObservableState.TRUE, artData);
175 return new ObservableResult(
id,
"EmailMessage: No matching artifacts found " + getPrintableWarnings(),
176 spacing, ObservableResult.ObservableState.FALSE, null);
188 private void combineHits(List<BlackboardArtifact> newHits,
boolean finalHitsStarted) {
189 if (finalHitsStarted && (finalHits != null)) {
190 finalHits.retainAll(newHits);
202 private String getListOfUnsupportedFields() {
203 String fieldNames =
"";
204 if (obj.getHeader() != null) {
205 if (obj.getHeader().getReceivedLines() != null) {
206 fieldNames +=
"Received_Lines ";
208 if (obj.getHeader().getBCC() != null) {
209 fieldNames +=
"BCC ";
211 if (obj.getHeader().getInReplyTo() != null) {
212 fieldNames +=
"In_Reply_To ";
214 if (obj.getHeader().getDate() != null) {
215 fieldNames +=
"Date ";
217 if (obj.getHeader().getMessageID() != null) {
218 fieldNames +=
"Message_ID ";
220 if (obj.getHeader().getSender() != null) {
221 fieldNames +=
"Sender ";
223 if (obj.getHeader().getReplyTo() != null) {
224 fieldNames +=
"Reply_To ";
226 if (obj.getHeader().getErrorsTo() != null) {
227 fieldNames +=
"Errors_To ";
229 if (obj.getHeader().getBoundary() != null) {
230 fieldNames +=
"Boundary ";
232 if (obj.getHeader().getContentType() != null) {
233 fieldNames +=
"Content_Type ";
235 if (obj.getHeader().getMIMEVersion() != null) {
236 fieldNames +=
"MIME_Version ";
238 if (obj.getHeader().getPrecedence() != null) {
239 fieldNames +=
"Precedence ";
241 if (obj.getHeader().getUserAgent() != null) {
242 fieldNames +=
"User_Agent ";
244 if (obj.getHeader().getXMailer() != null) {
245 fieldNames +=
"X_Mailer ";
247 if (obj.getHeader().getXOriginatingIP() != null) {
248 fieldNames +=
"X_Originiating_IP ";
250 if (obj.getHeader().getXPriority() != null) {
251 fieldNames +=
"X_Priority ";
255 if (obj.getEmailServer() != null) {
256 fieldNames +=
"Email_Server ";
258 if (obj.getRawBody() != null) {
259 fieldNames +=
"Raw_Body ";
261 if (obj.getRawHeader() != null) {
262 fieldNames +=
"Raw_Header ";
264 if (obj.getAttachments() != null) {
265 fieldNames +=
"Attachments ";
267 if (obj.getLinks() != null) {
268 fieldNames +=
"Links ";