imap-login-client.c revision 8ed26469c3b0d314c7eee1461de8b8d89e1c2010
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen# error LOGIN_MAX_INBUF_SIZE too short to fit all ID command parameters
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen/* maximum length for IMAP command line. */
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen/* Disconnect client when it sends too many bad commands */
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainenstatic const char *const imap_login_reserved_id_keys[] = {
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-originating-ip",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-originating-port",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-connected-ip",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-connected-port",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-proxy-ttl",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-session-id",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen "x-session-ext-id",
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen/* Skip incoming data until newline is found,
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen returns TRUE if newline was found. */
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainenbool client_skip_line(struct imap_client *client)
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen const unsigned char *data;
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen data = i_stream_get_data(client->common.input, &data_size);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen for (i = 0; i < data_size; i++) {
73083841b92505091b7d1070554930651b91b701Aki Tuomistatic bool client_handle_parser_error(struct imap_client *client,
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen const char *msg;
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen msg = imap_parser_get_error(parser, &parse_error);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen client_send_reply(&client->common, IMAP_CMD_REPLY_BAD, msg);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainenstatic bool is_login_cmd_disabled(struct client *client)
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen if (auth_client_find_mech(auth_client, "PLAIN") == NULL) {
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen /* no PLAIN authentication, can't use LOGIN command */
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen if (strcmp(client->ssl_set->ssl, "required") == 0)
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainenstatic const char *get_capability(struct client *client)
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen struct imap_client *imap_client = (struct imap_client *)client;
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen if (*imap_client->set->imap_capability == '\0')
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen str_append(cap_str, CAPABILITY_BANNER_STRING);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen else if (*imap_client->set->imap_capability != '+') {
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen str_append(cap_str, imap_client->set->imap_capability);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen str_append(cap_str, CAPABILITY_BANNER_STRING);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen str_append(cap_str, imap_client->set->imap_capability + 1);
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen if (client_is_tls_enabled(client) && !client->tls)
7f7be2cbf68f8a202a688d5bc50f82483d461643Timo Sirainen client_authenticate_get_capabilities(client, cap_str);
12e5ac049bd74f8b98d9dc62adcb0bf3217beef6Martti Rannanjärvistatic int cmd_capability(struct imap_client *imap_client,
if (success)
return FALSE;
return TRUE;
bool client_id_str;
case IMAP_CLIENT_ID_STATE_KEY:
int ret;
if (ret > 0) {
ret = 0;
if (ret == 0) {
switch (*tag) {
return FALSE;
return FALSE;
return TRUE;
i_unreached();
return FALSE;
bool parsed;
int ret;
return FALSE;
if (ret == 0)
return FALSE;
if (ret < 0)
if (ret < 0)
return TRUE;
if (ret == 0)
return FALSE;
} else if (ret < 0) {
return FALSE;
T_BEGIN {
if (tagged)
} T_END;
switch (reply) {
case IMAP_CMD_REPLY_OK:
case IMAP_CMD_REPLY_NO:
case IMAP_CMD_REPLY_BAD:
case IMAP_CMD_REPLY_BYE:
const char *text)
if (bad)
const char *text)
static void imap_login_preinit(void)
static void imap_login_init(void)
static void imap_login_deinit(void)
NULL,
NULL,