if (session->ctx->lua_post_handler_cbref != -1) {
/* Start lua post handler */
lua_State *L = session->ctx->cfg->lua_state;
- int err_idx, ret;
+ int err_idx, ret, nargs = 9;
lua_pushcfunction(L, &rspamd_lua_traceback);
err_idx = lua_gettop(L);
lua_pushinteger(L, result->ts);
/* TODO: add additional data maybe (encryption, pubkey, etc) */
rspamd_fuzzy_extensions_tolua(L, session);
+ /* We push shingles merely for commands that modify content to avoid extra work */
+ if (is_shingle && cmd->cmd != FUZZY_CHECK) {
+ struct rspamd_shingle **pshingle = lua_newuserdata(L, sizeof(*pshingle));
+ rspamd_lua_setclass(L, RSPAMD_LUA_SHINGLE_CLASS, -1);
+ *pshingle = &session->cmd.sgl;
+ nargs++;
+ }
- if ((ret = lua_pcall(L, 9, LUA_MULTRET, err_idx)) != 0) {
+ if ((ret = lua_pcall(L, nargs, LUA_MULTRET, err_idx)) != 0) {
msg_err("call to lua_post_handler lua "
"script failed (%d): %s",
ret, lua_tostring(L, -1));
if (session->ctx->lua_pre_handler_cbref != -1) {
/* Start lua pre handler */
lua_State *L = session->ctx->cfg->lua_state;
- int err_idx, ret;
+ int err_idx, ret, nargs = 5;
lua_pushcfunction(L, &rspamd_lua_traceback);
err_idx = lua_gettop(L);
/* TODO: add additional data maybe (encryption, pubkey, etc) */
rspamd_fuzzy_extensions_tolua(L, session);
- if ((ret = lua_pcall(L, 5, LUA_MULTRET, err_idx)) != 0) {
+ /* We push shingles merely for commands that modify content to avoid extra work */
+ if (is_shingle && cmd->cmd != FUZZY_CHECK) {
+ struct rspamd_shingle **pshingle = lua_newuserdata(L, sizeof(*pshingle));
+ rspamd_lua_setclass(L, RSPAMD_LUA_SHINGLE_CLASS, -1);
+ *pshingle = &session->cmd.sgl;
+ nargs++;
+ }
+
+ if ((ret = lua_pcall(L, nargs, LUA_MULTRET, err_idx)) != 0) {
msg_err("call to lua_pre_handler lua "
"script failed (%d): %s",
ret, lua_tostring(L, -1));
#include "shingles.h"
#include "fmt/format.h"
-#define RSPAMD_SHINGLE_CLASS "rspamd{shingle}"
-
/***
* @module rspamd_shingle
* This module provides methods to work with text shingles
static struct rspamd_shingle *
lua_check_shingle(lua_State *L, int pos)
{
- void *ud = rspamd_lua_check_udata(L, pos, RSPAMD_SHINGLE_CLASS);
+ void *ud = rspamd_lua_check_udata(L, pos, RSPAMD_LUA_SHINGLE_CLASS);
luaL_argcheck(L, ud != nullptr, pos, "'shingle' expected");
- return static_cast<struct rspamd_shingle *>(ud);
+ return *static_cast<struct rspamd_shingle **>(ud);
}
static int
void luaopen_shingle(lua_State *L)
{
- rspamd_lua_new_class(L, RSPAMD_SHINGLE_CLASS, shinglelib_m);
+ rspamd_lua_new_class(L, RSPAMD_LUA_SHINGLE_CLASS, shinglelib_m);
lua_pop(L, 1);
}