client-common.h revision 660b99a7059824676b2b8d6f79b8e15d47df25a2
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen#ifndef CLIENT_COMMON_H
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen#define CLIENT_COMMON_H
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen#include "network.h"
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen#include "login-proxy.h"
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen#include "sasl-server.h"
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen/* max. size of input buffer. this means:
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen IMAP: Max. length of a single parameter
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen POP3: Max. length of a command line (spec says 512 would be enough)
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen*/
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen#define LOGIN_MAX_INBUF_SIZE 1024
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen/* max. size of output buffer. if it gets full, the client is disconnected.
1d738cce754bc64bbc66d3355ebdaf3f6eac55f1Timo Sirainen SASL authentication gives the largest output. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen#define LOGIN_MAX_OUTBUF_SIZE 4096
bdd7a96c363346f7c38f389791be1487ca08775bTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen/* Disconnect client after idling this many milliseconds */
63e2edd14ae7b1dc4a08e2e659501dbf519462f9Timo Sirainen#define CLIENT_LOGIN_IDLE_TIMEOUT_MSECS (3*60*1000)
63e2edd14ae7b1dc4a08e2e659501dbf519462f9Timo Sirainen
63e2edd14ae7b1dc4a08e2e659501dbf519462f9Timo Sirainen#define AUTH_SERVER_WAITING_MSG \
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen "Waiting for authentication process to respond.."
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen#define AUTH_MASTER_WAITING_MSG \
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen "Waiting for authentication master process to respond.."
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainenenum client_cmd_reply {
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen CLIENT_CMD_REPLY_OK,
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen CLIENT_CMD_REPLY_AUTH_FAILED,
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen CLIENT_CMD_REPLY_AUTHZ_FAILED,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_TEMP,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_REASON,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_NOSSL,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_BAD,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_BYE,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_STATUS,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen CLIENT_CMD_REPLY_STATUS_BAD
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen};
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainenstruct client_auth_reply {
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen const char *master_user, *reason;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen /* for proxying */
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen const char *host, *destuser, *password;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen unsigned int port;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen unsigned int proxy_timeout_msecs;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen enum login_proxy_ssl_flags ssl_flags;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen unsigned int proxy:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int temp:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int nologin:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int authz_failure:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen};
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstruct client_vfuncs {
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen struct client *(*alloc)(pool_t pool);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen void (*create)(struct client *client, void **other_sets);
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen void (*destroy)(struct client *client);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen void (*send_greeting)(struct client *client);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen void (*starttls)(struct client *client);
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen void (*input)(struct client *client);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen void (*send_line)(struct client *client, enum client_cmd_reply reply,
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen const char *text);
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen bool (*auth_handle_reply)(struct client *client,
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen const struct client_auth_reply *reply);
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen void (*auth_send_challenge)(struct client *client, const char *data);
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen int (*auth_parse_response)(struct client *client);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen void (*proxy_reset)(struct client *client);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen int (*proxy_parse_line)(struct client *client, const char *line);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen};
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstruct client {
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct client *prev, *next;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen pool_t pool;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct client_vfuncs v;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen time_t created;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen int refcount;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct ip_addr local_ip;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct ip_addr ip;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int local_port, remote_port;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct ssl_proxy *ssl_proxy;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen const struct login_settings *set;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int fd;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct istream *input;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct ostream *output;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct io *io;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct timeout *to_auth_waiting;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct timeout *to_idle_disconnect;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned char *master_data_prefix;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int master_data_prefix_len;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct login_proxy *login_proxy;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen char *proxy_user, *proxy_master_user, *proxy_password;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen char *auth_mech_name;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct auth_client_request *auth_request;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen string_t *auth_response;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int master_tag;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen sasl_server_callback_t *sasl_callback;
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int bad_counter;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int auth_attempts;
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen pid_t mail_pid;
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen char *virtual_user;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int destroyed:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int input_blocked:1;
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen unsigned int login_success:1;
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen unsigned int greeting_sent:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int starttls:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int tls:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int secured:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int trusted:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int authenticating:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int auth_tried_disabled_plaintext:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int auth_tried_unsupported_mech:1;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen unsigned int auth_try_aborted:1;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen unsigned int auth_initializing:1;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen /* ... */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen};
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenextern struct client *clients;
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainenextern struct client_vfuncs client_vfuncs;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstruct client *
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenclient_create(int fd, bool ssl, pool_t pool,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen const struct login_settings *set, void **other_sets,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen const struct ip_addr *local_ip, const struct ip_addr *remote_ip);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_destroy(struct client *client, const char *reason);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_destroy_success(struct client *client, const char *reason);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_destroy_internal_failure(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_ref(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenbool client_unref(struct client **client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_cmd_starttls(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenunsigned int clients_get_count(void) ATTR_PURE;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenvoid client_set_title(struct client *client);
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainenvoid client_log(struct client *client, const char *msg);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_log_err(struct client *client, const char *msg);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenconst char *client_get_extra_disconnect_reason(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenbool client_is_trusted(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_auth_failed(struct client *client);
0bf3eac1110a902e7ec7e695c64e8e46c114e623Timo Sirainen
0bf3eac1110a902e7ec7e695c64e8e46c114e623Timo Sirainenbool client_read(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_input(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_send_line(struct client *client, enum client_cmd_reply reply,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen const char *text);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_send_raw_data(struct client *client, const void *data, size_t size);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_send_raw(struct client *client, const char *data);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_set_auth_waiting(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid client_auth_send_challenge(struct client *client, const char *data);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenint client_auth_parse_response(struct client *client);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenint client_auth_begin(struct client *client, const char *mech_name,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen const char *init_resp);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenbool client_check_plaintext_auth(struct client *client, bool pass_sent);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainenvoid client_proxy_finish_destroy_client(struct client *client);
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainenvoid client_proxy_log_failure(struct client *client, const char *line);
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainenvoid client_proxy_failed(struct client *client, bool send_line);
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainen
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainenvoid clients_notify_auth_connected(void);
dffa503fd4ce31334346e539496084c80a2d8d37Timo Sirainenvoid client_destroy_oldest(void);
dffa503fd4ce31334346e539496084c80a2d8d37Timo Sirainenvoid clients_destroy_all(void);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid clients_init(void);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenvoid clients_deinit(void);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen#endif
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen