client-common.h revision 28dae6a0064e79f86da091625b0f2b92336a2a91
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody#ifndef CLIENT_COMMON_H
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen#define CLIENT_COMMON_H
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen#include "network.h"
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen#include "login-proxy.h"
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen#include "sasl-server.h"
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen/* max. size of input buffer. this means:
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen IMAP: Max. length of a single parameter
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen POP3: Max. length of a command line (spec says 512 would be enough)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen*/
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen#define LOGIN_MAX_INBUF_SIZE 1024
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen/* max. size of output buffer. if it gets full, the client is disconnected.
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen SASL authentication gives the largest output. */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen#define LOGIN_MAX_OUTBUF_SIZE 4096
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen/* Disconnect client after this many milliseconds if it hasn't managed
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen to log in yet. */
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen#define CLIENT_LOGIN_TIMEOUT_MSECS (MASTER_LOGIN_TIMEOUT_SECS*1000)
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen#define AUTH_SERVER_WAITING_MSG \
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen "Waiting for authentication process to respond.."
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen#define AUTH_MASTER_WAITING_MSG \
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen "Waiting for authentication master process to respond.."
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenenum client_cmd_reply {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_OK,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAILED,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_AUTHZ_FAILED,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_TEMP,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_REASON,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_AUTH_FAIL_NOSSL,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_BAD,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_BYE,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen CLIENT_CMD_REPLY_STATUS,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen CLIENT_CMD_REPLY_STATUS_BAD
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen};
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstruct client_auth_reply {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen const char *master_user, *reason;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* for proxying */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen const char *host, *destuser, *password;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int port;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int proxy_timeout_msecs;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int proxy_refresh_secs;
3b32bc12710240f86465a00fbb2bd1ef030e6c40Timo Sirainen enum login_proxy_ssl_flags ssl_flags;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen unsigned int proxy:1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen unsigned int temp:1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen unsigned int nologin:1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen unsigned int authz_failure:1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen};
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenstruct client_vfuncs {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct client *(*alloc)(pool_t pool);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen void (*create)(struct client *client, void **other_sets);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen void (*destroy)(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen void (*send_greeting)(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen void (*starttls)(struct client *client);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen void (*input)(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen void (*send_line)(struct client *client, enum client_cmd_reply reply,
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen const char *text);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen bool (*auth_handle_reply)(struct client *client,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen const struct client_auth_reply *reply);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen void (*auth_send_challenge)(struct client *client, const char *data);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen int (*auth_parse_response)(struct client *client);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen void (*proxy_reset)(struct client *client);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen int (*proxy_parse_line)(struct client *client, const char *line);
bdb026e2dc8a7c77585ed5ba489f0056df8074d4Timo Sirainen};
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
b42697a5749b85659a24316d97f1c208d469e4e8Timo Sirainenstruct client {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct client *prev, *next;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen pool_t pool;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct client_vfuncs v;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen time_t created;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen int refcount;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct ip_addr local_ip;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen struct ip_addr ip;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen unsigned int local_port, remote_port;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen struct ssl_proxy *ssl_proxy;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen const struct login_settings *set;
724b7fcf28c2547eb9c837d0e99241c0501dccf3Timo Sirainen
724b7fcf28c2547eb9c837d0e99241c0501dccf3Timo Sirainen int fd;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen struct istream *input;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct ostream *output;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct io *io;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen struct timeout *to_auth_waiting;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen struct timeout *to_disconnect;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned char *master_data_prefix;
3d6fdafca17c073606b63745ca8638e035e871f4Timo Sirainen unsigned int master_data_prefix_len;
3d6fdafca17c073606b63745ca8638e035e871f4Timo Sirainen
3d6fdafca17c073606b63745ca8638e035e871f4Timo Sirainen struct login_proxy *login_proxy;
3d6fdafca17c073606b63745ca8638e035e871f4Timo Sirainen char *proxy_user, *proxy_master_user, *proxy_password;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen unsigned int proxy_state;
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen
9ffdc9d18870acef2e4dde99715d8528ff4b080dTimo Sirainen char *auth_mech_name;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen struct auth_client_request *auth_request;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen string_t *auth_response;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen time_t auth_first_started;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen unsigned int master_auth_id;
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen unsigned int master_tag;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen sasl_server_callback_t *sasl_callback;
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int bad_counter;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int auth_attempts, auth_successes;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen pid_t mail_pid;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen char *virtual_user;
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen unsigned int destroyed:1;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int input_blocked:1;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned int login_success:1;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int greeting_sent:1;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen unsigned int starttls:1;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen unsigned int tls:1;
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen unsigned int secured:1;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen unsigned int trusted:1;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen unsigned int ssl_servername_settings_read:1;
1108376e39a19912e8394e64e19b1bc6f6691cf6Timo Sirainen unsigned int authenticating:1;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int auth_tried_disabled_plaintext:1;
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen unsigned int auth_tried_unsupported_mech:1;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int auth_try_aborted:1;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int auth_initializing:1;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* ... */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen};
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenextern struct client *clients;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
306cfd77100131c08b243de10f6d40500f4c27c6Timo Sirainenstruct client *
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenclient_create(int fd, bool ssl, pool_t pool,
09c08fad8e7cc694a6c8d1711e67839acd3a2f04Timo Sirainen const struct login_settings *set, void **other_sets,
438f12d7a776da695019114884b48188d94613efTimo Sirainen const struct ip_addr *local_ip, const struct ip_addr *remote_ip);
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenvoid client_destroy(struct client *client, const char *reason);
9ffdc9d18870acef2e4dde99715d8528ff4b080dTimo Sirainenvoid client_destroy_success(struct client *client, const char *reason);
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainenvoid client_destroy_internal_failure(struct client *client);
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_ref(struct client *client);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainenbool client_unref(struct client **client);
6469cf211a57433335641725dc236ebb2b9fdd3bTimo Sirainen
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainenvoid client_cmd_starttls(struct client *client);
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainenunsigned int clients_get_count(void) ATTR_PURE;
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainenvoid client_set_title(struct client *client);
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainenvoid client_log(struct client *client, const char *msg);
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainenvoid client_log_err(struct client *client, const char *msg);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenconst char *client_get_extra_disconnect_reason(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenbool client_is_trusted(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_auth_failed(struct client *client);
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenbool client_read(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_input(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_send_line(struct client *client, enum client_cmd_reply reply,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen const char *text);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_send_raw_data(struct client *client, const void *data, size_t size);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_send_raw(struct client *client, const char *data);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_set_auth_waiting(struct client *client);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_auth_send_challenge(struct client *client, const char *data);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainenint client_auth_parse_response(struct client *client);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainenint client_auth_begin(struct client *client, const char *mech_name,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen const char *init_resp);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenbool client_check_plaintext_auth(struct client *client, bool pass_sent);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_proxy_finish_destroy_client(struct client *client);
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainenvoid client_proxy_log_failure(struct client *client, const char *line);
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainenvoid client_proxy_failed(struct client *client, bool send_line);
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid clients_notify_auth_connected(void);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid client_destroy_oldest(void);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid clients_destroy_all(void);
#endif