summaryrefslogtreecommitdiffstats
path: root/src/lua/lua_classifier.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lua/lua_classifier.c230
1 files changed, 230 insertions, 0 deletions
diff --git a/src/lua/lua_classifier.c b/src/lua/lua_classifier.c
new file mode 100644
index 0000000..39580a6
--- /dev/null
+++ b/src/lua/lua_classifier.c
@@ -0,0 +1,230 @@
+/*-
+ * 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}");
+ luaL_argcheck(L, ud != NULL, 1, "'classifier' expected");
+ return ud ? *((struct rspamd_classifier_config **) ud) : NULL;
+}
+
+/* Return table of statfiles indexed by name */
+static gint
+lua_classifier_get_statfiles(lua_State *L)
+{
+ struct rspamd_classifier_config *ccf = lua_check_classifier(L);
+ GList *cur;
+ struct rspamd_statfile_config *st, **pst;
+ gint 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}", -1);
+ *pst = st;
+ lua_rawseti(L, -2, i++);
+
+ cur = g_list_next(cur);
+ }
+ }
+ else {
+ lua_pushnil(L);
+ }
+
+ return 1;
+}
+
+static gint
+lua_classifier_get_param(lua_State *L)
+{
+ struct rspamd_classifier_config *ccf = lua_check_classifier(L);
+ const gchar *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 gint
+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 gchar *label;
+ GList *cur;
+ gint 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}", -1);
+ *pst = st;
+ lua_rawseti(L, -2, i++);
+ cur = g_list_next(cur);
+ }
+ return 1;
+ }
+ }
+ lua_pushnil(L);
+ return 1;
+}
+
+/* Statfile functions */
+static gint
+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 gint
+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 gint
+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 gint
+lua_statfile_get_param(lua_State *L)
+{
+ struct rspamd_statfile_config *st = lua_check_statfile(L);
+ const gchar *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}");
+ 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}", classifierlib_m);
+ lua_pop(L, 1); /* remove metatable from stack */
+}
+
+void luaopen_statfile(lua_State *L)
+{
+ rspamd_lua_new_class(L, "rspamd{statfile}", statfilelib_m);
+ lua_pop(L, 1); /* remove metatable from stack */
+}