client-authenticate.c revision 9439bed2f07d6475febd8a247cd2f0990fb32a13
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (C) 2002-2004 Timo Sirainen */
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenconst char *client_authenticate_get_capabilities(int secured)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen unsigned int i, count;
395682d473b161c86165e7b9323ce4e45afb94bdTimo Sirainen mech = auth_client_get_available_mechs(auth_client, &count);
395682d473b161c86165e7b9323ce4e45afb94bdTimo Sirainen for (i = 0; i < count; i++) {
072f06b60d69fe9456c3fffe20e72a7d09f2825dTimo Sirainen /* a) transport is secured
395682d473b161c86165e7b9323ce4e45afb94bdTimo Sirainen b) auth mechanism isn't plaintext
395682d473b161c86165e7b9323ce4e45afb94bdTimo Sirainen c) we allow insecure authentication
395682d473b161c86165e7b9323ce4e45afb94bdTimo Sirainen if ((mech[i].flags & MECH_SEC_PRIVATE) == 0 &&
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen if (i_stream_next_line(client->input) == NULL)
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen /* @UNSAFE */
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen "Authentication aborted");
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen "Don't send unrequested data");
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen auth_client_request_continue(client->common.auth_request, line);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen /* clear sensitive data */
99695d99930b35c2bac85d52e976b44cf8485d83Timo Sirainenstatic int client_handle_args(struct imap_client *client,
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen const char *reason = NULL, *host = NULL, *destuser = NULL, *pass = NULL;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen /* we want to proxy the connection to another server.
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen proxy host=.. [port=..] [destuser=..] pass=.. */
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if (imap_proxy_new(client, host, port, destuser, pass) < 0)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen /* IMAP referral
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen [nologin] referral host=.. [port=..] [destuser=..]
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen NO [REFERRAL imap://destuser;AUTH=..@host:port/] Can't login.
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen OK [...] Logged in, but you should use this server instead.
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen .. [REFERRAL ..] (Reason from auth server)
44320b37d20bb75e0d433423318db2f4e29d5b91Timo Sirainen str_printfa(reply, "[REFERRAL imap://%s;AUTH=%s@%s",
44320b37d20bb75e0d433423318db2f4e29d5b91Timo Sirainen destuser, client->common.auth_mech_name, host);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen str_append(reply, "Try this server instead.");
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen str_append(reply, "Logged in, but you should use "
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen "this server instead.");
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen client_destroy(client, "Login with referral");
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen } else if (nologin) {
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen /* Authentication went ok, but for some reason user isn't
363929157786b549c80630bda3c3575f5115c6c5Timo Sirainen allowed to log in. Shouldn't probably happen. */
return FALSE;
return TRUE;
switch (reply) {
if (ret < 0)
const char *mech_name;
return FALSE;
if (verbose_auth) {