login-proxy.c revision 4d4d6d4745682790c20d759ba93dbea46b812c5d
/* Copyright (c) 2004-2009 Dovecot authors, see the included COPYING file */
#include "common.h"
#include "ioloop.h"
#include "istream.h"
#include "ostream.h"
#include "llist.h"
#include "str-sanitize.h"
#include "master-service.h"
#include "client-common.h"
#include "ssl-proxy.h"
#include "login-proxy.h"
#define MAX_PROXY_INPUT_SIZE 4096
#define OUTBUF_THRESHOLD 1024
struct login_proxy {
struct client *prelogin_client;
struct istream *server_input;
unsigned int port;
void *context;
unsigned int destroying:1;
unsigned int disconnecting:1;
};
{
unsigned char buf[OUTBUF_THRESHOLD];
/* client's output buffer is already quite full.
don't send more until we're below threshold. */
return;
}
}
{
unsigned char buf[OUTBUF_THRESHOLD];
/* proxy's output buffer is already quite full.
don't send more until we're below threshold. */
return;
}
}
{
return 1;
}
/* there's again space in proxy's output buffer, so we can
read more from client. */
}
return 1;
}
{
return 1;
}
/* there's again space in client's output buffer, so we can
read more from proxy. */
}
return 1;
}
{
}
{
FALSE);
}
{
int err;
if (err != 0) {
i_error("proxy: connect(%s, %u) failed: %s",
return;
}
if (login_proxy_starttls(proxy) < 0) {
return;
}
} else {
}
}
struct login_proxy *
{
struct login_proxy *proxy;
int fd;
return NULL;
}
i_error("proxy(%s): %s is not a valid IP",
return NULL;
}
if (fd < 0) {
i_error("proxy(%s): connect(%s, %u) failed: %m",
return NULL;
}
return proxy;
}
{
const char *ipstr;
if (proxy->destroying)
return;
/* detached proxy */
i_info("proxy(%s): disconnecting %s",
} else {
}
}
{
return FALSE;
return FALSE;
return FALSE;
}
{
}
{
return proxy->server_output;
}
{
}
{
}
{
}
struct ostream *client_output)
{
const unsigned char *data;
/* send all pending client input to proxy and get rid of the stream */
if (size != 0)
/* from now on, just do dummy proxying */
}
static int login_proxy_ssl_handshaked(void *context)
{
return 0;
"proxy: SSL certificate not received from %s:%u",
} else {
"proxy: Received invalid SSL certificate from %s:%u",
}
return -1;
}
{
int fd;
if (fd < 0) {
"proxy: SSL handshake failed to %s:%u",
return -1;
}
return 0;
}
void login_proxy_deinit(void)
{
struct login_proxy *proxy;
while (login_proxies != NULL) {
}
}