123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /*-
- * Copyright 2016 Vsevolod Stakhov
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "lua_common.h"
-
- /* Classifier methods */
- LUA_FUNCTION_DEF(classifier, get_statfiles);
- LUA_FUNCTION_DEF(classifier, get_statfile_by_label);
- LUA_FUNCTION_DEF(classifier, get_param);
-
- static const struct luaL_reg classifierlib_m[] = {
- LUA_INTERFACE_DEF(classifier, get_statfiles),
- LUA_INTERFACE_DEF(classifier, get_param),
- LUA_INTERFACE_DEF(classifier, get_statfile_by_label),
- {"__tostring", rspamd_lua_class_tostring},
- {NULL, NULL}};
-
- LUA_FUNCTION_DEF(statfile, get_symbol);
- LUA_FUNCTION_DEF(statfile, get_label);
- LUA_FUNCTION_DEF(statfile, is_spam);
- LUA_FUNCTION_DEF(statfile, get_param);
-
- static const struct luaL_reg statfilelib_m[] = {
- LUA_INTERFACE_DEF(statfile, get_symbol),
- LUA_INTERFACE_DEF(statfile, get_label),
- LUA_INTERFACE_DEF(statfile, is_spam),
- LUA_INTERFACE_DEF(statfile, get_param),
- {"__tostring", rspamd_lua_class_tostring},
- {NULL, NULL}};
-
- static struct rspamd_statfile_config *lua_check_statfile(lua_State *L);
-
- /* Classifier implementation */
-
-
- static struct rspamd_classifier_config *
- lua_check_classifier(lua_State *L)
- {
- void *ud = rspamd_lua_check_udata(L, 1, rspamd_classifier_classname);
- luaL_argcheck(L, ud != NULL, 1, "'classifier' expected");
- return ud ? *((struct rspamd_classifier_config **) ud) : NULL;
- }
-
- /* Return table of statfiles indexed by name */
- static int
- lua_classifier_get_statfiles(lua_State *L)
- {
- struct rspamd_classifier_config *ccf = lua_check_classifier(L);
- GList *cur;
- struct rspamd_statfile_config *st, **pst;
- int i;
-
- if (ccf) {
- lua_newtable(L);
- cur = g_list_first(ccf->statfiles);
- i = 1;
- while (cur) {
- st = cur->data;
- pst = lua_newuserdata(L, sizeof(struct rspamd_statfile_config *));
- rspamd_lua_setclass(L, rspamd_statfile_classname, -1);
- *pst = st;
- lua_rawseti(L, -2, i++);
-
- cur = g_list_next(cur);
- }
- }
- else {
- lua_pushnil(L);
- }
-
- return 1;
- }
-
- static int
- lua_classifier_get_param(lua_State *L)
- {
- struct rspamd_classifier_config *ccf = lua_check_classifier(L);
- const char *param;
- const ucl_object_t *value;
-
- param = luaL_checkstring(L, 2);
-
- if (ccf != NULL && param != NULL) {
- value = ucl_object_lookup(ccf->opts, param);
-
- if (value != NULL) {
- ucl_object_push_lua(L, value, true);
- return 1;
- }
- }
-
- lua_pushnil(L);
-
- return 1;
- }
-
- /* Get statfile with specified label */
- static int
- lua_classifier_get_statfile_by_label(lua_State *L)
- {
- struct rspamd_classifier_config *ccf = lua_check_classifier(L);
- struct rspamd_statfile_config *st, **pst;
- const char *label;
- GList *cur;
- int i;
-
- label = luaL_checkstring(L, 2);
- if (ccf && label) {
- cur = g_hash_table_lookup(ccf->labels, label);
- if (cur) {
- lua_newtable(L);
- i = 1;
- while (cur) {
- st = cur->data;
- pst =
- lua_newuserdata(L,
- sizeof(struct rspamd_statfile_config *));
- rspamd_lua_setclass(L, rspamd_statfile_classname, -1);
- *pst = st;
- lua_rawseti(L, -2, i++);
- cur = g_list_next(cur);
- }
- return 1;
- }
- }
- lua_pushnil(L);
- return 1;
- }
-
- /* Statfile functions */
- static int
- lua_statfile_get_symbol(lua_State *L)
- {
- struct rspamd_statfile_config *st = lua_check_statfile(L);
-
- if (st != NULL) {
- lua_pushstring(L, st->symbol);
- }
- else {
- lua_pushnil(L);
- }
-
- return 1;
- }
-
- static int
- lua_statfile_get_label(lua_State *L)
- {
- struct rspamd_statfile_config *st = lua_check_statfile(L);
-
- if (st != NULL && st->label != NULL) {
- lua_pushstring(L, st->label);
- }
- else {
- lua_pushnil(L);
- }
-
- return 1;
- }
-
- static int
- lua_statfile_is_spam(lua_State *L)
- {
- struct rspamd_statfile_config *st = lua_check_statfile(L);
-
- if (st != NULL) {
- lua_pushboolean(L, st->is_spam);
- }
- else {
- lua_pushnil(L);
- }
-
- return 1;
- }
-
- static int
- lua_statfile_get_param(lua_State *L)
- {
- struct rspamd_statfile_config *st = lua_check_statfile(L);
- const char *param;
- const ucl_object_t *value;
-
- param = luaL_checkstring(L, 2);
-
- if (st != NULL && param != NULL) {
- value = ucl_object_lookup(st->opts, param);
- if (value != NULL) {
- lua_pushstring(L, ucl_object_tostring_forced(value));
- return 1;
- }
- }
- lua_pushnil(L);
-
- return 1;
- }
-
- static struct rspamd_statfile_config *
- lua_check_statfile(lua_State *L)
- {
- void *ud = rspamd_lua_check_udata(L, 1, rspamd_statfile_classname);
- luaL_argcheck(L, ud != NULL, 1, "'statfile' expected");
- return ud ? *((struct rspamd_statfile_config **) ud) : NULL;
- }
-
-
- /* Open functions */
-
- void luaopen_classifier(lua_State *L)
- {
- rspamd_lua_new_class(L, rspamd_classifier_classname, classifierlib_m);
- lua_pop(L, 1); /* remove metatable from stack */
- }
-
- void luaopen_statfile(lua_State *L)
- {
- rspamd_lua_new_class(L, rspamd_statfile_classname, statfilelib_m);
- lua_pop(L, 1); /* remove metatable from stack */
- }
|