From: Timo Sirainen Date: Fri, 15 Jan 2016 14:07:32 +0000 (+0200) Subject: *-login: Added login_plugins and login_plugin_dir settings. X-Git-Tag: 2.2.22.rc1~353 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4819488364b20ee82a9d60177d15c79d0b5abbe0;p=thirdparty%2Fdovecot%2Fcore.git *-login: Added login_plugins and login_plugin_dir settings. --- diff --git a/src/login-common/Makefile.am b/src/login-common/Makefile.am index 402ae742d3..7340e6b306 100644 --- a/src/login-common/Makefile.am +++ b/src/login-common/Makefile.am @@ -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 \ diff --git a/src/login-common/login-settings.c b/src/login-common/login-settings.c index 30293901a0..f8945f1694 100644 --- a/src/login-common/login-settings.c +++ b/src/login-common/login-settings.c @@ -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", diff --git a/src/login-common/login-settings.h b/src/login-common/login-settings.h index cc8e928097..c297fceb12 100644 --- a/src/login-common/login-settings.h +++ b/src/login-common/login-settings.h @@ -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; diff --git a/src/login-common/main.c b/src/login-common/main.c index 7587f58abb..a3a4289884 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -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);