client-common.h revision 12c6ef6f1268ed4d5b63709bb4215c481b4f078c
1767N/A#ifndef CLIENT_COMMON_H
1767N/A#define CLIENT_COMMON_H
1767N/A
1767N/A#include "network.h"
1767N/A#include "login-proxy.h"
1767N/A#include "sasl-server.h"
1767N/A
1767N/A#define LOGIN_MAX_MASTER_PREFIX_LEN 128
1767N/A
1767N/A/* max. size of input buffer. this means:
1767N/A
1767N/A IMAP: Max. length of command's all parameters. SASL-IR is read into
1767N/A a separate larger buffer.
1767N/A POP3: Max. length of a command line (spec says 512 would be enough)
1767N/A*/
1767N/A#define LOGIN_MAX_INBUF_SIZE \
1767N/A (MASTER_AUTH_MAX_DATA_SIZE - LOGIN_MAX_MASTER_PREFIX_LEN)
1767N/A/* max. size of output buffer. if it gets full, the client is disconnected.
1767N/A SASL authentication gives the largest output. */
1767N/A#define LOGIN_MAX_OUTBUF_SIZE 4096
3996N/A
1767N/A/* Max. length of SASL authentication buffer. */
1767N/A#define LOGIN_MAX_AUTH_BUF_SIZE 8192
1767N/A
1767N/A/* Disconnect client after this many milliseconds if it hasn't managed
4388N/A to log in yet. */
4388N/A#define CLIENT_LOGIN_TIMEOUT_MSECS (MASTER_LOGIN_TIMEOUT_SECS*1000)
1767N/A
1767N/A#define AUTH_SERVER_WAITING_MSG \
1767N/A "Waiting for authentication process to respond.."
4388N/A#define AUTH_MASTER_WAITING_MSG \
1767N/A "Waiting for authentication master process to respond.."
1767N/A
1767N/Aenum client_disconnect_reason {
1767N/A CLIENT_DISCONNECT_TIMEOUT,
4388N/A CLIENT_DISCONNECT_SYSTEM_SHUTDOWN,
3661N/A CLIENT_DISCONNECT_RESOURCE_CONSTRAINT,
1767N/A CLIENT_DISCONNECT_INTERNAL_ERROR
1767N/A};
1767N/A
1767N/Aenum client_auth_result {
3996N/A CLIENT_AUTH_RESULT_SUCCESS,
3996N/A CLIENT_AUTH_RESULT_REFERRAL_SUCCESS,
3996N/A CLIENT_AUTH_RESULT_REFERRAL_NOLOGIN,
1767N/A CLIENT_AUTH_RESULT_ABORTED,
2337N/A CLIENT_AUTH_RESULT_AUTHFAILED,
1767N/A CLIENT_AUTH_RESULT_AUTHFAILED_REASON,
1767N/A CLIENT_AUTH_RESULT_AUTHZFAILED,
1767N/A CLIENT_AUTH_RESULT_TEMPFAIL,
1767N/A CLIENT_AUTH_RESULT_SSL_REQUIRED
1767N/A};
1767N/A
1767N/Astruct client_auth_reply {
1767N/A const char *master_user, *reason;
1767N/A /* for proxying */
1767N/A const char *host, *destuser, *password;
1767N/A unsigned int port;
1767N/A unsigned int proxy_timeout_msecs;
1767N/A unsigned int proxy_refresh_secs;
3996N/A enum login_proxy_ssl_flags ssl_flags;
3996N/A
3996N/A unsigned int proxy:1;
3996N/A unsigned int temp:1;
3996N/A unsigned int nologin:1;
unsigned int authz_failure:1;
};
struct client_vfuncs {
struct client *(*alloc)(pool_t pool);
void (*create)(struct client *client, void **other_sets);
void (*destroy)(struct client *client);
void (*notify_auth_ready)(struct client *client);
void (*notify_disconnect)(struct client *client,
enum client_disconnect_reason reason,
const char *text);
void (*notify_status)(struct client *client,
bool bad, const char *text);
void (*notify_starttls)(struct client *client,
bool success, const char *text);
void (*starttls)(struct client *client);
void (*input)(struct client *client);
void (*auth_send_challenge)(struct client *client, const char *data);
void (*auth_parse_response)(struct client *client);
void (*auth_result)(struct client *client,
enum client_auth_result result,
const struct client_auth_reply *reply,
const char *text);
void (*proxy_reset)(struct client *client);
int (*proxy_parse_line)(struct client *client, const char *line);
void (*proxy_error)(struct client *client, const char *text);
};
struct client {
struct client *prev, *next;
pool_t pool;
struct client_vfuncs v;
time_t created;
int refcount;
struct ip_addr local_ip;
struct ip_addr ip;
unsigned int local_port, remote_port;
struct ssl_proxy *ssl_proxy;
const struct login_settings *set;
int fd;
struct istream *input;
struct ostream *output;
struct io *io;
struct timeout *to_auth_waiting;
struct timeout *to_disconnect;
unsigned char *master_data_prefix;
unsigned int master_data_prefix_len;
struct login_proxy *login_proxy;
char *proxy_user, *proxy_master_user, *proxy_password;
unsigned int proxy_state;
char *auth_mech_name;
struct auth_client_request *auth_request;
string_t *auth_response;
time_t auth_first_started;
const char *sasl_final_resp;
unsigned int master_auth_id;
unsigned int master_tag;
sasl_server_callback_t *sasl_callback;
unsigned int bad_counter;
unsigned int auth_attempts, auth_successes;
pid_t mail_pid;
char *virtual_user;
unsigned int destroyed:1;
unsigned int input_blocked:1;
unsigned int login_success:1;
unsigned int starttls:1;
unsigned int tls:1;
unsigned int secured:1;
unsigned int trusted:1;
unsigned int ssl_servername_settings_read:1;
unsigned int authenticating:1;
unsigned int auth_tried_disabled_plaintext:1;
unsigned int auth_tried_unsupported_mech:1;
unsigned int auth_try_aborted:1;
unsigned int auth_initializing:1;
unsigned int auth_process_comm_fail:1;
unsigned int proxy_auth_failed:1;
unsigned int auth_waiting:1;
unsigned int notified_auth_ready:1;
unsigned int notified_disconnect:1;
/* ... */
};
extern struct client *clients;
struct client *
client_create(int fd, bool ssl, pool_t pool,
const struct login_settings *set, void **other_sets,
const struct ip_addr *local_ip, const struct ip_addr *remote_ip);
void client_destroy(struct client *client, const char *reason);
void client_destroy_success(struct client *client, const char *reason);
void client_destroy_internal_failure(struct client *client);
void client_ref(struct client *client);
bool client_unref(struct client **client);
void client_cmd_starttls(struct client *client);
unsigned int clients_get_count(void) ATTR_PURE;
void client_set_title(struct client *client);
void client_log(struct client *client, const char *msg);
void client_log_err(struct client *client, const char *msg);
void client_log_warn(struct client *client, const char *msg);
const char *client_get_extra_disconnect_reason(struct client *client);
void client_auth_respond(struct client *client, const char *response);
void client_auth_abort(struct client *client);
void client_auth_fail(struct client *client, const char *text);
bool client_read(struct client *client);
void client_input(struct client *client);
void client_notify_auth_ready(struct client *client);
void client_notify_status(struct client *client, bool bad, const char *text);
void client_notify_disconnect(struct client *client,
enum client_disconnect_reason reason,
const char *text);
void client_send_raw_data(struct client *client, const void *data, size_t size);
void client_send_raw(struct client *client, const char *data);
void client_set_auth_waiting(struct client *client);
void client_auth_send_challenge(struct client *client, const char *data);
void client_auth_parse_response(struct client *client);
int client_auth_begin(struct client *client, const char *mech_name,
const char *init_resp);
bool client_check_plaintext_auth(struct client *client, bool pass_sent);
int client_auth_read_line(struct client *client);
void client_proxy_finish_destroy_client(struct client *client);
void client_proxy_log_failure(struct client *client, const char *line);
void client_proxy_failed(struct client *client, bool send_line);
void clients_notify_auth_connected(void);
void client_destroy_oldest(void);
void clients_destroy_all(void);
#endif