#include "message.h"
#include "mime_expressions.h"
#include "html.h"
+#include "email_addr.h"
#include "lua/lua_common.h"
gboolean rspamd_compare_encoding (struct rspamd_task *task,
static gboolean
match_smtp_data (struct rspamd_task *task,
struct expression_argument *arg,
- const gchar *what)
+ const gchar *what, gsize len)
{
rspamd_regexp_t *re;
gint r;
}
- r = rspamd_regexp_search (re, what, 0, NULL, NULL, FALSE, NULL);
+ r = rspamd_regexp_search (re, what, len, NULL, NULL, FALSE, NULL);
return r;
}
else if (arg->type == EXPRESSION_ARGUMENT_NORMAL &&
- g_ascii_strcasecmp (arg->data, what) == 0) {
+ g_ascii_strncasecmp (arg->data, what, len) == 0) {
return TRUE;
}
rspamd_check_smtp_data (struct rspamd_task *task, GArray * args, void *unused)
{
struct expression_argument *arg;
- InternetAddressList *ia = NULL;
- const gchar *type, *what = NULL;
- gint i, ialen;
+ struct rspamd_email_address *addr;
+ GPtrArray *rcpts;
+ const gchar *type, *str = NULL;
+ guint i;
if (args == NULL) {
msg_warn_task ("no parameters to function");
case 'f':
case 'F':
if (g_ascii_strcasecmp (type, "from") == 0) {
- what = rspamd_task_get_sender (task);
+ addr = rspamd_task_get_sender (task);
}
else {
msg_warn_task ("bad argument to function: %s", type);
case 'h':
case 'H':
if (g_ascii_strcasecmp (type, "helo") == 0) {
- what = task->helo;
+ str = task->helo;
}
else {
msg_warn_task ("bad argument to function: %s", type);
case 'u':
case 'U':
if (g_ascii_strcasecmp (type, "user") == 0) {
- what = task->user;
+ str = task->user;
}
else {
msg_warn_task ("bad argument to function: %s", type);
case 's':
case 'S':
if (g_ascii_strcasecmp (type, "subject") == 0) {
- what = task->subject;
+ str = task->subject;
}
else {
msg_warn_task ("bad argument to function: %s", type);
case 'r':
case 'R':
if (g_ascii_strcasecmp (type, "rcpt") == 0) {
- ia = task->rcpt_mime;
+ rcpts = task->rcpt_envelope;
}
else {
msg_warn_task ("bad argument to function: %s", type);
}
}
- if (what == NULL && ia == NULL) {
+ if (str == NULL && addr == NULL && rcpts == NULL) {
/* Not enough data so regexp would NOT be found anyway */
return FALSE;
}
/* We would process only one more argument, others are ignored */
if (args->len >= 2) {
arg = &g_array_index (args, struct expression_argument, 1);
+
if (arg) {
- if (what != NULL) {
- return match_smtp_data (task, arg, what);
+ if (str != NULL) {
+ return match_smtp_data (task, arg, str, strlen (str));
+ }
+ else if (addr != NULL && addr->addr) {
+ return match_smtp_data (task, arg, addr->addr, addr->addr_len);
}
else {
- if (ia != NULL) {
- ialen = internet_address_list_length(ia);
- for (i = 0; i < ialen; i ++) {
- InternetAddress *iaelt =
- internet_address_list_get_address(ia, i);
- InternetAddressMailbox *iamb =
- INTERNET_ADDRESS_IS_MAILBOX(iaelt) ?
- INTERNET_ADDRESS_MAILBOX (iaelt) : NULL;
- if (iamb &&
+ if (rcpts != NULL) {
+ for (i = 0; i < rcpts->len; i ++) {
+ addr = g_ptr_array_index (rcpts, i);
+
+ if (addr && addr->addr &&
match_smtp_data (task, arg,
- internet_address_mailbox_get_addr(iamb))) {
+ addr->addr, addr->addr_len)) {
return TRUE;
}
}
#include "protocol.h"
#include "message.h"
#include "lua/lua_common.h"
+#include "email_addr.h"
#include "composites.h"
#include "stat_api.h"
#include "unix-std.h"
{
struct mime_part *p;
struct mime_text_part *tp;
+ struct rspamd_email_address *addr;
guint i;
if (task) {
}
}
+ for (i = 0; i < task->rcpt_envelope->len; i ++) {
+ addr = g_ptr_array_index (task->rcpt_envelope, i);
+ rspamd_email_address_unref (addr);
+ }
+
+ if (task->from_envelope) {
+ rspamd_email_address_unref (task->from_envelope);
+ }
+
if (task->images) {
g_list_free (task->images);
}
return ret;
}
-const gchar *
+struct rspamd_email_address*
rspamd_task_get_sender (struct rspamd_task *task)
{
- InternetAddress *iaelt = NULL;
-#ifdef GMIME24
- InternetAddressMailbox *imb;
-
- if (task->from_envelope != NULL) {
- iaelt = internet_address_list_get_address (task->from_envelope, 0);
- }
- else if (task->from_mime != NULL) {
- iaelt = internet_address_list_get_address (task->from_mime, 0);
- }
- imb = INTERNET_ADDRESS_IS_MAILBOX(iaelt) ?
- INTERNET_ADDRESS_MAILBOX (iaelt) : NULL;
-
- return (imb ? internet_address_mailbox_get_addr (imb) : NULL);
-#else
- if (task->from_envelope != NULL) {
- iaelt = internet_address_list_get_address (task->from_envelope);
- }
- else if (task->from_mime != NULL) {
- iaelt = internet_address_list_get_address (task->from_mime);
- }
-
- return (iaelt != NULL ? internet_address_get_addr (iaelt) : NULL);
-#endif
+ return task->from_envelope;
}
static const gchar *
rspamd_task_cache_principal_recipient (struct rspamd_task *task,
- const gchar *rcpt)
+ const gchar *rcpt, gsize len)
{
gchar *rcpt_lc;
- gsize len;
if (rcpt == NULL) {
return NULL;
}
- len = strlen (rcpt);
-
rcpt_lc = rspamd_mempool_alloc (task->task_pool, len + 1);
rspamd_strlcpy (rcpt_lc, rcpt, len + 1);
rspamd_str_lc (rcpt_lc, len);
{
InternetAddress *iaelt = NULL;
const gchar *val;
+ struct rspamd_email_address *addr;
val = rspamd_mempool_get_variable (task->task_pool, "recipient");
}
if (task->deliver_to) {
- return rspamd_task_cache_principal_recipient (task, task->deliver_to);
+ return rspamd_task_cache_principal_recipient (task, task->deliver_to,
+ strlen (task->deliver_to));
+ }
+ if (task->rcpt_envelope != NULL) {
+ addr = g_ptr_array_index (task->rcpt_envelope, 0);
+
+ if (addr->addr) {
+ return rspamd_task_cache_principal_recipient (task, addr->addr,
+ addr->addr_len);
+ }
}
#ifdef GMIME24
InternetAddressMailbox *imb;
- if (task->rcpt_envelope != NULL) {
- iaelt = internet_address_list_get_address (task->rcpt_envelope, 0);
- }
- else if (task->rcpt_mime != NULL) {
+ if (task->rcpt_mime != NULL) {
iaelt = internet_address_list_get_address (task->rcpt_mime, 0);
}
if (imb) {
val = internet_address_mailbox_get_addr (imb);
- return rspamd_task_cache_principal_recipient (task, val);
+ return rspamd_task_cache_principal_recipient (task, val, strlen (val));
}
#else
- if (task->rcpt_envelope != NULL) {
- iaelt = internet_address_list_get_address (task->rcpt_envelope);
- }
- else if (task->rcpt_mime != NULL) {
+ if (task->rcpt_mime != NULL) {
iaelt = internet_address_list_get_address (task->rcpt_mime);
}
if (iaelt) {
val = internet_address_get_addr (iaelt);
- return rspamd_task_cache_principal_recipient (task, val);
+ return rspamd_task_cache_principal_recipient (task, val, strlen (val));
}
#endif
return NULL;
}
-gboolean
-rspamd_task_add_recipient (struct rspamd_task *task, const gchar *rcpt)
-{
- InternetAddressList *tmp_addr;
-
- if (task->rcpt_envelope == NULL) {
- task->rcpt_envelope = internet_address_list_new ();
-#ifdef GMIME24
- rspamd_mempool_add_destructor (task->task_pool,
- (rspamd_mempool_destruct_t) g_object_unref,
- task->rcpt_envelope);
-#else
- rspamd_mempool_add_destructor (task->task_pool,
- (rspamd_mempool_destruct_t) internet_address_list_destroy,
- task->rcpt_envelope);
-#endif
- }
- tmp_addr = internet_address_list_parse_string (rcpt);
-
- if (tmp_addr) {
- internet_address_list_append (task->rcpt_envelope, tmp_addr);
-#ifdef GMIME24
- g_object_unref (tmp_addr);
-#else
- internet_address_list_destroy (tmp_addr);
-#endif
- return TRUE;
- }
-
- return FALSE;
-}
-
-gboolean
-rspamd_task_add_sender (struct rspamd_task *task, const gchar *sender)
-{
- InternetAddressList *tmp_addr;
-
- if (task->from_envelope == NULL) {
- task->from_envelope = internet_address_list_new ();
-#ifdef GMIME24
- rspamd_mempool_add_destructor (task->task_pool,
- (rspamd_mempool_destruct_t) g_object_unref,
- task->from_envelope);
-#else
- rspamd_mempool_add_destructor (task->task_pool,
- (rspamd_mempool_destruct_t) internet_address_list_destroy,
- task->from_envelope);
-#endif
- }
-
- if (strcmp (sender, "<>") == 0) {
- /* Workaround for gmime */
- internet_address_list_add (task->from_envelope,
- internet_address_mailbox_new ("", ""));
- return TRUE;
- }
- else {
- tmp_addr = internet_address_list_parse_string (sender);
-
- if (tmp_addr) {
- internet_address_list_append (task->from_envelope, tmp_addr);
-#ifdef GMIME24
- g_object_unref (tmp_addr);
-#else
- internet_address_list_destroy (tmp_addr);
-#endif
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
gboolean
rspamd_learn_task_spam (struct rspamd_task *task,
gboolean is_spam,
break;
case RSPAMD_LOG_SMTP_RCPT:
case RSPAMD_LOG_SMTP_RCPTS:
- if (task->rcpt_envelope &&
- internet_address_list_length (task->rcpt_envelope) > 0) {
- ret = TRUE;
- }
- else if (task->rcpt_mime &&
- internet_address_list_length (task->rcpt_mime) > 0) {
+ if (task->rcpt_envelope && task->rcpt_envelope->len > 0) {
ret = TRUE;
}
break;
}
break;
case RSPAMD_LOG_SMTP_FROM:
- if (task->from_envelope &&
- internet_address_list_length (task->from_envelope) > 0) {
- ret = TRUE;
- }
- else if (task->from_mime &&
- internet_address_list_length (task->from_mime) > 0) {
+ if (task->from_envelope) {
ret = TRUE;
}
break;
return res;
}
+static rspamd_fstring_t *
+rspamd_task_write_addr_list (struct rspamd_task *task,
+ GPtrArray *addrs, gint lim,
+ struct rspamd_log_format *lf,
+ rspamd_fstring_t *logbuf)
+{
+ rspamd_fstring_t *res = logbuf, *varbuf;
+ rspamd_ftok_t var = {.begin = NULL, .len = 0};
+ struct rspamd_email_address *addr;
+ gint i;
+
+ if (lim <= 0) {
+ lim = addrs->len;
+ }
+
+ varbuf = rspamd_fstring_new ();
+
+ for (i = 0; i < lim; i++) {
+ addr = g_ptr_array_index (addrs, i);
+
+ if (addr->addr) {
+ varbuf = rspamd_fstring_append (varbuf, addr->addr, addr->addr_len);
+ }
+
+ if (varbuf->len > 0) {
+ if (i != lim - 1) {
+ varbuf = rspamd_fstring_append (varbuf, ",", 1);
+ }
+ }
+ }
+
+ if (varbuf->len > 0) {
+ var.begin = varbuf->str;
+ var.len = varbuf->len;
+ res = rspamd_task_log_write_var (task, logbuf,
+ &var, (const rspamd_ftok_t *) lf->data);
+ }
+
+ rspamd_fstring_free (varbuf);
+
+ return res;
+}
+
static rspamd_fstring_t *
rspamd_task_log_variable (struct rspamd_task *task,
struct rspamd_log_format *lf, rspamd_fstring_t *logbuf)
/* InternetAddress vars */
case RSPAMD_LOG_SMTP_FROM:
if (task->from_envelope) {
- return rspamd_task_write_ialist (task, task->from_envelope, 1, lf,
- logbuf);
- }
- else if (task->from_mime) {
- return rspamd_task_write_ialist (task, task->from_mime, 1, lf,
- logbuf);
+ var.begin = task->from_envelope->addr;
+ var.len = task->from_envelope->addr_len;
}
break;
case RSPAMD_LOG_MIME_FROM:
break;
case RSPAMD_LOG_SMTP_RCPT:
if (task->rcpt_envelope) {
- return rspamd_task_write_ialist (task, task->rcpt_envelope, 1, lf,
- logbuf);
- }
- else if (task->rcpt_mime) {
- return rspamd_task_write_ialist (task, task->rcpt_mime, 1, lf,
+ return rspamd_task_write_addr_list (task, task->rcpt_envelope, 1, lf,
logbuf);
}
break;
break;
case RSPAMD_LOG_SMTP_RCPTS:
if (task->rcpt_envelope) {
- return rspamd_task_write_ialist (task, task->rcpt_envelope, -1, lf,
- logbuf);
- }
- else if (task->rcpt_mime) {
- return rspamd_task_write_ialist (task, task->rcpt_mime, -1, lf,
+ return rspamd_task_write_addr_list (task, task->rcpt_envelope, -1, lf,
logbuf);
}
break;