Browse Source

[Fix] Return a real number of recipients when dealing with aliases

Issue: #4104
tags/3.2
Vsevolod Stakhov 2 years ago
parent
commit
b7605d9239
No account linked to committer's email address
1 changed files with 26 additions and 12 deletions
  1. 26
    12
      src/lua/lua_task.c

+ 26
- 12
src/lua/lua_task.c View File

@@ -520,7 +520,7 @@ LUA_FUNCTION_DEF (task, get_dns_req);
* @method task:has_recipients([type])
* Return true if there are SMTP or MIME recipients for a task.
* @param {integer|string} type if specified has the following meaning: `0` or `any` means try SMTP recipients and fallback to MIME if failed, `1` or `smtp` means checking merely SMTP recipients and `2` or `mime` means MIME recipients only
* @return {bool} `true` if there are recipients of the following type
* @return {bool,integer} `true` if there are recipients of the following type and a number of such a recipients excluding artificial ones
*/
LUA_FUNCTION_DEF (task, has_recipients);

@@ -3512,7 +3512,6 @@ lua_push_emails_address_list (lua_State *L, GPtrArray *addrs, int flags)
for (i = 0; i < addrs->len; i ++) {
addr = g_ptr_array_index (addrs, i);


if (addr->flags & RSPAMD_EMAIL_ADDR_ORIGINAL) {
if (flags & RSPAMD_ADDRESS_ORIGINAL) {
lua_push_email_address (L, addr);
@@ -3858,6 +3857,21 @@ lua_task_has_from (lua_State *L)
return 1;
}

static inline int
rspamd_check_real_recipients_array_size (GPtrArray *ar)
{
gint ret = 0, i;
struct rspamd_email_address *addr;

PTR_ARRAY_FOREACH(ar, i, addr) {
if (!(addr->flags & RSPAMD_ADDRESS_ORIGINAL)) {
ret ++;
}
}

return ret;
}

static gint
lua_task_has_recipients (lua_State *L)
{
@@ -3875,18 +3889,22 @@ lua_task_has_recipients (lua_State *L)
switch (what & RSPAMD_ADDRESS_MASK) {
case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
nrcpt = rspamd_check_real_recipients_array_size(task->rcpt_envelope);
ret = nrcpt > 0;
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD_CHECK (task, rcpt_mime));
nrcpt = rspamd_check_real_recipients_array_size(MESSAGE_FIELD_CHECK (task, rcpt_mime));
ret = nrcpt > 0;
break;
case RSPAMD_ADDRESS_ANY:
default:
CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
nrcpt = rspamd_check_real_recipients_array_size(task->rcpt_envelope);
ret = nrcpt > 0;

if (!ret) {
CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD_CHECK (task, rcpt_mime));
nrcpt = rspamd_check_real_recipients_array_size(MESSAGE_FIELD_CHECK (task, rcpt_mime));
ret = nrcpt > 0;
}
break;
}
@@ -3896,13 +3914,9 @@ lua_task_has_recipients (lua_State *L)
}

lua_pushboolean (L, ret);
lua_pushinteger (L, nrcpt);

if (ret) {
lua_pushinteger (L, nrcpt);
return 2;
}

return 1;
return 2;
}

static gint

Loading…
Cancel
Save