]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Improve symbol type parsing in Lua API
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 29 Jul 2017 14:46:33 +0000 (15:46 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 29 Jul 2017 14:46:33 +0000 (15:46 +0100)
src/lua/lua_config.c

index 7423bdaeb16f1a60e06a2dc06d4598ca56ace768..b01b0c5a095b452a1328bf87098738db3ed75bf3 100644 (file)
@@ -1375,35 +1375,6 @@ lua_config_get_key (lua_State *L)
        return 1;
 }
 
-static gint
-lua_parse_symbol_type (const gchar *str)
-{
-       gint ret = SYMBOL_TYPE_NORMAL;
-
-       if (str) {
-               if (strcmp (str, "virtual") == 0) {
-                       ret = SYMBOL_TYPE_VIRTUAL;
-               }
-               else if (strcmp (str, "callback") == 0) {
-                       ret = SYMBOL_TYPE_CALLBACK;
-               }
-               else if (strcmp (str, "normal") == 0) {
-                       ret = SYMBOL_TYPE_NORMAL;
-               }
-               else if (strcmp (str, "prefilter") == 0) {
-                       ret = SYMBOL_TYPE_PREFILTER|SYMBOL_TYPE_GHOST;
-               }
-               else if (strcmp (str, "postfilter") == 0) {
-                       ret = SYMBOL_TYPE_POSTFILTER|SYMBOL_TYPE_GHOST;
-               }
-               else {
-                       msg_warn ("bad type: %s", str);
-               }
-       }
-
-       return ret;
-}
-
 static gint
 lua_parse_symbol_flags (const gchar *str)
 {
@@ -1430,6 +1401,53 @@ lua_parse_symbol_flags (const gchar *str)
        return ret;
 }
 
+static gint
+lua_parse_symbol_type (const gchar *str)
+{
+       gint ret = SYMBOL_TYPE_NORMAL;
+       gchar **vec;
+       guint i, l;
+
+       if (str) {
+               vec = g_strsplit_set (str, ",;", -1);
+
+               if (vec) {
+                       l = g_strv_length (vec);
+
+                       for (i = 0; i < l; i ++) {
+                               str = vec[i];
+
+                               if (g_ascii_strcasecmp (str, "virtual") == 0) {
+                                       ret = SYMBOL_TYPE_VIRTUAL;
+                               } else if (g_ascii_strcasecmp (str, "callback") == 0) {
+                                       ret = SYMBOL_TYPE_CALLBACK;
+                               } else if (g_ascii_strcasecmp (str, "normal") == 0) {
+                                       ret = SYMBOL_TYPE_NORMAL;
+                               } else if (g_ascii_strcasecmp (str, "prefilter") == 0) {
+                                       ret = SYMBOL_TYPE_PREFILTER | SYMBOL_TYPE_GHOST;
+                               } else if (g_ascii_strcasecmp (str, "postfilter") == 0) {
+                                       ret = SYMBOL_TYPE_POSTFILTER | SYMBOL_TYPE_GHOST;
+                               } else {
+                                       gint fl = 0;
+
+                                       fl = lua_parse_symbol_flags (str);
+
+                                       if (fl == 0) {
+                                               msg_warn ("bad type: %s", str);
+                                       }
+                                       else {
+                                               ret |= fl;
+                                       }
+                               }
+                       }
+
+                       g_strfreev (vec);
+               }
+       }
+
+       return ret;
+}
+
 static gint
 lua_config_register_symbol (lua_State * L)
 {