]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
*-login: Added login_plugins and login_plugin_dir settings.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 15 Jan 2016 14:07:32 +0000 (16:07 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 15 Jan 2016 16:31:52 +0000 (18:31 +0200)
src/login-common/Makefile.am
src/login-common/login-settings.c
src/login-common/login-settings.h
src/login-common/main.c

index 402ae742d3ab25f9b7bab8123fff09398912b306..7340e6b3063e5bca363d0334249df6d986a61466 100644 (file)
@@ -8,7 +8,8 @@ AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib-master \
        -I$(top_srcdir)/src/lib-ssl-iostream \
        -I$(top_srcdir)/src/lib-mail \
-       -DPKG_STATEDIR=\""$(statedir)"\"
+       -DPKG_STATEDIR=\""$(statedir)"\" \
+       -DMODULEDIR=\""$(moduledir)"\"
 
 liblogin_la_SOURCES = \
        access-lookup.c \
index 30293901a006b42a61fb71fbb133faf72ac0938f..f8945f1694e8898b424a88141588155cbd3ce8c9 100644 (file)
@@ -26,6 +26,8 @@ static const struct setting_define login_setting_defines[] = {
        DEF(SET_STR, login_log_format_elements),
        DEF(SET_STR, login_log_format),
        DEF(SET_STR, login_access_sockets),
+       DEF(SET_STR, login_plugin_dir),
+       DEF(SET_STR, login_plugins),
        DEF(SET_TIME, login_proxy_max_disconnect_delay),
        DEF(SET_STR, director_username_hash),
 
@@ -52,6 +54,8 @@ static const struct login_settings login_default_settings = {
        .login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c session=<%{session}>",
        .login_log_format = "%$: %s",
        .login_access_sockets = "",
+       .login_plugin_dir = MODULEDIR"/login",
+       .login_plugins = "",
        .login_proxy_max_disconnect_delay = 0,
        .director_username_hash = "%u",
 
index cc8e9280977537d421d84827ddd97d76365c3152..c297fceb123cc3f2eb3182d8f332f1d9e495ed6e 100644 (file)
@@ -9,6 +9,8 @@ struct login_settings {
        const char *login_greeting;
        const char *login_log_format_elements, *login_log_format;
        const char *login_access_sockets;
+       const char *login_plugin_dir;
+       const char *login_plugins;
        unsigned int login_proxy_max_disconnect_delay;
        const char *director_username_hash;
 
index 7587f58abb7e43eacb26a13e3ce9314ceb43aac3..a3a4289884280db0125688839edc94197951c49c 100644 (file)
@@ -4,6 +4,7 @@
 #include "ioloop.h"
 #include "array.h"
 #include "randgen.h"
+#include "module-dir.h"
 #include "process-title.h"
 #include "restrict-access.h"
 #include "restrict-process-size.h"
@@ -47,6 +48,7 @@ void **global_other_settings;
 const struct ip_addr *login_source_ips;
 unsigned int login_source_ips_idx, login_source_ips_count;
 
+static struct module *modules;
 static struct timeout *auth_client_to;
 static bool shutting_down = FALSE;
 static bool ssl_connections = FALSE;
@@ -302,6 +304,26 @@ parse_login_source_ips(const char *ips_str, unsigned int *count_r)
        return array_get(&ips, count_r);
 }
 
+static void login_load_modules(void)
+{
+       struct module_dir_load_settings mod_set;
+
+       if (global_login_settings->login_plugins[0] == '\0')
+               return;
+
+       memset(&mod_set, 0, sizeof(mod_set));
+       mod_set.abi_version = DOVECOT_ABI_VERSION;
+       mod_set.binary_name = login_binary->process_name;
+       mod_set.setting_name = "logi_plugins";
+       mod_set.require_init_funcs = TRUE;
+       mod_set.debug = login_debug;
+
+       modules = module_dir_load(global_login_settings->login_plugin_dir,
+                                 global_login_settings->login_plugins,
+                                 &mod_set);
+       module_dir_init(modules);
+}
+
 static void main_preinit(void)
 {
        unsigned int max_fds;
@@ -348,6 +370,8 @@ static void main_preinit(void)
                login_source_ips_idx = rand() % login_source_ips_count;
        }
 
+       login_load_modules();
+
        restrict_access_by_env(NULL, TRUE);
        if (login_debug)
                restrict_access_allow_coredumps(TRUE);