]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-lua: Add events to scripts
authorAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 11 Oct 2018 14:06:00 +0000 (17:06 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Wed, 14 Nov 2018 12:11:00 +0000 (14:11 +0200)
src/auth/passdb-lua.c
src/auth/test-lua.c
src/auth/userdb-lua.c
src/lib-lua/dlua-script-private.h
src/lib-lua/dlua-script.c
src/lib-lua/dlua-script.h
src/lib-lua/test-lua.c
src/plugins/mail-lua/mail-lua-plugin.c
src/plugins/push-notification/push-notification-driver-lua.c

index 02dd15f0292c68dbad89d3e60654683ae2ef0266..1c38658c0e6f6a5b94361500c47447f973eda2b1 100644 (file)
@@ -153,7 +153,7 @@ static void passdb_lua_init(struct passdb_module *_module)
                (struct dlua_passdb_module *)_module;
        const char *error;
 
-       if (dlua_script_create_file(module->file, &module->script, &error) < 0 ||
+       if (dlua_script_create_file(module->file, &module->script, auth_event, &error) < 0 ||
            auth_lua_script_init(module->script, &error) < 0)
                i_fatal("passdb-lua: initialization failed: %s", error);
        module->has_password_verify =
index 79ab9eb7ad12d1e014b24c3d64b6c3e39cce104a..fce41b35163b495fde42c90b1b4f2b4ae86c00b7 100644 (file)
@@ -31,7 +31,7 @@ static void test_db_lua_auth_verify(void)
 
         test_begin("auth db lua passdb_verify");
 
-        test_assert(dlua_script_create_string(luascript, &script, &error) == 0);
+        test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0);
         test_assert(auth_lua_script_init(script, &error) == 0);
         if (script != NULL) {
                test_assert(auth_lua_call_password_verify(script, req, "password", &error) == 1);
@@ -67,7 +67,7 @@ static void test_db_lua_auth_lookup(void)
 
        test_begin("auth db lua passdb_lookup");
 
-       test_assert(dlua_script_create_string(luascript, &script, &error) == 0);
+       test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0);
        test_assert(auth_lua_script_init(script, &error) == 0);
        if (script != NULL) {
                test_assert(auth_lua_call_passdb_lookup(script, req, &scheme, &pass, &error) == 1);
index d15451e3fc285437c3d61ea68650df697f8669f9..04f098bf195d58deb5a516d4812eb5a54da8d0bc 100644 (file)
@@ -80,7 +80,7 @@ static void userdb_lua_init(struct userdb_module *_module)
                (struct dlua_userdb_module *)_module;
        const char *error;
 
-       if (dlua_script_create_file(module->file, &module->script, &error) < 0 ||
+       if (dlua_script_create_file(module->file, &module->script, auth_event, &error) < 0 ||
            auth_lua_script_init(module->script, &error) < 0)
                i_fatal("userdb-lua: initialization failed: %s", error);
 }
index ddd7ac8a4a1dd2e4d5d07860faa0788a6206069e..1b5cb01735f514963a51ac729088cf38dd6a8c88 100644 (file)
@@ -41,6 +41,7 @@ struct dlua_script {
 
        lua_State *L;
 
+       struct event *event;
        const char *filename;
        struct istream *in;
        ssize_t last_read;
@@ -68,6 +69,8 @@ struct dlua_table_values {
        } v;
 };
 
+extern struct event_category event_category_lua;
+
 /* Get dlua_script from lua_State */
 struct dlua_script *dlua_script_from_state(lua_State *L);
 
index 2a9b5c3e11a9d95ec60166b627f51bcd059383c2..4b1c63e5c2bec379e43657cca14b1147fb66d265 100644 (file)
 #define LUA_SCRIPT_INIT_FN "script_init"
 #define LUA_SCRIPT_DEINIT_FN "script_deinit"
 
+struct event_category event_category_lua = {
+       .name = "lua",
+};
+
 static struct dlua_script *dlua_scripts = NULL;
 
 static const char *dlua_errstr(int err)
@@ -117,7 +121,8 @@ int dlua_script_init(struct dlua_script *script, const char **error_r)
        return ret;
 }
 
-static struct dlua_script *dlua_create_script(const char *name)
+static struct dlua_script *dlua_create_script(const char *name,
+                                             struct event *event_parent)
 {
        pool_t pool = pool_allocfree_create(t_strdup_printf("lua script %s", name));
        struct dlua_script *script = p_new(pool, struct dlua_script, 1);
@@ -130,6 +135,8 @@ static struct dlua_script *dlua_create_script(const char *name)
        i_assert(script->L != NULL);
        script->ref = 1;
        luaL_openlibs(script->L);
+       script->event = event_create(event_parent);
+       event_add_category(script->event, &event_category_lua);
 
        return script;
 }
@@ -166,6 +173,7 @@ dlua_script_create_finish(struct dlua_script *script, struct dlua_script **scrip
                return -1;
        }
 
+       event_add_str(script->event, "script", script->filename);
        DLLIST_PREPEND(&dlua_scripts, script);
 
        *script_r = script;
@@ -174,7 +182,7 @@ dlua_script_create_finish(struct dlua_script *script, struct dlua_script **scrip
 }
 
 int dlua_script_create_string(const char *str, struct dlua_script **script_r,
-                                 const char **error_r)
+                             struct event *event_parent, const char **error_r)
 {
        struct dlua_script *script;
        int err;
@@ -191,7 +199,7 @@ int dlua_script_create_string(const char *str, struct dlua_script **script_r,
                return 0;
        }
 
-       script = dlua_create_script(fn);
+       script = dlua_create_script(fn, event_parent);
        if ((err = luaL_loadstring(script->L, str)) != 0) {
                *error_r = t_strdup_printf("lua_load(<string>) failed: %s",
                                           dlua_errstr(err));
@@ -203,7 +211,7 @@ int dlua_script_create_string(const char *str, struct dlua_script **script_r,
 }
 
 int dlua_script_create_file(const char *file, struct dlua_script **script_r,
-                               const char **error_r)
+                           struct event *event_parent, const char **error_r)
 {
        struct dlua_script *script;
        int err;
@@ -224,7 +232,7 @@ int dlua_script_create_file(const char *file, struct dlua_script **script_r,
                return -1;
        }
 
-       script = dlua_create_script(file);
+       script = dlua_create_script(file, event_parent);
        if ((err = luaL_loadfile(script->L, file)) != 0) {
                *error_r = t_strdup_printf("lua_load(%s) failed: %s",
                                           file, dlua_errstr(err));
@@ -236,7 +244,7 @@ int dlua_script_create_file(const char *file, struct dlua_script **script_r,
 }
 
 int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r,
-                                 const char **error_r)
+                             struct event *event_parent, const char **error_r)
 {
        struct dlua_script *script;
        const char *filename = i_stream_get_name(is);
@@ -250,7 +258,7 @@ int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r,
                return 0;
        }
 
-       script = dlua_create_script(filename);
+       script = dlua_create_script(filename, event_parent);
        script->in = is;
        script->filename = p_strdup(script->pool, filename);
        if ((err = lua_load(script->L, dlua_reader, script, filename, 0)) < 0) {
@@ -283,6 +291,7 @@ static void dlua_script_destroy(struct dlua_script *script)
        /* remove from list */
        DLLIST_REMOVE(&dlua_scripts, script);
 
+       event_unref(&script->event);
        /* then just release memory */
        pool_unref(&script->pool);
 }
index 8e53f2f5ca1e1b46cb5dfa6464eef2923b9dd694..e5cabece387c9b74c4375ab601fe14a1531c2ee5 100644 (file)
@@ -6,12 +6,12 @@ struct dlua_script;
 /* Parse and load a lua script. Will reuse an existing script
    if found. */
 int dlua_script_create_string(const char *str, struct dlua_script **script_r,
-                                 const char **error_r);
+                             struct event *event_parent, const char **error_r);
 int dlua_script_create_file(const char *file, struct dlua_script **script_r,
-                               const char **error_r);
+                           struct event *event_parent, const char **error_r);
 /* Remember to set script name using i_stream_set_name */
 int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r,
-                                 const char **error_r);
+                             struct event *event_parent, const char **error_r);
 
 /* run dlua_script_init function */
 int dlua_script_init(struct dlua_script *script, const char **error_r);
index 504d50cf31e6d8253825ddbff66fc5a7094a18ac..13be78a323a7522bb6bc4fc01f6ccbd446f4a4d8 100644 (file)
@@ -17,7 +17,7 @@ static void test_lua(void)
 
        test_begin("lua script");
 
-       test_assert(dlua_script_create_string(luascript, &script, &error) == 0);
+       test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0);
        dlua_dovecot_register(script);
        test_assert(dlua_script_init(script, &error) == 0);
        test_assert(dlua_script_has_function(script, "lua_function"));
index a555aa5966bdd7bb4b9de5b73c34dedbab67f8fa..d49adf7b5870cc58d2a5776dcf820cd66f7e9127 100644 (file)
@@ -106,7 +106,7 @@ static void mail_lua_user_created(struct mail_user *user)
        if (script_fn == NULL)
                return;
 
-       if (dlua_script_create_file(script_fn, &script, &error) < 0) {
+       if (dlua_script_create_file(script_fn, &script, user->event, &error) < 0) {
                user->error = p_strdup_printf(user->pool, "dlua_script_create_file(%s) failed: %s",
                                              script_fn, error);
                return;
index 6f01bf419b2de85aa682be036bbc8bf2b96175f5..0d56487fd3c3dd12b35934e5ec08075a5c034f8b 100644 (file)
@@ -93,7 +93,7 @@ push_notification_driver_lua_init(struct push_notification_driver_config *config
 
        push_notification_driver_debug(DLUA_LOG_LABEL, user, "Loading %s", file);
 
-       if (dlua_script_create_file(file, &ctx->script, error_r) < 0) {
+       if (dlua_script_create_file(file, &ctx->script, NULL, error_r) < 0) {
                /* there is a T_POP after this, which will break errors */
                *error_r = p_strdup(pool, *error_r);
                return -1;