imap-proxy.c revision 2c5c293940fd6c7e020e1d58dae77a9d01f9059b
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen/* Copyright (c) 2004-2016 Dovecot authors, see the included COPYING file */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic void proxy_write_id(struct imap_client *client, string_t *str)
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-session-id\" \"%s\" "
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-originating-ip\" \"%s\" "
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-originating-port\" \"%u\" "
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-connected-ip\" \"%s\" "
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-connected-port\" \"%u\" "
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "\"x-proxy-ttl\" \"%u\")\r\n",
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic void proxy_free_password(struct client *client)
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen safe_memset(client->proxy_password, 0, strlen(client->proxy_password));
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic int proxy_write_starttls(struct imap_client *client, string_t *str)
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen enum login_proxy_ssl_flags ssl_flags = login_proxy_get_ssl_flags(client->common.login_proxy);
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen if ((ssl_flags & PROXY_SSL_FLAG_STARTTLS) != 0) {
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen if (client->proxy_backend_capability != NULL &&
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen !str_array_icase_find(t_strsplit(client->proxy_backend_capability, " "), "STARTTLS")) {
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen "proxy: Remote doesn't support STARTTLS");
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstatic int proxy_write_login(struct imap_client *client, string_t *str)
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen const unsigned char *output;
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* Send CAPABILITY command if we don't know the capabilities yet.
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen Also as kind of a Dovecot-backend workaround if the client insisted
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen on sending CAPABILITY command (even though our banner already sent
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen it), send the (unnecessary) CAPABILITY command to backend as well
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen to avoid sending the CAPABILITY reply twice (untagged and OK resp
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen client->client_ignores_capability_resp_code)) {
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* authenticate only after receiving C OK reply. */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen /* logging in normally - use LOGIN command */
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen login_proxy_get_ssl_flags(client->common.login_proxy) == 0) {
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen "proxy: Remote advertised LOGINDISABLED and SSL/TLS not enabled");
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen imap_append_string(str, client->common.proxy_user);
if (len == 0)
int ret;
} else if (ret == 0) {
const char *line)
const char *capability;
bool tagged_capability;
if (tagged_capability)
line++;
const unsigned char *data;
const char *error;
int ret;
if (ret == 0) {
if (ret < 0) {
error));
} else if (ret == 0) {