imap-proxy.c revision 3612ee5c737954d5fb88fd1775aad80f7bf1dc4e
/* Copyright (c) 2004-2010 Dovecot authors, see the included COPYING file */
#include "login-common.h"
#include "array.h"
#include "ioloop.h"
#include "istream.h"
#include "ostream.h"
#include "base64.h"
#include "str.h"
#include "str-sanitize.h"
#include "safe-memset.h"
#include "client.h"
#include "client-authenticate.h"
#include "imap-resp-code.h"
#include "imap-quote.h"
#include "imap-proxy.h"
#include <stdlib.h>
enum imap_proxy_state {
};
{
"\"x-originating-ip\" \"%s\" "
"\"x-originating-port\" \"%u\" "
"\"x-connected-ip\" \"%s\" "
"\"x-connected-port\" \"%u\")\r\n",
}
{
return;
}
{
}
{
/* logging in normally - use LOGIN command */
FALSE);
} else if (client->proxy_sasl_ir) {
/* master user login with SASL initial response support */
} else {
/* master user login without SASL initial response */
}
}
{
const char *const *capabilities = NULL;
"proxy: Remote returned invalid banner: %s",
return -1;
}
}
if ((ssl_flags & PROXY_SSL_FLAG_STARTTLS) != 0) {
if (capabilities != NULL &&
"proxy: Remote doesn't support STARTTLS");
return -1;
}
} else {
}
return 0;
}
static void
const char *line)
{
const char *capability;
bool tagged_capability;
if (tagged_capability)
/* client has used CAPABILITY command, so it didn't understand
the capabilities in the banner. send the backend's untagged
CAPABILITY reply and hope that the client understands it */
}
if (*line == '[') {
/* we need to send the capability.
skip over this resp-code */
line++;
}
}
}
{
if (!imap_client->proxy_seen_banner) {
/* this is a banner */
return -1;
}
return 0;
} else if (*line == '+') {
/* AUTHENTICATE started. finish it. */
if (!imap_client->proxy_wait_auth_continue) {
/* used literals with LOGIN command, just ignore. */
return 0;
}
return 0;
/* STARTTLS failed */
"proxy: Remote STARTTLS failed: %s",
return -1;
}
/* STARTTLS successful, begin TLS negotiation. */
return -1;
}
return 1;
/* Login successful. Send this line to client. */
(void)client_skip_line(imap_client);
return 1;
line += 2;
log_line += 3;
}
strlen(STR_NO_IMAP_RESP_CODE_AUTHFAILED)) == 0) {
/* the remote sent a generic "authentication failed"
error. replace it with our one, so that in case
the remote is sending a different error message
an attacker can't find out what users exist in
the system. */
/* remote sent some other resp-code. forward it. */
} else {
/* there was no [resp-code], so remote isn't Dovecot
v1.2+. we could either forward the line as-is and
leak information about what users exist in this
system, or we could hide other errors than password
failures. since other errors are pretty rare,
it's safer to just hide them. they're still
available in logs though. */
}
return -1;
return 0;
/* Reply to CAPABILITY command we sent, ignore it */
return 0;
/* Reply to ID command we sent, ignore it */
return 0;
/* untagged reply. just foward it. */
return 0;
} else {
/* tagged reply, shouldn't happen. */
"proxy: Unexpected input, ignoring: %s",
return 0;
}
}
{
}