55 #define LOG_EMAIL_DEFAULT 0
56 #define LOG_EMAIL_EXTENDED (1<<0)
57 #define LOG_EMAIL_ARRAY (1<<1)
58 #define LOG_EMAIL_COMMA (1<<2)
59 #define LOG_EMAIL_BODY_MD5 (1<<3)
60 #define LOG_EMAIL_SUBJECT_MD5 (1<<4)
86 static inline char *SkipWhiteSpaceTill(
char *p,
char *savep)
92 while (((*sp ==
'\t') || (*sp ==
' ')) && (sp < savep)) {
98 static bool EveEmailJsonArrayFromCommaList(JsonBuilder *js,
const uint8_t *val,
size_t len)
104 if (
likely(to_line != NULL)) {
105 p = strtok_r(to_line,
",", &savep);
110 sp = SkipWhiteSpaceTill(p, savep);
111 jb_append_string(js, sp);
112 while ((p = strtok_r(NULL,
",", &savep)) != NULL) {
113 sp = SkipWhiteSpaceTill(p, savep);
114 jb_append_string(js, sp);
127 if (entity == NULL) {
132 char smd5[SC_MD5_HEX_LEN + 1];
133 SCMd5HashBufferToHex((uint8_t *)field->
value, field->
value_len, smd5,
sizeof(smd5));
134 jb_set_string(js,
"subject_md5", smd5);
141 jb_set_hex(js,
"body_md5", mime_state->
md5, (uint32_t)
sizeof(mime_state->
md5));
146 static int JsonEmailAddToJsonArray(
const uint8_t *val,
size_t len,
void *data)
148 JsonBuilder *ajs = data;
153 jb_append_string(ajs, value);
161 JsonBuilderMark mark = { 0, 0, 0 };
164 if (entity == NULL) {
169 if (((email_ctx->
fields & (1ULL<<f)) != 0)
174 jb_get_mark(js, &mark);
180 jb_restore_mark(js, &mark);
185 jb_get_mark(js, &mark);
187 if (EveEmailJsonArrayFromCommaList(js, field->
value, field->
value_len)) {
190 jb_restore_mark(js, &mark);
211 static bool EveEmailLogJsonData(
const Flow *f,
void *state,
void *vtx, uint64_t tx_id, JsonBuilder *sjs)
216 JsonBuilderMark mark = { 0, 0, 0 };
223 if (smtp_state == NULL) {
224 SCLogDebug(
"no smtp state, so no request logging");
231 SCLogDebug(
"lets go mime_state %p, entity %p, state_flag %u", mime_state, entity, mime_state ? mime_state->
state_flag : 0);
237 if ((mime_state != NULL)) {
238 if (entity == NULL) {
253 char * sp = SkipWhiteSpaceTill(s, s + strlen(s));
254 jb_set_string(sjs,
"from", sp);
262 jb_get_mark(sjs, &mark);
263 jb_open_array(sjs,
"to");
264 if (EveEmailJsonArrayFromCommaList(sjs, field->
value, field->
value_len)) {
267 jb_restore_mark(sjs, &mark);
274 jb_get_mark(sjs, &mark);
275 jb_open_array(sjs,
"cc");
276 if (EveEmailJsonArrayFromCommaList(sjs, field->
value, field->
value_len)) {
279 jb_restore_mark(sjs, &mark);
290 JsonBuilder *js_attach = jb_new_array();
291 JsonBuilder *js_url = jb_new_array();
294 bool has_ipv6_url =
false;
295 bool has_ipv4_url =
false;
296 bool has_exe_url =
false;
297 for (url = entity->
url_list; url != NULL; url = url->
next) {
301 jb_append_string(js_url, s);
312 jb_set_bool(sjs,
"has_ipv6_url", has_ipv6_url);
313 jb_set_bool(sjs,
"has_ipv4_url", has_ipv4_url);
314 jb_set_bool(sjs,
"has_exe_url", has_exe_url);
316 for (entity = entity->
child; entity != NULL; entity = entity->
next) {
321 jb_append_string(js_attach, s);
327 for (url = entity->
url_list; url != NULL; url = url->
next) {
331 jb_append_string(js_url, s);
338 if (attach_cnt > 0) {
340 jb_set_object(sjs,
"attachment", js_attach);
345 jb_set_object(sjs,
"url", js_url);
359 JsonBuilderMark mark = { 0, 0, 0 };
361 jb_get_mark(js, &mark);
362 jb_open_object(js,
"email");
363 if (!EveEmailLogJsonData(f, state, vtx, tx_id, js)) {
364 jb_restore_mark(js, &mark);
369 EveEmailLogJSONCustom(email_ctx, js, tx);
372 EveEmailLogJSONMd5(email_ctx, js, tx);
385 return EveEmailLogJsonData(f, smtp_state, tx, tx_id, js);
397 if (extended != NULL) {
412 email_ctx->
fields |= (1ULL << f);
420 email_ctx->
flags = 0;
425 if (strcmp(
"body", field->
val) == 0) {
426 SCLogInfo(
"Going to log the md5 sum of email body");
429 if (strcmp(
"subject", field->
val) == 0) {
430 SCLogInfo(
"Going to log the md5 sum of email subject");