imap-proxy.c revision 00b2227d6ff65629707670b7b8dfd236fced8293
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (C) 2004 Timo Sirainen */
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenstatic int proxy_input_line(struct imap_client *client,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen /* this is a banner */
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen "Remote returned invalid banner: %s",
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* send LOGIN command */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen imap_quote_append_string(str, client->proxy_user, FALSE);
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainen imap_quote_append_string(str, client->proxy_password, FALSE);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)o_stream_send(output, str_data(str), str_len(str));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* Login successful. Send this line to client. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)o_stream_send_str(client->output, client->cmd_tag);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)o_stream_send_str(client->output, line + 1);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)o_stream_send(client->output, "\r\n", 2);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen login_proxy_detach(client->proxy, client->input,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen client_destroy(client, t_strdup_printf("proxy(%s): started",
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen /* Login failed. Send our own failure reply so client can't
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen figure out if user exists or not just by looking at the
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen reply string. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen client_send_tagline(client, "NO "AUTH_FAILED_MSG);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* allow client input again */
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen client->io = io_add(client->common.fd, IO_READ,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* probably some untagged reply */
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenstatic void proxy_input(struct istream *input, struct ostream *output,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* remote authentication failed, we're just
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen freeing the proxy */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* failed for some reason */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* buffer full */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_error("imap-proxy(%s): Remote input buffer full",
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* disconnected */
ac383c437b1ccb9420cae6b4c4b03af3c8019e02Timo Sirainen client_destroy(client, "Proxy: Remote disconnected");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen while ((line = i_stream_next_line(input)) != NULL) {
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen if (proxy_input_line(client, output, line) < 0)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint imap_proxy_new(struct imap_client *client, const char *host,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen unsigned int port, const char *user, const char *password)
ebfbf5d78dcf95e8b176429f4b5b0694eb4e17d5Timo Sirainen client->proxy = login_proxy_new(&client->common, host, port,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* disable input until authentication is finished */