login-proxy.h revision 2ef0e8ee48c9683f7bd6698798efa3328e4322d1
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#ifndef LOGIN_PROXY_H
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#define LOGIN_PROXY_H
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenstruct client;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenstruct login_proxy;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenenum login_proxy_ssl_flags {
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen /* Use SSL/TLS enabled */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen PROXY_SSL_FLAG_YES = 0x01,
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen /* Don't do SSL handshake immediately after connected */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen PROXY_SSL_FLAG_STARTTLS = 0x02,
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen /* Don't require that the received certificate is valid */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen PROXY_SSL_FLAG_ANY_CERT = 0x04
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen};
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenstruct login_proxy_settings {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const char *host;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const char *dns_client_socket_path;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen unsigned int port;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen unsigned int connect_timeout_msecs;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen enum login_proxy_ssl_flags ssl_flags;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen};
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen/* Called when new input comes from proxy. */
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainentypedef void proxy_callback_t(struct client *client);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen/* Create a proxy to given host. Returns NULL if failed. Given callback is
ca44a6ba994aaa3231a20ef6e046dfd97a8dcd2dTimo Sirainen called when new input is available from proxy. */
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenint login_proxy_new(struct client *client,
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen const struct login_proxy_settings *set,
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen proxy_callback_t *callback);
f50ea0370137dd93d9953d91ea73486ca0784de9Timo Sirainen/* Free the proxy. This should be called if authentication fails. */
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainenvoid login_proxy_free(struct login_proxy **proxy);
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainen
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainen/* Return TRUE if host/port/destuser combination points to same as current
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainen connection. */
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainenbool login_proxy_is_ourself(const struct client *client, const char *host,
f50ea0370137dd93d9953d91ea73486ca0784de9Timo Sirainen unsigned int port, const char *destuser);
52ffa11d672a9bd150ae3e758a19f1cc4f01471bTimo Sirainen
52ffa11d672a9bd150ae3e758a19f1cc4f01471bTimo Sirainen/* Detach proxy from client. This is done after the authentication is
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen successful and all that is left is the dummy proxying. */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenvoid login_proxy_detach(struct login_proxy *proxy);
aaa76b1c83e285f84c5ca41e67df022076ec609fTimo Sirainen
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainen/* STARTTLS command was issued. */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenint login_proxy_starttls(struct login_proxy *proxy);
struct istream *login_proxy_get_istream(struct login_proxy *proxy);
struct ostream *login_proxy_get_ostream(struct login_proxy *proxy);
const char *login_proxy_get_host(const struct login_proxy *proxy) ATTR_PURE;
unsigned int login_proxy_get_port(const struct login_proxy *proxy) ATTR_PURE;
enum login_proxy_ssl_flags
login_proxy_get_ssl_flags(const struct login_proxy *proxy) ATTR_PURE;
void login_proxy_kill_idle(void);
void login_proxy_init(void);
void login_proxy_deinit(void);
#endif