client.c revision 2e37d45867d081db150ab78dad303b9077aea24f
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen/* Disconnect client when it sends too many bad commands */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic bool cmd_stls(struct pop3_client *client)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic bool cmd_quit(struct pop3_client *client)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen client_send_line(&client->common, CLIENT_CMD_REPLY_OK, "Logging out");
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen client_destroy(&client->common, "Aborted login");
d22301419109ed4a38351715e6760011421dadecTimo Sirainenstatic bool client_command_execute(struct pop3_client *client, const char *cmd,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen client_send_line(&client->common, CLIENT_CMD_REPLY_BAD,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen "Unknown command.");
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic void pop3_client_input(struct client *client)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct pop3_client *pop3_client = (struct pop3_client *)client;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen /* if a command starts an authentication, stop processing further
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen commands until the authentication is finished. */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen while (!client->output->closed && !client->authenticating &&
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen (line = i_stream_next_line(client->input)) != NULL) {
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen else if (++client->bad_counter > CLIENT_MAX_BAD_COMMANDS) {
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen client_send_line(client, CLIENT_CMD_REPLY_BYE,
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen "Too many invalid bad commands.");
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen "Disconnected: Too many bad commands");
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (auth_client != NULL && !auth_client_is_connected(auth_client))
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic struct client *pop3_client_alloc(pool_t pool)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen pop3_client = p_new(pool, struct pop3_client, 1);
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenstatic void pop3_client_create(struct client *client ATTR_UNUSED,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenstatic void pop3_client_destroy(struct client *client)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct pop3_client *pop3_client = (struct pop3_client *)client;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic char *get_apop_challenge(struct pop3_client *client)
09c08fad8e7cc694a6c8d1711e67839acd3a2f04Timo Sirainen unsigned char buffer_base64[MAX_BASE64_ENCODED_SIZE(sizeof(buffer)) + 1];
9ffdc9d18870acef2e4dde99715d8528ff4b080dTimo Sirainen if (auth_client_find_mech(auth_client, "APOP") == NULL) {
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen /* disabled, no need to present the challenge */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen auth_client_get_connect_id(auth_client, &client->apop_server_pid,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen buffer_create_data(&buf, buffer_base64, sizeof(buffer_base64));
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen (unsigned long)ioloop_time,
e3796bfd2bc0fd5ba664893d346df9334a5b3af0Timo Sirainenstatic void pop3_client_send_greeting(struct client *client)
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainen struct pop3_client *pop3_client = (struct pop3_client *)client;
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen client->io = io_add(client->fd, IO_READ, client_input, client);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen pop3_client->apop_challenge = get_apop_challenge(pop3_client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic void pop3_client_starttls(struct client *client ATTR_UNUSED)
const char *text)
switch (reply) {
case CLIENT_CMD_REPLY_OK:
case CLIENT_CMD_REPLY_BAD:
case CLIENT_CMD_REPLY_BYE:
case CLIENT_CMD_REPLY_STATUS:
T_BEGIN {
} T_END;
static void pop3_login_die(void)
void clients_init(void)
void clients_deinit(void)
NULL,
NULL,