main.c revision 717bb0dbaf4bd3f745669570647845e6d493bfe0
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#define AUTH_CLIENT_IDLE_TIMEOUT_MSECS (1000*60)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenconst struct login_settings *global_login_settings;
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainenstatic void login_access_lookup_next(struct login_access_lookup *lookup);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if (!global_login_settings->verbose_proctitle)
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen } else if (clients_get_count() > 1 || client == NULL) {
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen process_title_set(t_strdup_printf("[%u connections (%u TLS)]",
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen } else if ((addr = net_ip2addr(&client->ip)) != NULL) {
dfaefeabae939803ceb8c503101e86b5496541d1Timo Sirainen process_title_set(t_strdup_printf(client->tls ?
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen process_title_set(client->tls ? "[TLS]" : "");
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainenstatic void auth_client_idle_timeout(struct auth_client *auth_client)
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen auth_client_disconnect(auth_client, "idle disconnect");
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen if (clients == NULL && auth_client_to == NULL) {
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen auth_client_to = timeout_add(AUTH_CLIENT_IDLE_TIMEOUT_MSECS,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenstatic void login_die(void)
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen /* we don't have auth client, and we might never get one */
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenclient_connected_finish(const struct master_service_connection *conn)
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen if (net_getsockname(conn->fd, &local_ip, &local_port) < 0) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen pool = pool_alloconly_create("login client", 8*1024);
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen client = client_create(conn->fd, FALSE, pool, set, other_sets,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen fd_ssl = ssl_proxy_alloc(conn->fd, &conn->remote_ip, set,
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen master_service_client_connection_destroyed(master_service);
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen client = client_create(fd_ssl, TRUE, pool, set, other_sets,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void login_access_lookup_free(struct login_access_lookup *lookup)
e03d986a74128f5ba30fcfda9f6e36578f5d8decTimo Sirainen master_service_client_connection_destroyed(master_service);
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen p_strsplit_free(default_pool, lookup->sockets);
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainenstatic void login_access_callback(bool success, void *context)
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainenstatic void login_access_lookup_next(struct login_access_lookup *lookup)
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen /* last one */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen lookup->access = access_lookup(*lookup->next_socket, lookup->conn.fd,
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainenstatic void client_input_error(struct login_access_lookup *lookup)
4b41116563110d00330896a568eff1078c382827Timo Sirainen i_info("access(%s): Client disconnected during lookup (rip=%s)",
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen /* actual input. stop listening until lookup is done. */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen master_service_client_connection_accept(conn);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* log the connection's IP address in case we crash. it's of
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen course possible that another earlier client causes the
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen crash, but this is better than nothing. */
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen /* make sure we're connected (or attempting to connect) to auth */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* no access checks */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lookup = i_new(struct login_access_lookup, 1);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen lookup->io = io_add(conn->fd, IO_READ, client_input_error, lookup);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen lookup->sockets = p_strsplit_spaces(default_pool, access_sockets, " ");
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainenstatic void auth_connect_notify(struct auth_client *client ATTR_UNUSED,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* auth disconnected without having ever succeeded, so the
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen auth process is probably misconfigured. no point in
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen keeping the client connections hanging. */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen clients_destroy_all_reason("Disconnected: Auth process broken");
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen master_service_stop_new_connections(master_service);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenstatic void main_preinit(bool allow_core_dumps)
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen unsigned int max_fds;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* Initialize SSL proxy so it can read certificate and private
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen /* set the number of fds we want to use. it may get increased or
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen decreased. leave a couple of extra fds for auth sockets and such.
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen worst case each connection can use:
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen - 1 for client
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen - 1 for login proxy
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen - 2 for client-side ssl proxy
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen - 2 for server-side ssl proxy (with login proxy)
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen master_service_get_socket_count(master_service) +
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen master_service_get_client_limit(master_service)*6;
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen io_loop_set_max_fd_count(current_ioloop, max_fds);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen i_assert(strcmp(global_login_settings->ssl, "no") == 0 ||
546335814920fb6b5b44c68c7803e654eefeae9dTimo Sirainen if (global_login_settings->mail_max_userip_connections > 0) {
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen anvil = anvil_client_init("anvil", anvil_reconnect_callback, 0);
bd4e36a8cd7257cca7d1434c49a1e343ed7c5100Timo Sirainen initial_service_count = master_service_get_service_count(master_service);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (restrict_access_get_current_chroot() == NULL) {
6ae329de09afb7214c906d762320847e05469d53Timo Sirainen i_error("access(%s, wx) failed: %m - disabling rawlog",
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainenstatic void main_init(const char *login_socket)
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainen /* make sure we can't fork() */
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen master_service_set_avail_overflow_callback(master_service,
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen master_service_set_die_callback(master_service, login_die);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen auth_client = auth_client_init(login_socket, (unsigned int)getpid(),
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen auth_client_set_connect_notify(auth_client, auth_connect_notify, NULL);
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen master_auth = master_auth_init(master_service, login_binary->protocol);
f90cbe597c41d5cc91debd371f8648bd8e6ffbc2Timo Sirainenstatic void main_deinit(void)
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainenint login_binary_run(const struct login_binary *binary,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen const char *login_socket = DEFAULT_LOGIN_SOCKET;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen master_service = master_service_init(login_binary->process_name,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen master_service_init_log(master_service, t_strconcat(
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen set_pool = pool_alloconly_create("global login settings", 4096);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen login_settings_read(set_pool, NULL, NULL, NULL,