}
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, tp) {
- if (IS_PART_HTML (tp) && tp->html != NULL &&
+ if (IS_TEXT_PART_HTML (tp) && tp->html != NULL &&
tp->html->images != NULL) {
for (j = 0; j < tp->html->images->len; j ++) {
himg = g_ptr_array_index (tp->html->images, j);
{
enum rspamd_tokenize_type tok_type;
- if (IS_PART_UTF (part)) {
+ if (IS_TEXT_PART_UTF (part)) {
#if U_ICU_VERSION_MAJOR_NUM < 50
/* Hack to prevent hang with Thai in old libicu */
{
struct rspamd_lang_detector_res *lang;
- if (!IS_PART_EMPTY (part) && part->utf_words && part->utf_words->len > 0 &&
- task->lang_det) {
+ if (!IS_TEXT_PART_EMPTY (part) && part->utf_words && part->utf_words->len > 0 &&
+ task->lang_det) {
if (rspamd_language_detector_detect (task, task->lang_det, part)) {
lang = g_ptr_array_index (part->languages, 0);
part->language = lang->lang;
} state = normal_char;
while (p < pe) {
- if (IS_PART_UTF (part)) {
+ if (IS_TEXT_PART_UTF (part)) {
gint32 off = p - begin;
U8_NEXT (begin, off, pe - begin, uc);
c = p + 1;
- if (IS_PART_HTML (part) || !url_open_bracket) {
+ if (IS_TEXT_PART_HTML (part) || !url_open_bracket) {
g_byte_array_append (part->utf_stripped_content,
(const guint8 *)" ", 1);
g_ptr_array_add (part->newlines,
case seen_cr:
/* \r\n */
if (!crlf_added) {
- if (IS_PART_HTML (part) || !url_open_bracket) {
+ if (IS_TEXT_PART_HTML (part) || !url_open_bracket) {
g_byte_array_append (part->utf_stripped_content,
(const guint8 *) " ", 1);
crlf_added = TRUE;
part->newlines = g_ptr_array_sized_new (128);
- if (IS_PART_EMPTY (part)) {
+ if (IS_TEXT_PART_EMPTY (part)) {
part->utf_stripped_content = g_byte_array_new ();
}
else {
}
}
- if (IS_PART_UTF (part)) {
+ if (IS_TEXT_PART_UTF (part)) {
utext_openUTF8 (&part->utf_stripped_text,
part->utf_stripped_content->data,
part->utf_stripped_content->len,
struct rspamd_mime_text_part *text_part;
rspamd_ftok_t html_tok, xhtml_tok;
gboolean found_html = FALSE, found_txt = FALSE;
+ guint flags = 0;
enum rspamd_action_type act;
if ((mime_part->ct && (mime_part->ct->flags & RSPAMD_CONTENT_TYPE_TEXT)) ||
/* Skip attachments */
if ((found_txt || found_html) &&
- (mime_part->cd && mime_part->cd->type == RSPAMD_CT_ATTACHMENT) &&
- (!task->cfg->check_text_attachements)) {
- debug_task ("skip attachments for checking as text parts");
- return FALSE;
+ (mime_part->cd && mime_part->cd->type == RSPAMD_CT_ATTACHMENT)) {
+ if (!task->cfg->check_text_attachements) {
+ debug_task ("skip attachments for checking as text parts");
+ return FALSE;
+ }
+ else {
+ flags |= RSPAMD_MIME_TEXT_PART_ATTACHMENT;
+ }
}
else if (!(found_txt || found_html)) {
/* Not a text part */
text_part->parsed.begin = mime_part->parsed_data.begin;
text_part->parsed.len = mime_part->parsed_data.len;
text_part->utf_stripped_text = (UText)UTEXT_INITIALIZER;
+ text_part->flags |= flags;
if (found_html) {
if (!rspamd_message_process_html_text_part (task, text_part)) {
/* Post process part */
rspamd_normalize_text_part (task, text_part);
- if (!IS_PART_HTML (text_part)) {
+ if (!IS_TEXT_PART_HTML (text_part)) {
if (mime_part->parent_part) {
struct rspamd_mime_part *parent = mime_part->parent_part;
srch.len = 11;
if (rspamd_ftok_cmp (&p1->mime_part->parent_part->ct->subtype, &srch) == 0) {
- if (!IS_PART_EMPTY (p1) && !IS_PART_EMPTY (p2) &&
+ if (!IS_TEXT_PART_EMPTY (p1) && !IS_TEXT_PART_EMPTY (p2) &&
p1->normalized_hashes && p2->normalized_hashes) {
/*
* We also detect language on one part and propagate it to
struct rspamd_mime_text_part *sel;
/* Prefer HTML as text part is not displayed normally */
- if (IS_PART_HTML (p1)) {
+ if (IS_TEXT_PART_HTML (p1)) {
sel = p1;
}
- else if (IS_PART_HTML (p2)) {
+ else if (IS_TEXT_PART_HTML (p2)) {
sel = p2;
}
else {
#define RSPAMD_MIME_TEXT_PART_FLAG_8BIT_ENCODED (1 << 5)
#define RSPAMD_MIME_TEXT_PART_HAS_SUBNORMAL (1 << 6)
#define RSPAMD_MIME_TEXT_PART_NORMALISED (1 << 7)
+#define RSPAMD_MIME_TEXT_PART_ATTACHMENT (1 << 8)
-#define IS_PART_EMPTY(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_EMPTY)
-#define IS_PART_UTF(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_UTF)
-#define IS_PART_RAW(part) (!((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_UTF))
-#define IS_PART_HTML(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_HTML)
+#define IS_TEXT_PART_EMPTY(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_EMPTY)
+#define IS_TEXT_PART_UTF(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_UTF)
+#define IS_TEXT_PART_HTML(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_FLAG_HTML)
+#define IS_TEXT_PART_ATTACHMENT(part) ((part)->flags & RSPAMD_MIME_TEXT_PART_ATTACHMENT)
struct rspamd_mime_text_part {
void *unused)
{
struct rspamd_mime_text_part *p;
+ guint i, cnt_html = 0, cnt_txt = 0;
gboolean res = FALSE;
- if (MESSAGE_FIELD (task, text_parts)->len == 1) {
+ PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, p) {
p = g_ptr_array_index (MESSAGE_FIELD (task, text_parts), 0);
- if (IS_PART_HTML (p)) {
- res = TRUE;
- }
- else {
- res = FALSE;
+ if (!IS_TEXT_PART_ATTACHMENT (p)) {
+ if (IS_TEXT_PART_HTML (p)) {
+ cnt_html++;
+ }
+ else {
+ cnt_txt++;
+ }
}
}
- return res;
+ return (cnt_html > 0 && cnt_txt == 0);
}
static gboolean
gboolean res = TRUE;
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, p) {
- if (IS_PART_HTML (p)) {
+ if (IS_TEXT_PART_HTML (p)) {
if (p->flags & RSPAMD_MIME_TEXT_PART_FLAG_BALANCED) {
res = TRUE;
}
}
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, p) {
- if (IS_PART_HTML (p) && p->html) {
+ if (IS_TEXT_PART_HTML (p) && p->html) {
res = rspamd_html_tag_seen (p->html, arg->data);
}
gboolean res = FALSE;
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, p) {
- if (IS_PART_HTML (p) && (p->html == NULL || p->html->html_tags == NULL)) {
+ if (IS_TEXT_PART_HTML (p) && (p->html == NULL || p->html->html_tags == NULL)) {
res = TRUE;
}
}
else {
/* Skip empty parts */
- if (IS_PART_EMPTY (text_part)) {
+ if (IS_TEXT_PART_EMPTY (text_part)) {
len = 0;
in = "";
}
else {
/* Check raw flags */
- if (!IS_PART_UTF (text_part)) {
+ if (!IS_TEXT_PART_UTF (text_part)) {
raw = TRUE;
}
scvec[i + 1] = (guchar *)text_part->utf_stripped_content->data;
lenvec[i + 1] = text_part->utf_stripped_content->len;
- if (!IS_PART_UTF (text_part)) {
+ if (!IS_TEXT_PART_UTF (text_part)) {
raw = TRUE;
}
}
scvec[i] = (guchar *)text_part->parsed.begin;
lenvec[i] = text_part->parsed.len;
- if (!IS_PART_UTF (text_part)) {
+ if (!IS_TEXT_PART_UTF (text_part)) {
raw = TRUE;
}
}
g_assert (st_ctx != NULL);
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, part) {
- if (!IS_PART_EMPTY (part) && part->utf_words != NULL) {
+ if (!IS_TEXT_PART_EMPTY (part) && part->utf_words != NULL) {
reserved_len += part->utf_words->len;
}
/* XXX: normal window size */
pdiff = rspamd_mempool_get_variable (task->task_pool, "parts_distance");
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, part) {
- if (!IS_PART_EMPTY (part) && part->utf_words != NULL) {
+ if (!IS_TEXT_PART_EMPTY (part) && part->utf_words != NULL) {
st_ctx->tokenizer->tokenize_func (st_ctx, task,
- part->utf_words, IS_PART_UTF (part),
+ part->utf_words, IS_TEXT_PART_UTF (part),
NULL, task->tokens);
}
LUA_TRACE_POINT;
struct rspamd_mime_text_part *part = lua_check_textpart (L);
- if (part == NULL || IS_PART_EMPTY (part)) {
+ if (part == NULL || IS_TEXT_PART_EMPTY (part)) {
lua_pushboolean (L, FALSE);
return 1;
}
- lua_pushboolean (L, IS_PART_UTF (part));
+ lua_pushboolean (L, IS_TEXT_PART_UTF (part));
return 1;
}
}
if (!type) {
- if (IS_PART_EMPTY (part)) {
+ if (IS_TEXT_PART_EMPTY (part)) {
lua_pushnil (L);
return 1;
}
len = part->utf_content->len;
}
else if (strcmp (type, "content") == 0) {
- if (IS_PART_EMPTY (part)) {
+ if (IS_TEXT_PART_EMPTY (part)) {
lua_pushnil (L);
return 1;
}
len = part->utf_content->len;
}
else if (strcmp (type, "content_oneline") == 0) {
- if (IS_PART_EMPTY (part)) {
+ if (IS_TEXT_PART_EMPTY (part)) {
lua_pushnil (L);
return 1;
}
struct rspamd_mime_text_part *part = lua_check_textpart (L);
struct rspamd_lua_text *t;
- if (part == NULL || IS_PART_EMPTY (part)) {
+ if (part == NULL || IS_TEXT_PART_EMPTY (part)) {
lua_pushnil (L);
return 1;
}
struct rspamd_mime_text_part *part = lua_check_textpart (L);
struct rspamd_lua_text *t;
- if (part == NULL || IS_PART_EMPTY (part)) {
+ if (part == NULL || IS_TEXT_PART_EMPTY (part)) {
lua_pushnil (L);
return 1;
}
return 1;
}
- if (IS_PART_EMPTY (part) || part->utf_content == NULL) {
+ if (IS_TEXT_PART_EMPTY (part) || part->utf_content == NULL) {
lua_pushinteger (L, 0);
}
else {
return 1;
}
- if (IS_PART_EMPTY (part)) {
+ if (IS_TEXT_PART_EMPTY (part)) {
lua_pushinteger (L, 0);
}
else {
return 1;
}
- if (IS_PART_EMPTY (part) || part->utf_words == NULL) {
+ if (IS_TEXT_PART_EMPTY (part) || part->utf_words == NULL) {
lua_pushinteger (L, 0);
}
else {
return luaL_error (L, "invalid arguments");
}
- if (IS_PART_EMPTY (part) || part->utf_words == NULL) {
+ if (IS_TEXT_PART_EMPTY (part) || part->utf_words == NULL) {
lua_createtable (L, 0, 0);
}
else {
return luaL_error (L, "invalid arguments");
}
- if (IS_PART_EMPTY (part) || part->utf_words == NULL) {
+ if (IS_TEXT_PART_EMPTY (part) || part->utf_words == NULL) {
lua_createtable (L, 0, 0);
}
else {
return 1;
}
- lua_pushboolean (L, IS_PART_EMPTY (part));
+ lua_pushboolean (L, IS_TEXT_PART_EMPTY (part));
return 1;
}
return 1;
}
- lua_pushboolean (L, IS_PART_HTML (part));
+ lua_pushboolean (L, IS_TEXT_PART_HTML (part));
return 1;
}
if (trie && task) {
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, part) {
- if (!IS_PART_EMPTY (part) && part->utf_content != NULL) {
+ if (!IS_TEXT_PART_EMPTY (part) && part->utf_content != NULL) {
text = part->utf_content->data;
len = part->utf_content->len;
if (task->message) {
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, tp) {
- if (!IS_PART_EMPTY (tp) && tp->utf_words != NULL && tp->utf_words->len > 0) {
+ if (!IS_TEXT_PART_EMPTY (tp) && tp->utf_words != NULL && tp->utf_words->len > 0) {
seen_text_part = TRUE;
if (tp->utf_stripped_text.magic == UTEXT_MAGIC) {