main.c revision a73052375a6696e47dbb0bd492974cece1b5fde7
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenstatic struct mail_storage_service_ctx *storage_service;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenstatic struct master_login *master_login = NULL;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenimap_client_created_func_t *hook_client_created = NULL;
e188bab0b830136d04a1dd8b55e9afefae20d930Timo Sirainenimap_client_created_hook_set(imap_client_created_func_t *new_hook)
5a3f143585110536a7f72628e66a42b998bfc5fcTimo Sirainen imap_client_created_func_t *old_hook = hook_client_created;
659fe5d24825b160cae512538088020d97a60239Timo Sirainen for (cmd = client->command_queue; cmd != NULL; cmd = cmd->next) {
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen if (str_len(title) < IMAP_PROCTITLE_PREFERRED_LEN) {
659fe5d24825b160cae512538088020d97a60239Timo Sirainen if (cmd->state == CLIENT_COMMAND_STATE_WAIT_OUTPUT)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen str_printfa(title, " - %"PRIuSIZE_T" bytes waiting",
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen o_stream_get_buffer_used_size(client->output));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_printfa(title, "%u connections", imap_client_count);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenstatic void client_kill_idle(struct client *client)
838f56174b963779a88083a0d0e85b30d2d846e7Timo Sirainen client_send_line(client, "* BYE Server shutting down.");
894987bf45718f8849cc3898afdfb1ac3cfa2445Timo Sirainen mail_storage_service_io_activate_user(client->service_user);
894987bf45718f8849cc3898afdfb1ac3cfa2445Timo Sirainen client_destroy(client, "Server shutting down.");
838f56174b963779a88083a0d0e85b30d2d846e7Timo Sirainenstatic void imap_die(void)
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen time_t stop_timestamp = now - IMAP_DIE_IDLE_SECS;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen for (client = imap_clients; client != NULL; client = next) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen last_io = I_MAX(client->last_input, client->last_output);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen stop_msecs = (last_io - stop_timestamp) * 1000;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen const char *tag;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen const unsigned char *input;
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainenclient_parse_input(const unsigned char *data, size_t len,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenclient_add_input_capability(struct client *client, const unsigned char *client_input,
0d70a702dec63d22535684fec6a7247c5f153208Timo Sirainen client_parse_input(client_input, client_input_size, &input);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen !i_stream_add_data(client->input, input.input,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen i_panic("Couldn't add client input to stream");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* IMAPLOGINTAG environment is compatible with mailfront */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* cork/uncork around the OK reply to minimize latency */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen "* PREAUTH [CAPABILITY ",
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen "Logged in as ", client->user->username, NULL));
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* client doesn't seem to understand tagged capabilities. send
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen untagged instead and hope that it works. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen client_send_line(client, t_strconcat("* CAPABILITY ",
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen t_strconcat(input.tag, " OK Logged in", NULL));
0d0451206a91e9f96e522075dce28a89adc2325dTimo Sirainen str_c(client->capability_string), "] Logged in", NULL));
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainenclient_add_input_finalize(struct client *client)
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* try to condense any responses into as few packets as possible */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* we could have already handled LOGOUT, or we might need to continue
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pending ambiguous commands. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint client_create_from_input(const struct mail_storage_service_input *input,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct client **client_r, const char **error_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_service_input service_input;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen event_add_category(event, &event_category_imap);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen event_add_fields(event, (const struct event_add_field []){
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen { .key = "session", .value = input->session_id },
77bc2bda5b781c4ffddc8a74b175cf32e9e2c2ecTimo Sirainen if (mail_storage_service_lookup_next(storage_service, &service_input,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen smtp_set = mail_storage_service_user_get_set(user)[1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen imap_set = mail_storage_service_user_get_set(user)[2];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (settings_var_expand(&smtp_submit_setting_parser_info, smtp_set,
3ee5f5427b36ea30a01561b35f4002232db7b061Timo Sirainen mail_user->pool, mail_user_var_expand_table(mail_user),
3ee5f5427b36ea30a01561b35f4002232db7b061Timo Sirainen settings_var_expand(&imap_setting_parser_info, imap_set,
a050ca9def13949dbaa67bd6574a41c4f397ae26Timo Sirainen mail_user->pool, mail_user_var_expand_table(mail_user),
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen *error_r = t_strdup_printf("Failed to expand settings: %s", errstr);
6c2ddb9f586e6392552ddfb82ab55e57fcfc4110Timo Sirainen client = client_create(fd_in, fd_out, input->session_id,
1be964ec6d835f95b4fdebf02add9265d58ad290Timo Sirainen client->userdb_fields = input->userdb_fields == NULL ? NULL :
1be964ec6d835f95b4fdebf02add9265d58ad290Timo Sirainen p_strarray_dup(client->pool, input->userdb_fields);
const char *error;
const char *errormsg)
const char *msg;
* quickly send back the OK response to LOGIN/AUTHENTICATE.
if (IS_STANDALONE()) {
return FATAL_DEFAULT;
const char *error;
if (!IS_STANDALONE())
if (IS_STANDALONE()) {
T_BEGIN {
} T_END;