auth-worker-client.c revision 0af3274706d337b2930bd34f0377f2cc2dbcd18a
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (C) 2005 Timo Sirainen */
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainenstatic void auth_worker_client_unref(struct auth_worker_client *client);
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainenauth_worker_client_check_throttle(struct auth_worker_client *client)
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen if (o_stream_get_buffer_used_size(client->output) >=
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* stop reading new requests until client has read the pending
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainenworker_auth_request_new(struct auth_worker_client *client, unsigned int id,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request = auth_request_new_dummy(client->auth);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (tmp = t_strsplit(args, "\t"); *tmp != NULL; tmp++) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void verify_plain_callback(enum passdb_result result,
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen struct auth_worker_client *client = request->context;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenauth_worker_handle_passv(struct auth_worker_client *client,
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* verify plaintext password */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen unsigned int num;
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen i_error("BUG: Auth worker server sent us invalid PASSV");
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request->passdb = auth_request->passdb->next;
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen auth_request->passdb->passdb->verify_plain(auth_request, password,
807b48fe1f6a57b01ed2cc20247d5b5e3facc562Timo Sirainenlookup_credentials_callback(enum passdb_result result, const char *credentials,
cfbacf6ea5fb39ae5304e4d95a78d9d4751bdfe1Timo Sirainen struct auth_worker_client *client = request->context;
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen passdb_credentials_to_str(request->credentials),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenauth_worker_handle_passl(struct auth_worker_client *client,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* lookup credentials */
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen unsigned int num;
1f43c8ac132c153c224c4fffe34b2c3075d87ef7Timo Sirainen i_error("BUG: Auth worker server sent us invalid PASSL");
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen auth_request->passdb = auth_request->passdb->next;
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainenlookup_user_callback(const char *result, struct auth_request *auth_request)
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen struct auth_worker_client *client = auth_request->context;
41e6eb07b411ea58352ba9d2cc8cf340325d49f3Timo Sirainen o_stream_send(client->output, str_data(str), str_len(str));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenauth_worker_handle_user(struct auth_worker_client *client,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* lookup user */
15cc66ca72982a43e3bfa58f307adc57e9caa52dTimo Sirainen unsigned int num;
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen auth_request = worker_auth_request_new(client, id, args);
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen auth_request->userdb = auth_request->userdb->next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenauth_worker_handle_line(struct auth_worker_client *client, const char *line)
ec77cd41241208345efd51c1fcce9030be30aa9bTimo Sirainen const char *p;
ec77cd41241208345efd51c1fcce9030be30aa9bTimo Sirainen unsigned int id;
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen id = (unsigned int)strtoul(t_strdup_until(line, p), NULL, 10);
9404a7b90dcb80d31bd37ee2493f03751acdb1bdTimo Sirainen auth_worker_handle_passv(client, id, line + 6);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen auth_worker_handle_passl(client, id, line + 6);
eac3948d67eff8623d51aeaea9eca582f3aec677Timo Sirainen auth_worker_handle_user(client, id, line + 5);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* disconnected */
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen /* buffer full */
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen i_error("BUG: Auth worker server sent us more than %d bytes",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ((line = i_stream_next_line(client->input)) != NULL) {
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen if (o_stream_get_buffer_used_size(client->output) <=
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen OUTBUF_THROTTLE_SIZE/3 && client->io == NULL) {
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen /* allow input again */
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainenauth_worker_client_create(struct auth *auth, int fd)
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen o_stream_create_file(fd, default_pool, (size_t)-1, FALSE);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen o_stream_set_flush_callback(client->output, auth_worker_output, client);
3955d6726c939b3b30527c22b70c879fbe78692eTimo Sirainen client->io = io_add(fd, IO_READ, auth_worker_input, client);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainenvoid auth_worker_client_destroy(struct auth_worker_client *client)