Skip to content

Commit

Permalink
[Minor] Allow more sane flags and ids syntax when register symbols
Browse files Browse the repository at this point in the history
For example, flags could be defined as:

```lua
rspamd_config.register_symbol{
    flags = ['ignore_passthrough', 'nice']
  }
```

instead of (compatibility is still there):
```lua
rspamd_config.register_symbol{
    flags = 'ignore_passthrough,nice'
  }
```
  • Loading branch information
vstakhov committed May 16, 2023
1 parent 51ea5d5 commit 27a7069
Showing 1 changed file with 120 additions and 96 deletions.
216 changes: 120 additions & 96 deletions src/lua/lua_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -1504,43 +1504,41 @@ lua_metric_symbol_callback_return (struct thread_entry *thread_entry, int ret)
rspamd_symcache_item_async_dec_check (task, cd->item, "lua coro symbol");
}

static guint32*
rspamd_process_id_list (const gchar *entries, guint32 *plen)
static GArray *
rspamd_process_id_list (const gchar *entries)
{
gchar **sym_elts;
guint32 *ids, nids;
GArray *ret;

sym_elts = g_strsplit_set (entries, ",;", -1);
nids = g_strv_length (sym_elts);

ids = g_malloc (nids * sizeof (guint32));
guint nids = g_strv_length (sym_elts);
ret = g_array_sized_new(FALSE, FALSE, sizeof (guint32), nids);

for (guint i = 0; i < nids; i ++) {
ids[i] = rspamd_config_name_to_id (sym_elts[i], strlen (sym_elts[i]));
guint32 v = rspamd_config_name_to_id (sym_elts[i], strlen (sym_elts[i]));
g_array_append_val(ret, v);
}

*plen = nids;
g_strfreev (sym_elts);

return ids;
return ret;
}

static gint
rspamd_register_symbol_fromlua (lua_State *L,
struct rspamd_config *cfg,
const gchar *name,
gint ref,
gdouble weight,
gint priority,
enum rspamd_symbol_type type,
gint parent,
const gchar *allowed_ids,
const gchar *forbidden_ids,
gboolean optional)
struct rspamd_config *cfg,
const gchar *name,
gint ref,
gdouble weight,
gint priority,
enum rspamd_symbol_type type,
gint parent,
GArray *allowed_ids,
GArray *forbidden_ids,
gboolean optional)
{
struct lua_callback_data *cd;
gint ret = -1;
guint32 *ids, nids;

if (priority == 0 && weight < 0) {
priority = 1;
Expand Down Expand Up @@ -1612,47 +1610,13 @@ rspamd_register_symbol_fromlua (lua_State *L,
}

if (allowed_ids) {
ids = rspamd_process_id_list (allowed_ids, &nids);

if (nids > 0) {
GString *dbg = g_string_new ("");

for (guint i = 0; i < nids; i ++) {
rspamd_printf_gstring (dbg, "%ud,", ids[i]);
}

dbg->len --;

msg_debug_config ("allowed ids for %s are: %v", name, dbg);
g_string_free (dbg, TRUE);

rspamd_symcache_set_allowed_settings_ids (cfg->cache, name,
ids, nids);
}

g_free (ids);
rspamd_symcache_set_allowed_settings_ids (cfg->cache, name,
&g_array_index(allowed_ids, guint32, 0), allowed_ids->len);
}

if (forbidden_ids) {
ids = rspamd_process_id_list (forbidden_ids, &nids);

if (nids > 0) {
GString *dbg = g_string_new ("");

for (guint i = 0; i < nids; i ++) {
rspamd_printf_gstring (dbg, "%ud,", ids[i]);
}

dbg->len --;

msg_debug_config ("forbidden ids for %s are: %v", name, dbg);
g_string_free (dbg, TRUE);

rspamd_symcache_set_forbidden_settings_ids (cfg->cache, name,
ids, nids);
}

g_free (ids);
rspamd_symcache_set_forbidden_settings_ids (cfg->cache, name,
&g_array_index(forbidden_ids, guint32, 0), forbidden_ids->len);
}

return ret;
Expand Down Expand Up @@ -1995,33 +1959,75 @@ lua_config_register_symbol (lua_State * L)
{
LUA_TRACE_POINT;
struct rspamd_config *cfg = lua_check_config (L, 1);
const gchar *name = NULL, *flags_str = NULL, *type_str = NULL,
*description = NULL, *group = NULL, *allowed_ids = NULL,
*forbidden_ids = NULL;
const gchar *name = NULL, *type_str = NULL,
*description = NULL, *group = NULL;
double weight = 0, score = NAN, parent_float = NAN;
gboolean one_shot = FALSE;
gint ret = -1, cbref = -1, type, flags = 0;
gint ret = -1, cbref = -1;
guint type = 0, flags = 0;
gint64 parent = 0, priority = 0, nshots = 0;
GArray *allowed_ids = NULL, *forbidden_ids = NULL;
GError *err = NULL;
int prev_top = lua_gettop(L);

if (cfg) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"name=S;weight=N;callback=F;flags=S;type=S;priority=I;parent=D;"
"score=D;description=S;group=S;one_shot=B;nshots=I;"
"allowed_ids=S;forbidden_ids=S",
&name, &weight, &cbref, &flags_str, &type_str,
"name=S;weight=N;callback=F;type=S;priority=I;parent=D;"
"score=D;description=S;group=S;one_shot=B;nshots=I",
&name, &weight, &cbref, &type_str,
&priority, &parent_float,
&score, &description, &group, &one_shot, &nshots,
&allowed_ids, &forbidden_ids)) {
&score, &description, &group, &one_shot, &nshots)) {
msg_err_config ("bad arguments: %e", err);
g_error_free (err);
lua_settop(L, prev_top);

return luaL_error (L, "invalid arguments");
}

/* Deal with flags and ids */
lua_pushstring (L, "flags");
lua_gettable (L, 2);
if (lua_type(L, -1) == LUA_TSTRING) {
flags = lua_parse_symbol_flags (lua_tostring (L, -1));
}
else if (lua_type(L, -1) == LUA_TTABLE) {
for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
flags |= lua_parse_symbol_flags (lua_tostring (L, -1));
}
}
lua_pop (L, 1); /* Clean flags */

lua_pushstring(L, "allowed_ids");
lua_gettable (L, 2);
if (lua_type(L, -1) == LUA_TSTRING) {
allowed_ids = rspamd_process_id_list(lua_tostring (L, -1));
}
else if (lua_type(L, -1) == LUA_TTABLE) {
allowed_ids = g_array_sized_new(FALSE, FALSE, sizeof (guint32),
rspamd_lua_table_size(L, -1));
for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
guint32 v = lua_tointeger(L, -1);
g_array_append_val(allowed_ids, v);
}
}
lua_pop (L, 1);

lua_pushstring(L, "forbidden_ids");
lua_gettable (L, 2);
if (lua_type(L, -1) == LUA_TSTRING) {
forbidden_ids = rspamd_process_id_list(lua_tostring (L, -1));
}
else if (lua_type(L, -1) == LUA_TTABLE) {
forbidden_ids = g_array_sized_new(FALSE, FALSE, sizeof (guint32),
rspamd_lua_table_size(L, -1));
for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
guint32 v = lua_tointeger(L, -1);
g_array_append_val(forbidden_ids, v);
}
}
lua_pop (L, 1);

if (nshots == 0) {
nshots = cfg->default_max_shots;
}
Expand All @@ -2037,10 +2043,6 @@ lua_config_register_symbol (lua_State * L)
return luaL_error (L, "no callback for symbol %s", name);
}

if (flags_str) {
type |= lua_parse_symbol_flags (flags_str);
}

if (isnan (parent_float)) {
parent = -1;
}
Expand All @@ -2054,11 +2056,19 @@ lua_config_register_symbol (lua_State * L)
cbref,
weight == 0 ? 1.0 : weight,
priority,
type,
type | flags,
parent,
allowed_ids, forbidden_ids,
FALSE);

if (allowed_ids) {
g_array_free(allowed_ids, TRUE);
}

if (forbidden_ids) {
g_array_free(forbidden_ids, TRUE);
}

if (ret != -1) {
if (!isnan(score) || group) {
if (one_shot) {
Expand Down Expand Up @@ -2628,8 +2638,10 @@ lua_config_newindex (lua_State *L)
{
LUA_TRACE_POINT;
struct rspamd_config *cfg = lua_check_config (L, 1);
const gchar *name, *allowed_ids = NULL, *forbidden_ids = NULL;
gint id, nshots, flags = 0;
const gchar *name;
GArray *allowed_ids = NULL, *forbidden_ids = NULL;
gint id, nshots;
guint flags = 0;
gboolean optional = FALSE;

name = luaL_checkstring (L, 2);
Expand All @@ -2651,7 +2663,8 @@ lua_config_newindex (lua_State *L)
FALSE);
}
else if (lua_type (L, 3) == LUA_TTABLE) {
gint type = SYMBOL_TYPE_NORMAL, priority = 0, idx;
guint type = SYMBOL_TYPE_NORMAL, priority = 0;
gint idx;
gdouble weight = 1.0, score = NAN;
const char *type_str, *group = NULL, *description = NULL;

Expand Down Expand Up @@ -2693,7 +2706,7 @@ lua_config_newindex (lua_State *L)
lua_gettable (L, -2);

if (lua_type (L, -1) == LUA_TNUMBER) {
priority = lua_tonumber (L, -1);
priority = lua_tointeger(L, -1);
}
lua_pop (L, 1);

Expand All @@ -2714,28 +2727,31 @@ lua_config_newindex (lua_State *L)
}
lua_pop (L, 1);

/* Deal with flags and ids */
lua_pushstring (L, "flags");
lua_gettable (L, -2);

if (lua_type (L, -1) == LUA_TSTRING) {
type_str = lua_tostring (L, -1);
type |= lua_parse_symbol_flags (type_str);
lua_gettable (L, 2);
if (lua_type(L, -1) == LUA_TSTRING) {
flags = lua_parse_symbol_flags (lua_tostring (L, -1));
}
lua_pop (L, 1);

lua_pushstring (L, "allowed_ids");
lua_gettable (L, -2);

if (lua_type (L, -1) == LUA_TSTRING) {
allowed_ids = lua_tostring (L, -1);
else if (lua_type(L, -1) == LUA_TTABLE) {
for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
flags |= lua_parse_symbol_flags (lua_tostring (L, -1));
}
}
lua_pop (L, 1);
lua_pop (L, 1); /* Clean flags */

lua_pushstring (L, "forbidden_ids");
lua_gettable (L, -2);

if (lua_type (L, -1) == LUA_TSTRING) {
forbidden_ids = lua_tostring (L, -1);
lua_pushstring(L, "allowed_ids");
lua_gettable (L, 2);
if (lua_type(L, -1) == LUA_TSTRING) {
allowed_ids = rspamd_process_id_list(lua_tostring (L, -1));
}
else if (lua_type(L, -1) == LUA_TTABLE) {
allowed_ids = g_array_sized_new(FALSE, FALSE, sizeof (guint32),
rspamd_lua_table_size(L, -1));
for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
guint32 v = lua_tointeger(L, -1);
g_array_append_val(allowed_ids, v);
}
}
lua_pop (L, 1);

Expand All @@ -2745,11 +2761,19 @@ lua_config_newindex (lua_State *L)
idx,
weight,
priority,
type,
type | flags,
-1,
allowed_ids, forbidden_ids,
optional);

if (allowed_ids) {
g_array_free (allowed_ids, TRUE);
}

if (forbidden_ids) {
g_array_free (forbidden_ids, TRUE);
}

if (id != -1) {
/* Check for condition */
lua_pushstring (L, "condition");
Expand Down

0 comments on commit 27a7069

Please sign in to comment.