auth-worker-client.c revision bd354c19cb93c07ade79477674328a54146ea332
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (C) 2005 Timo Sirainen */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenstatic void auth_worker_client_unref(struct auth_worker_client *client);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenauth_worker_client_check_throttle(struct auth_worker_client *client)
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen if (o_stream_get_buffer_used_size(client->output) >=
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen /* stop reading new requests until client has read the pending
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenworker_auth_request_new(struct auth_worker_client *client, unsigned int id,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_request = auth_request_new_dummy(client->auth);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen for (tmp = t_strsplit(args, "\t"); *tmp != NULL; tmp++) {
1ff487015234b23c32cf8bb4c9f8c02922535b8eTimo Sirainenstatic void verify_plain_callback(enum passdb_result result,
675b2b1c4587a79478062b05725da61afa5d8045Timo Sirainen struct auth_worker_client *client = request->context;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenauth_worker_handle_passv(struct auth_worker_client *client,
01ca85e6e763cfa0d146166fdd60654f04f51199Timo Sirainen /* verify plaintext password */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen unsigned int num;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen i_error("BUG: Auth worker server sent us invalid PASSV");
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
cc3da53f3a49304a251bfae88f814505326ac210Timo Sirainen auth_request->passdb = auth_request->passdb->next;
c2f2a6cdf7dd55a4aabe72495cabb4deaa59cffcTimo Sirainen auth_request->passdb->passdb->verify_plain(auth_request, password,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenlookup_credentials_callback(enum passdb_result result, const char *credentials,
6cb3c4f4276531258be706821e034f1f0a8cd276Timo Sirainen struct auth_worker_client *client = request->context;
01ca85e6e763cfa0d146166fdd60654f04f51199Timo Sirainen passdb_credentials_to_str(request->credentials),
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenauth_worker_handle_passl(struct auth_worker_client *client,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen /* lookup credentials */
064ccad9cea2a75a0d6caa2c679b6cd22be58174Timo Sirainen unsigned int num;
064ccad9cea2a75a0d6caa2c679b6cd22be58174Timo Sirainen i_error("BUG: Auth worker server sent us invalid PASSL");
064ccad9cea2a75a0d6caa2c679b6cd22be58174Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_request->passdb = auth_request->passdb->next;
f16712057c1b82c6d2a3a4267c4521d357cd4b4cTimo Sirainenlookup_user_callback(const char *result, struct auth_request *auth_request)
f16712057c1b82c6d2a3a4267c4521d357cd4b4cTimo Sirainen struct auth_worker_client *client = auth_request->context;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenauth_worker_handle_user(struct auth_worker_client *client,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen /* lookup user */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen unsigned int num;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_request->userdb = auth_request->userdb->next;
675b2b1c4587a79478062b05725da61afa5d8045Timo Sirainenauth_worker_handle_line(struct auth_worker_client *client, const char *line)
01ca85e6e763cfa0d146166fdd60654f04f51199Timo Sirainen const char *p;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen unsigned int id;
cc3da53f3a49304a251bfae88f814505326ac210Timo Sirainen id = (unsigned int)strtoul(t_strdup_until(line, p), NULL, 10);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_worker_handle_passv(client, id, line + 6);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_worker_handle_passl(client, id, line + 6);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen auth_worker_handle_user(client, id, line + 5);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen /* disconnected */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen /* buffer full */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen i_error("BUG: Auth worker server sent us more than %d bytes",
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen while ((line = i_stream_next_line(client->input)) != NULL) {
f3aff3c6bf32d5bb0a61993b76a3fbe5ad798c09Timo Sirainen if (o_stream_get_buffer_used_size(client->output) <=
f3aff3c6bf32d5bb0a61993b76a3fbe5ad798c09Timo Sirainen OUTBUF_THROTTLE_SIZE/3 && client->io == NULL) {
f3aff3c6bf32d5bb0a61993b76a3fbe5ad798c09Timo Sirainen /* allow input again */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenauth_worker_client_create(struct auth *auth, int fd)
15362cdf9df29fef8795e865957e17ec027a9ebfTimo Sirainen o_stream_create_file(fd, default_pool, (size_t)-1, FALSE);
15362cdf9df29fef8795e865957e17ec027a9ebfTimo Sirainen o_stream_set_flush_callback(client->output, auth_worker_output, client);
e161a5225abda0837b5deb8746ef808ba5e98d94Timo Sirainen client->io = io_add(fd, IO_READ, auth_worker_input, client);
15362cdf9df29fef8795e865957e17ec027a9ebfTimo Sirainenvoid auth_worker_client_destroy(struct auth_worker_client *client)