-- Charset is missing in message
reconf['R_MISSING_CHARSET'] = {
- re = string.format('content_type_is_type(text) & !content_type_has_param(charset) & !%s', r_cte_7bit),
+ re = string.format('content_type_is_type(text) & !content_type_has_param(charset) & !%s',
+ r_cte_7bit),
score = 2.5,
description = 'Charset is missing in a message',
group = 'header'
GArray * args,
void *unused)
{
- GPtrArray *headerlist;
struct expression_argument *arg;
guint i;
- struct rspamd_mime_header *rh;
- static const char *hname = "Content-Transfer-Encoding";
+ struct rspamd_mime_part *part;
+ enum rspamd_cte cte;
if (args == NULL) {
msg_warn_task ("no parameters to function");
return FALSE;
}
- headerlist = rspamd_message_get_header_array (task, hname, FALSE);
+ cte = rspamd_cte_from_string (arg->data);
- if (headerlist) {
- for (i = 0; i < headerlist->len; i ++) {
- rh = g_ptr_array_index (headerlist, i);
-
- if (rh->decoded == NULL) {
- continue;
- }
-
- if (g_ascii_strcasecmp (rh->decoded, arg->data) == 0) {
- return TRUE;
- }
- }
+ if (cte == RSPAMD_CTE_UNKNOWN) {
+ msg_warn_task ("unknown cte: %s", arg->data);
+ return FALSE;
}
- /*
- * In fact, we need to check 'Content-Transfer-Encoding' for each part
- * as gmime has 'strange' assumptions
- */
- headerlist = rspamd_message_get_mime_header_array (task,
- arg->data,
- FALSE);
-
- if (headerlist) {
- for (i = 0; i < headerlist->len; i ++) {
- rh = g_ptr_array_index (headerlist, i);
-
- if (rh->decoded == NULL) {
- continue;
- }
-
- if (g_ascii_strcasecmp (rh->decoded, arg->data) == 0) {
+ PTR_ARRAY_FOREACH (task->parts, i, part) {
+ if (IS_CT_TEXT (part->ct)) {
+ if (part->cte == cte) {
return TRUE;
}
}
return g_quark_from_static_string ("mime-parser");
}
-static const gchar*
+const gchar*
rspamd_cte_to_string (enum rspamd_cte ct)
{
const gchar *ret = "unknown";
return ret;
}
+enum rspamd_cte
+rspamd_cte_from_string (const gchar *str)
+{
+ enum rspamd_cte ret = RSPAMD_CTE_UNKNOWN;
+
+ g_assert (str != NULL);
+
+ if (strcmp (str, "7bit") == 0) {
+ ret = RSPAMD_CTE_7BIT;
+ }
+ else if (strcmp (str, "8bit") == 0) {
+ ret = RSPAMD_CTE_8BIT;
+ }
+ else if (strcmp (str, "quoted-printable") == 0) {
+ ret = RSPAMD_CTE_QP;
+ }
+ else if (strcmp (str, "base64") == 0) {
+ ret = RSPAMD_CTE_B64;
+ }
+
+ return ret;
+}
+
static void
rspamd_mime_parser_init_lib (void)
{