From e8f8cc343f2d32cbbeeb9fbd95d8bb394a1504e6 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 8 Apr 2019 13:24:55 +0100 Subject: [PATCH] [Feature] Parse ical files --- src/libmime/message.c | 68 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/libmime/message.c b/src/libmime/message.c index 6825bc2f0..9bbd25d32 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -34,7 +34,8 @@ #include #include -#include +#include "libserver/cfg_file_private.h" +#include "lua/lua_common.h" #define GTUBE_SYMBOL "GTUBE" @@ -686,8 +687,69 @@ rspamd_message_process_plain_text_part (struct rspamd_task *task, rspamd_mime_text_part_maybe_convert (task, text_part); if (text_part->utf_raw_content != NULL) { - /* Different from HTML, where we also parse HTML and strip tags */ - text_part->utf_content = text_part->utf_raw_content; + /* Check for ical */ + rspamd_ftok_t cal_ct; + + RSPAMD_FTOK_ASSIGN (&cal_ct, "calendar"); + + if (rspamd_ftok_casecmp (&cal_ct, &text_part->mime_part->ct->subtype) == 0) { + lua_State *L = task->cfg->lua_state; + gint err_idx; + + lua_pushcfunction (L, &rspamd_lua_traceback); + err_idx = lua_gettop (L); + + /* Obtain function */ + if (!rspamd_lua_require_function (L, "lua_ical", "ical_txt_values")) { + msg_err_task ("cannot require lua_ical.ical_txt_values"); + lua_settop (L, err_idx - 1); + + return FALSE; + } + + lua_pushlstring (L, text_part->utf_raw_content->data, + text_part->utf_raw_content->len); + + if (lua_pcall (L, 1, 1, err_idx) != 0) { + GString *tb; + + tb = lua_touserdata (L, -1); + msg_err_task ("cannot call lua lua_ical.ical_txt_values: %s", tb->str); + g_string_free (tb, TRUE); + lua_settop (L, err_idx - 1); + + return FALSE; + } + + if (lua_type (L, -1) == LUA_TSTRING) { + const char *ndata; + gsize nsize; + + ndata = lua_tolstring (L, -1, &nsize); + text_part->utf_content = g_byte_array_sized_new (nsize); + g_byte_array_append (text_part->utf_content, ndata, nsize); + rspamd_mempool_add_destructor (task->task_pool, + (rspamd_mempool_destruct_t) free_byte_array_callback, + text_part->utf_content); + } + else if (lua_type (L, -1) == LUA_TNIL) { + msg_info_task ("cannot convert text/calendar to plain text"); + text_part->utf_content = text_part->utf_raw_content; + } + else { + msg_err_task ("invalid return type when calling lua_ical.ical_txt_values: %s", + lua_typename (L, lua_type (L, -1))); + lua_settop (L, err_idx - 1); + + return FALSE; + } + + lua_settop (L, err_idx - 1); + } + else { + /* Just have the same content */ + text_part->utf_content = text_part->utf_raw_content; + } } else { /* -- 2.39.5