client-common-auth.c revision 2e37d45867d081db150ab78dad303b9077aea24f
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#define PROXY_FAILURE_MSG "Account is temporarily unavailable."
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen#define LOGIN_DNS_CLIENT_SOCKET_PATH "dns-client"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen/* If we've been waiting auth server to respond for over this many milliseconds,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen send a "waiting" message. */
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen if (client->auth_initializing || client->destroyed)
3f190f4cbb9233a3a6830956cb5c7ae56a577b79Timo Sirainen client->io = io_add(client->fd, IO_READ, client_input, client);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic void client_auth_waiting_timeout(struct client *client)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen client_send_line(client, CLIENT_CMD_REPLY_STATUS,
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen AUTH_SERVER_WAITING_MSG : AUTH_MASTER_WAITING_MSG);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid client_set_auth_waiting(struct client *client)
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenstatic void client_auth_parse_args(struct client *client,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen const char *const *args,
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen reply_r->proxy_timeout_msecs = 1000*atoi(value);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen reply_r->ssl_flags |= PROXY_SSL_FLAG_ANY_CERT;
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen reply_r->port = login_binary.default_ssl_port;
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen reply_r->ssl_flags |= PROXY_SSL_FLAG_ANY_CERT;
4145cbac82bfc0c8bfeceeca0ef841700117930cTimo Sirainen /* already handled in login-common */
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen i_debug("Ignoring unknown passdb extra field: %s", key);
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainenstatic void proxy_free_password(struct client *client)
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen safe_memset(client->proxy_password, 0, strlen(client->proxy_password));
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid client_proxy_finish_destroy_client(struct client *client)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen str_printfa(str, "proxy(%s): started proxying to %s:%u",
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen if (strcmp(client->virtual_user, client->proxy_user) != 0) {
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen /* remote username is different, log it */
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen str_printfa(str, " (master %s)", client->proxy_master_user);
1b5366b2234892f8930a29351da06b193e385150Timo Sirainenvoid client_proxy_log_failure(struct client *client, const char *line)
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen str_printfa(str, "proxy(%s): Login failed to %s:%u",
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen if (strcmp(client->virtual_user, client->proxy_user) != 0) {
7501b9f694460101b41d1d708ebc3ec2b0400b1cTimo Sirainen /* remote username is different, log it */
690bafa70767e3f6e98bbfd62ad4a26be2387ea9Timo Sirainen str_printfa(str, " (master %s)", client->proxy_master_user);
1b5366b2234892f8930a29351da06b193e385150Timo Sirainenvoid client_proxy_failed(struct client *client, bool send_line)
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen client_send_line(client, CLIENT_CMD_REPLY_AUTH_FAIL_TEMP,
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen /* call this last - it may destroy the client */
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainenstatic const char *get_disconnect_reason(struct istream *input)
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen return errno == 0 || errno == EPIPE ? "Connection closed" :
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* we're just freeing the proxy */
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen input = login_proxy_get_istream(client->login_proxy);
3343a61404603b21c246783a7963b77833095f31Timo Sirainen /* we came here from client_destroy() */
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen /* failed for some reason, probably server disconnected */
if (!success)
return FALSE;
return TRUE;
const unsigned char *data;
unsigned int len;
for (i = 0; i < size; i++) {
return i < size;
int ret;
return ret;
switch (sasl_reply) {
data);
const char *init_resp)
return TRUE;
if (pass_sent) {
return FALSE;
void clients_notify_auth_connected(void)