auth-master-connection.c revision 16f816d3f3c32ae3351834253f52ddd0212bcbf3
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (C) 2002 Timo Sirainen */
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher unsigned int id;
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallaghervoid auth_master_request_callback(const char *reply, void *context)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct auth_master_connection *conn = context;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (void)o_stream_sendv(conn->output, iov, 2);
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorcemaster_input_request(struct auth_master_connection *conn, const char *args)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *const *list;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* <id> <client-pid> <client-id> */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (list[0] == NULL || list[1] == NULL || list[2] == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_error("BUG: Master sent broken REQUEST");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher id = (unsigned int)strtoul(list[0], NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher client_pid = (unsigned int)strtoul(list[1], NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher client_id = (unsigned int)strtoul(list[2], NULL, 10);
d921c1eba437662437847279f251a0a5d8f70127Maxim client_conn = auth_client_connection_lookup(conn->listener, client_pid);
d921c1eba437662437847279f251a0a5d8f70127Maxim i_error("Master requested auth for nonexisting client %u",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagheruser_callback(const char *result, struct auth_request *auth_request)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct auth_master_connection *conn = auth_request->context;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "NOTFOUND\t%u\n", auth_request->id);
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher str_printfa(str, "USER\t%u\t", auth_request->id);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (void)o_stream_send(conn->output, str_data(str), str_len(str));
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozekmaster_input_user(struct auth_master_connection *conn, const char *args)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* <id> <userid> [<parameters>] */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher auth_request = auth_request_new_dummy(conn->listener->auth);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher auth_request->id = (unsigned int)strtoul(list[0], NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher auth_request->user = p_strdup(auth_request->pool, list[1]);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek (void)auth_request_import(auth_request, name, arg);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher i_error("BUG: Master sent USER request without service");
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher auth_request_lookup_user(auth_request, user_callback);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallaghermaster_input_die(struct auth_master_connection *conn)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct auth_master_connection *conn = context;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* disconnected */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* buffer full */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_error("BUG: Master sent us more than %d bytes",
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek /* make sure the major version matches */
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek i_error("Master not compatible with this server "
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek "(mixed old and new binaries?)");
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek while ((line = i_stream_next_line(conn->input)) != NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = master_input_request(conn, line + 8);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* ignore unknown command */
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if ((ret = o_stream_flush(conn->output)) < 0) {
505383ec905863bb8f4f563f694b9bf077f9002cJakub Hrozek /* transmit error, probably master died */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (o_stream_get_buffer_used_size(conn->output) <= MAX_OUTBUF_SIZE/2) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* allow input again */
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce conn->io = io_add(conn->fd, IO_READ, master_input, conn);
336879aabae137f9a81304f147fb0d43001654b0Simo Sorceauth_master_connection_create(struct auth_master_listener *listener, int fd)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher conn->input = i_stream_create_file(fd, default_pool,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher conn->output = o_stream_create_file(fd, default_pool,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher o_stream_set_flush_callback(conn->output, master_output, conn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher conn->io = io_add(fd, IO_READ, master_input, conn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_append(&listener->masters, &conn, 1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid auth_master_connection_send_handshake(struct auth_master_connection *conn)
f660877b38e563c4aa0cb1431624069808873fecJakub Hrozek line = t_strdup_printf("VERSION\t%u\t%u\nSPID\t%u\n",
unsigned int i, count;
for (i = 0; i < count; i++) {