client-authenticate.c revision 2e37d45867d081db150ab78dad303b9077aea24f
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenconst char *capability_string = POP3_CAPABILITY_REPLY;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenbool cmd_capa(struct pop3_client *client, const char *args ATTR_UNUSED)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i, count;
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen if (!client->common.set->disable_plaintext_auth ||
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen mech = sasl_server_get_advertised_mechs(&client->common, &count);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen for (i = 0; i < count; i++) {
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainenbool pop3_client_auth_handle_reply(struct client *client,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_AUTH_FAILED,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_AUTH_FAIL_TEMP,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen client_send_line(client, CLIENT_CMD_REPLY_AUTH_FAILED,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenbool cmd_auth(struct pop3_client *pop3_client, const char *args)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *mech_name, *p;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen /* Old-style SASL discovery, used by MS Outlook */
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen unsigned int i, count;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen mech = sasl_server_get_advertised_mechs(client, &count);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen for (i = 0; i < count; i++) {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen /* <mechanism name> <initial response> */
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen (void)client_auth_begin(client, mech_name, args);
d161e3c2cde2bd8d5917840f68823a2259ed426eTimo Sirainenbool cmd_user(struct pop3_client *pop3_client, const char *args)
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen if (!client_check_plaintext_auth(&pop3_client->common, FALSE))
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen client_send_raw(&pop3_client->common, "+OK\r\n");
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainenbool cmd_pass(struct pop3_client *pop3_client, const char *args)
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen /* client may ignore the USER reply and only display the error
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen message from PASS */
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen if (!client_check_plaintext_auth(client, TRUE))
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_BAD,
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "No username given.");
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen /* authorization ID \0 authentication ID \0 pass */
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen str_append(plain_login, pop3_client->last_user);
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen base64 = buffer_create_dynamic(pool_datastack_create(),
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen base64_encode(plain_login->data, plain_login->used, base64);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen (void)client_auth_begin(client, "PLAIN", str_c(base64));
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainenbool cmd_apop(struct pop3_client *pop3_client, const char *args)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen const char *p;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen client_log(client, "APOP failed: APOP not enabled");
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_BAD,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "APOP not enabled.");
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen /* <username> <md5 sum in hex> */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen client_log(client, "APOP failed: Invalid parameters");
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen client_send_line(client, CLIENT_CMD_REPLY_BAD,
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen "Invalid parameters.");
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen /* APOP challenge \0 username \0 APOP response */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen apop_data = buffer_create_dynamic(pool_datastack_create(), 128);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen buffer_append(apop_data, pop3_client->apop_challenge,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen buffer_append(apop_data, args, (size_t)(p-args));
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "Invalid characters in MD5 response");
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_BAD,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "Invalid characters in MD5 response.");
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen base64 = buffer_create_dynamic(pool_datastack_create(),
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen base64_encode(apop_data->data, apop_data->used, base64);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen auth_client_get_connect_id(auth_client, &server_pid, &connect_uid);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (pop3_client->apop_server_pid != server_pid ||
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen pop3_client->apop_connect_uid != connect_uid) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen /* we reconnected to auth server and can't authenticate
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen with APOP in this session anymore. disconnecting the user
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen is probably the best solution now. */
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "Reconnected to auth server, can't do APOP");
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen (void)client_auth_begin(client, "APOP", str_c(base64));