]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Add flags for rspamd_lua_parse_table_arguments
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Jul 2019 10:08:43 +0000 (11:08 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Jul 2019 10:08:43 +0000 (11:08 +0100)
src/lua/lua_common.c
src/lua/lua_common.h
src/lua/lua_config.c
src/lua/lua_dns.c
src/lua/lua_dns_resolver.c
src/lua/lua_map.c
src/lua/lua_task.c
src/lua/lua_tcp.c
src/lua/lua_worker.c
src/plugins/dkim_check.c

index 785042b8e74a5181dd987f1990c92af8c2480e23..354a932f90e1eb90727bb745c0a42d8a1f604d39 100644 (file)
@@ -1238,7 +1238,9 @@ rspamd_lua_add_preload (lua_State *L, const gchar *name, lua_CFunction func)
 
 gboolean
 rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
-               GError **err, const gchar *extraction_pattern, ...)
+                                                                 GError **err,
+                                                                 enum rspamd_lua_parse_arguments_flags how,
+                                                                 const gchar *extraction_pattern, ...)
 {
        const gchar *p, *key = NULL, *end, *cls;
        va_list ap;
@@ -1314,7 +1316,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap, const gchar **)) = NULL;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, const gchar **)) = NULL;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1341,7 +1346,9 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap,  gint64 *)) = 0;
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, gint64 *)) = 0;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1372,7 +1379,11 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap,  gint *)) = -1;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, gint *)) = -1;
+                                       }
+
                                        if (is_table) {
                                                lua_pop (L, 1);
                                        }
@@ -1404,7 +1415,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap,  gboolean *)) = 0;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, gboolean *)) = 0;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1432,7 +1446,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap,  gdouble *)) = 0;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, gdouble *)) = 0;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1460,7 +1477,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap,  gdouble *)) = NAN;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, gdouble *)) = NAN;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1491,8 +1511,11 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap, const char **)) = NULL;
-                                       *valuelen = 0;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, const char **)) = NULL;
+                                               *valuelen = 0;
+                                       }
                                }
                                else {
                                        g_set_error (err,
@@ -1520,7 +1543,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                                }
                                else {
                                        failed = TRUE;
-                                       *(va_arg (ap, ucl_object_t **)) = NULL;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, ucl_object_t **)) = NULL;
+                                       }
                                }
 
                                if (is_table) {
@@ -1530,7 +1556,10 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
                        case 'U':
                                if (t == LUA_TNIL || t == LUA_TNONE) {
                                        failed = TRUE;
-                                       *(va_arg (ap, void **)) = NULL;
+
+                                       if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+                                               *(va_arg (ap, void **)) = NULL;
+                                       }
                                }
                                else if (t != LUA_TUSERDATA) {
                                        g_set_error (err,
index 32b17a2fc553fca0871944ad71d4962310d56aaf..93bb5a28e0eae4c6b5d0b5726d31ac52b97f4930 100644 (file)
@@ -321,6 +321,10 @@ struct rspamd_async_session* lua_check_session (lua_State * L, gint pos);
 struct ev_loop* lua_check_ev_base (lua_State * L, gint pos);
 struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos);
 
+enum rspamd_lua_parse_arguments_flags {
+       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT = 0,
+       RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING,
+};
 /**
  * Extract an arguments from lua table according to format string. Supported arguments are:
  * [*]key=S|I|N|B|V|U{a-z};[key=...]
@@ -337,11 +341,14 @@ struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos);
  * @param L lua state
  * @param pos at which pos start extraction
  * @param err error pointer
+ * @param how extraction type
  * @param extraction_pattern static pattern
  * @return TRUE if a table has been parsed
  */
 gboolean rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
-               GError **err, const gchar *extraction_pattern, ...);
+                                                                                  GError **err,
+                                                                                  enum rspamd_lua_parse_arguments_flags how,
+                                                                                  const gchar *extraction_pattern, ...);
 
 
 gint rspamd_lua_traceback (lua_State *L);
index c171c483ab6715bae7a02dbfb439a1679f82415e..18baf855183aab0d91d92231922730430b4ffd2f 100644 (file)
@@ -1892,6 +1892,7 @@ lua_config_register_symbol (lua_State * 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",
@@ -2227,6 +2228,7 @@ lua_config_set_metric_symbol (lua_State * L)
 
                if (lua_type (L, 2) == LUA_TTABLE) {
                        if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                        "*name=S;score=N;description=S;"
                                        "group=S;one_shot=B;one_param=B;priority=N;flags=S;"
                                        "nshots=I",
@@ -2376,6 +2378,7 @@ lua_config_set_metric_action (lua_State * L)
 
                if (lua_type (L, 2) == LUA_TTABLE) {
                        if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                        "*action=S;score=N;"
                                        "priority=N",
                                        &name, &threshold,
@@ -2881,6 +2884,7 @@ lua_config_register_regexp (lua_State *L)
         */
        if (cfg != NULL) {
                if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                               RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                "*re=U{regexp};*type=S;header=S;pcre_only=B",
                                &re, &type_str, &header_str, &pcre_only)) {
                        msg_err_config ("cannot get parameters list: %e", err);
@@ -2947,6 +2951,7 @@ lua_config_replace_regexp (lua_State *L)
 
        if (cfg != NULL) {
                if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                               RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                "*old_re=U{regexp};*new_re=U{regexp}",
                                &old_re, &new_re)) {
                        msg_err_config ("cannot get parameters list: %e", err);
@@ -3686,6 +3691,7 @@ lua_config_add_doc (lua_State *L)
        if (cfg && option && doc_string) {
                if (lua_type (L, 5) == LUA_TTABLE) {
                        if (!rspamd_lua_parse_table_arguments (L, 5, &err,
+                                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                        "type=S;default=S;required=B",
                                        &type_str, &default_value, &required)) {
                                msg_err_config ("cannot get parameters list: %e", err);
index 033b07fb443f278d394bd7dab9c9525f5c5c9aea..0fdbe3f70e141674936330196d18eae840b3781e 100644 (file)
@@ -51,6 +51,7 @@ lua_dns_request (lua_State *L)
 
        /* Check arguments */
        if (!rspamd_lua_parse_table_arguments (L, 1, &err,
+                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                        "*name=S;task=U{task};*type=S;forced=B;session=U{session};config=U{config}",
                        &to_resolve,
                        &task,
index 382e9e985f6fae42b72ae03622ce1d8b5fffa9b4..a4e3b4b03a9a8d3ff01efabe2117b5974470ab3a 100644 (file)
@@ -360,6 +360,7 @@ lua_dns_resolver_resolve_common (lua_State *L,
 
        /* Check arguments */
        if (!rspamd_lua_parse_table_arguments (L, first, &err,
+                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                        "session=U{session};mempool=U{mempool};*name=S;*callback=F;"
                        "option=S;task=U{task};forced=B",
                        &session, &pool, &to_resolve, &cbref, &user_str, &task, &forced)) {
index 3ba7d0ed1a090e0dc8d09b3f7169eb78e9945559..9c90cdf5503c4fe37fcf9d9aa79e570ea295ed48 100644 (file)
@@ -493,6 +493,7 @@ lua_config_add_map (lua_State *L)
 
        if (cfg) {
                if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                               RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                "*url=O;description=S;callback=F;type=S",
                                &map_obj, &description, &cbidx, &type)) {
                        ret = luaL_error (L, "invalid table arguments: %s", err->message);
index 0ffe4b8c5a7b2285249f1e2ea2f9b3e4fa242c93..f9033eef832c4c5af4f0ed1888c4dbfd610739fe 100644 (file)
@@ -5011,6 +5011,7 @@ lua_task_store_in_file (lua_State *L)
        if (task) {
                if (lua_istable (L, 2)) {
                        if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                                        "filename=S;tmpmask=S;mode=I;force_new=B;keep=B",
                                        &fname, &tmpmask, &mode, &force_new, &keep)) {
                                msg_err_task ("cannot get parameters list: %e", err);
@@ -5112,9 +5113,10 @@ lua_task_process_regexp (lua_State *L)
         */
        if (task != NULL) {
                if (!rspamd_lua_parse_table_arguments (L, 2, &err,
-                                       "*re=U{regexp};*type=S;header=V;strong=B",
-                                       &re, &type_str, &header_len, &header_str,
-                                       &strong)) {
+                               RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
+                               "*re=U{regexp};*type=S;header=V;strong=B",
+                               &re, &type_str, &header_len, &header_str,
+                               &strong)) {
                        msg_err_task ("cannot get parameters list: %e", err);
 
                        if (err) {
index e2f55e78b3c8fb7fd02822a9f02326de7cc19c67..371e72d5c241819a6b52ea60b8fa56b3e6f09b28 100644 (file)
@@ -1797,6 +1797,7 @@ lua_tcp_connect_sync (lua_State *L)
        struct ev_loop *ev_base = NULL;
 
        int arguments_validated = rspamd_lua_parse_table_arguments (L, 1, &err,
+                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                        "task=U{task};session=U{session};resolver=U{resolver};ev_base=U{ev_base};"
                        "*host=S;*port=I;timeout=D;config=U{config}",
                        &task, &session, &resolver, &ev_base,
index 73f8baea14bbaead1de686fb4495a94e2ac7d45a..8b69b71ef7dc8d47adc6bdc02ac0a07f0b1b30a4 100644 (file)
@@ -546,6 +546,7 @@ lua_worker_spawn_process (lua_State *L)
        gint func_cbref, cb_cbref;
 
        if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                        "func=F;exec=S;stdin=V;*on_complete=F", &func_cbref,
                        &cmdline, &inputlen, &input, &cb_cbref)) {
                msg_err ("cannot get parameters list: %e", err);
index e1edbccd80a859f577b152029f4355adf9e164b9..7d3475867960d50c6effc219acd97ba8b6157583 100644 (file)
@@ -701,6 +701,7 @@ lua_dkim_sign_handler (lua_State *L)
         * - key
         */
        if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+                       RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
                        "key=V;rawkey=V;*domain=S;*selector=S;no_cache=B;headers=S;"
                        "sign_type=S;arc_idx=I;arc_cv=S;expire=I;pubkey=S;"
                        "strict_pubkey_check=B",