#include "diff.h"
gboolean rspamd_compare_encoding (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_header_exists (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_parts_distance (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_recipients_distance (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_has_only_html_part (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_is_recipients_sorted (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_compare_transfer_encoding (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_is_html_balanced (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_has_html_tag (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
gboolean rspamd_has_fake_html (struct rspamd_task *task,
- GList * args,
+ GArray * args,
void *unused);
static rspamd_expression_atom_t * rspamd_mime_expr_parse (const gchar *line, gsize len,
}
-static gint
-rspamd_mime_expr_process (gpointer input, rspamd_expression_atom_t *atom)
-{
- struct rspamd_task *task = input;
- struct rspamd_mime_atom *mime_atom;
- gint ret = 0;
-
- g_assert (task != NULL);
- g_assert (atom != NULL);
-
- mime_atom = atom->data;
-
- if (!mime_atom->is_function) {
- ret = rspamd_mime_expr_process_regexp (mime_atom->d.re, task);
- }
-
- return ret;
-}
-
static gint
rspamd_mime_expr_priority (rspamd_expression_atom_t *atom)
{
}
}
-gboolean
-call_expression_function (struct rspamd_function_atom * func,
+static gboolean
+rspamd_mime_expr_process_function (struct rspamd_function_atom * func,
struct rspamd_task * task,
lua_State *L)
{
return selected->func (task, func->args, selected->user_data);
}
+static gint
+rspamd_mime_expr_process (gpointer input, rspamd_expression_atom_t *atom)
+{
+ struct rspamd_task *task = input;
+ struct rspamd_mime_atom *mime_atom;
+ gint ret = 0;
+
+ g_assert (task != NULL);
+ g_assert (atom != NULL);
+
+ mime_atom = atom->data;
+
+ if (!mime_atom->is_function) {
+ ret = rspamd_mime_expr_process_regexp (mime_atom->d.re, task);
+ }
+ else {
+ ret = rspamd_mime_expr_process_function (mime_atom->d.func, task,
+ task->cfg->lua_state);
+ }
+
+ return ret;
+}
+
void
register_expression_function (const gchar *name,
rspamd_internal_func_t func,
}
gboolean
-rspamd_compare_encoding (struct rspamd_task *task, GList * args, void *unused)
+rspamd_compare_encoding (struct rspamd_task *task, GArray * args, void *unused)
{
struct expression_argument *arg;
return FALSE;
}
- arg = get_function_arg (args->data, task, TRUE);
- if (arg->type == EXPRESSION_ARGUMENT_BOOL) {
+ arg = &g_array_index (args, struct expression_argument, 0);
+ if (!arg || arg->type == EXPRESSION_ARGUMENT_BOOL) {
msg_warn ("invalid argument to function is passed");
return FALSE;
}
}
gboolean
-rspamd_header_exists (struct rspamd_task * task, GList * args, void *unused)
+rspamd_header_exists (struct rspamd_task * task, GArray * args, void *unused)
{
struct expression_argument *arg;
GList *headerlist;
return FALSE;
}
- arg = get_function_arg (args->data, task, TRUE);
+ arg = &g_array_index (args, struct expression_argument, 0);
if (!arg || arg->type == EXPRESSION_ARGUMENT_BOOL) {
msg_warn ("invalid argument to function is passed");
return FALSE;
* and return FALSE otherwise.
*/
gboolean
-rspamd_parts_distance (struct rspamd_task * task, GList * args, void *unused)
+rspamd_parts_distance (struct rspamd_task * task, GArray * args, void *unused)
{
gint threshold, threshold2 = -1, diff;
struct mime_text_part *p1, *p2;
const GMimeContentType *ct;
gint *pdiff;
- if (args == NULL) {
+ if (args == NULL || args->len == 0) {
debug_task ("no threshold is specified, assume it 100");
threshold = 100;
}
else {
errno = 0;
- arg = get_function_arg (args->data, task, TRUE);
+ arg = &g_array_index (args, struct expression_argument, 0);
threshold = strtoul ((gchar *)arg->data, NULL, 10);
if (errno != 0) {
msg_info ("bad numeric value for threshold \"%s\", assume it 100",
- (gchar *)args->data);
+ (gchar *)arg->data);
threshold = 100;
}
- if (args->next) {
- arg = get_function_arg (args->next->data, task, TRUE);
+ if (args->len == 1) {
+ arg = &g_array_index (args, struct expression_argument, 1);
errno = 0;
threshold2 = strtoul ((gchar *)arg->data, NULL, 10);
if (errno != 0) {
#define MIN_RCPT_TO_COMPARE 7
gboolean
-rspamd_recipients_distance (struct rspamd_task *task, GList * args,
+rspamd_recipients_distance (struct rspamd_task *task, GArray * args,
void *unused)
{
struct expression_argument *arg;
return FALSE;
}
- arg = get_function_arg (args->data, task, TRUE);
+ arg = &g_array_index (args, struct expression_argument, 0);
errno = 0;
threshold = strtod ((gchar *)arg->data, NULL);
if (errno != 0) {
}
gboolean
-rspamd_has_only_html_part (struct rspamd_task * task, GList * args,
+rspamd_has_only_html_part (struct rspamd_task * task, GArray * args,
void *unused)
{
struct mime_text_part *p;
gboolean
rspamd_is_recipients_sorted (struct rspamd_task * task,
- GList * args,
+ GArray * args,
void *unused)
{
/* Check all types of addresses */
gboolean
rspamd_compare_transfer_encoding (struct rspamd_task * task,
- GList * args,
+ GArray * args,
void *unused)
{
GMimeObject *part;
return FALSE;
}
- arg = get_function_arg (args->data, task, TRUE);
+ arg = &g_array_index (args, struct expression_argument, 0);
#ifndef GMIME24
enc_req = g_mime_part_encoding_from_string (arg->data);
if (enc_req == GMIME_PART_ENCODING_DEFAULT) {
}
gboolean
-rspamd_is_html_balanced (struct rspamd_task * task, GList * args, void *unused)
+rspamd_is_html_balanced (struct rspamd_task * task, GArray * args, void *unused)
{
struct mime_text_part *p;
GList *cur;
}
gboolean
-rspamd_has_html_tag (struct rspamd_task * task, GList * args, void *unused)
+rspamd_has_html_tag (struct rspamd_task * task, GArray * args, void *unused)
{
struct mime_text_part *p;
GList *cur;
return FALSE;
}
- arg = get_function_arg (args->data, task, TRUE);
+ arg = &g_array_index (args, struct expression_argument, 0);
tag = get_tag_by_name (arg->data);
if (tag == NULL) {
msg_warn ("unknown tag type passed as argument: %s",
}
gboolean
-rspamd_has_fake_html (struct rspamd_task * task, GList * args, void *unused)
+rspamd_has_fake_html (struct rspamd_task * task, GArray * args, void *unused)
{
struct mime_text_part *p;
GList *cur;