main.c revision f859b51cf6aedc3c5b0d2307122100fa9959867f
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
ad004e44be109684521494b5af2ad1da39b8bb27Timo Sirainen#define AUTH_PENALTY_ANVIL_PATH "anvil-auth-penalty"
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic ARRAY_DEFINE(listen_fd_types, enum auth_socket_type);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "[%u wait, %u passdb, %u userdb]",
45155bb1250cf5a120278f349465aded513a100fTimo Sirainen auth_request_state_count[AUTH_REQUEST_STATE_NEW] +
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_request_state_count[AUTH_REQUEST_STATE_MECH_CONTINUE] +
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_request_state_count[AUTH_REQUEST_STATE_FINISHED],
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_request_state_count[AUTH_REQUEST_STATE_PASSDB],
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_request_state_count[AUTH_REQUEST_STATE_USERDB]));
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic const char *const *read_global_settings(void)
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen struct master_service_settings_output set_output;
45155bb1250cf5a120278f349465aded513a100fTimo Sirainen unsigned int i, count;
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_set_pool = pool_alloconly_create("auth settings", 8192);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth_settings_read(NULL, auth_set_pool, &set_output);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* strdup() the service names, because they're allocated from
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen set parser pool, and we'll later clear it. */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen count = str_array_length(set_output.specific_services);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen services = p_new(auth_set_pool, const char *, count + 1);
12cf3d0e03fc70fb0c8b91bc8fd83b4e14d7cdefTimo Sirainen for (i = 0; i < count; i++) {
bb8d0ec26bdd548624d7a7424071cca693b72f55Timo Sirainenstatic void main_preinit(void)
bb8d0ec26bdd548624d7a7424071cca693b72f55Timo Sirainen const char *const *services;
4e35bae013cee5a06d281776a347b534b958aaa4Timo Sirainen /* Open /dev/urandom before chrooting */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* Load built-in SQL drivers (if any) */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* Initialize databases so their configuration files can be readable
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen only by root. Also load all modules here. */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen mod_set.version = master_service_get_version_string(master_service);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen modules = module_dir_load(AUTH_MODULE_DIR, NULL, &mod_set);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen auth_penalty = auth_penalty_init(AUTH_PENALTY_ANVIL_PATH);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen mech_reg = mech_register_init(global_auth_settings);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auths_preinit(global_auth_settings, auth_set_pool,
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* Password lookups etc. may require roots, allow it. */
1d4f710106fb498750456724628da6063e012e6dTimo Sirainenstatic void main_init(void)
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* If auth caches aren't used, just ignore these signals */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* workers have only a single connection from the master
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen auth process */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen master_service_set_client_limit(master_service, 1);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* caching is handled only by the main auth process */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic void main_deinit(void)
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen auth_worker_client_destroy(&auth_worker_client);
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainen /* allow modules to unregister their dbs/drivers/etc. before freeing
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainen the whole data structures containing them. */
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainenstatic void worker_connected(struct master_service_connection *conn)
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainen i_error("Auth workers can handle only a single client");
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainen master_service_client_connection_accept(conn);
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainen (void)auth_worker_client_create(auth_find_service(NULL), conn->fd);
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
38318f5e82662615cd88e99e398efe4a630ce020Timo Sirainen type = array_idx_modifiable(&listen_fd_types, conn->listen_fd);
name++;
suffix++;
switch (*type) {
case AUTH_SOCKET_MASTER:
case AUTH_SOCKET_USERDB:
case AUTH_SOCKET_LOGIN_CLIENT:
case AUTH_SOCKET_CLIENT:
i_unreached();
static void auth_die(void)
return FATAL_DEFAULT;
main_preinit();
main_init();
main_deinit();