auth-worker-client.c revision 33dd58ab84a020c4f061d2f6031eb6d4c168df1b
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncauth_worker_client_check_throttle(struct auth_worker_client *client)
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync if (o_stream_get_buffer_used_size(client->output) >=
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync /* stop reading new requests until client has read the pending
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync replies. */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncstatic struct auth_request *
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncworker_auth_request_new(struct auth_worker_client *client, unsigned int id,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *args)
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_request = auth_request_new_dummy(client->auth);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync for (tmp = t_strsplit(args, "\t"); *tmp != NULL; tmp++) {
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync (void)auth_request_import(auth_request, key, value);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *const *tmp;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync /* first field is the user name */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncstatic void auth_worker_send_reply(struct auth_worker_client *client,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync o_stream_send(client->output, str_data(str), str_len(str));
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncstatic void verify_plain_callback(enum passdb_result result,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync struct auth_worker_client *client = request->context;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync if (request->passdb_failure && result == PASSDB_RESULT_OK)
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync reply = auth_stream_reply_init(pool_datastack_create());
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_stream_reply_add(reply, NULL, dec2str(request->id));
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *fields =
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *fields =
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_stream_reply_export(request->extra_cache_fields);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncauth_worker_handle_passv(struct auth_worker_client *client,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync /* verify plaintext password */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *password;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync unsigned int passdb_id;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync i_error("BUG: Auth worker server sent us invalid PASSV");
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_request = worker_auth_request_new(client, id, args);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync if (auth_request->user == NULL || auth_request->service == NULL) {
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync /* could be a masterdb */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync verify_plain(auth_request, password, verify_plain_callback);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsynclookup_credentials_callback(enum passdb_result result,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync struct auth_worker_client *client = request->context;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync if (request->passdb_failure && result == PASSDB_RESULT_OK)
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync reply = auth_stream_reply_init(pool_datastack_create());
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_stream_reply_add(reply, NULL, dec2str(request->id));
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync str_printfa(str, "{%s.b64}", request->credentials_scheme);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *fields =
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsyncauth_worker_handle_passl(struct auth_worker_client *client,
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync /* lookup credentials */
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync const char *scheme;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync unsigned int passdb_id;
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync i_error("BUG: Auth worker server sent us invalid PASSL");
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_request = worker_auth_request_new(client, id, args);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync auth_request->credentials_scheme = p_strdup(auth_request->pool, scheme);
b8014c3bbb8a0f9d16e82278eabba771cbfd9b2evboxsync if (auth_request->user == NULL || auth_request->service == NULL) {
unsigned int passdb_id;
const char *data;
args++;
switch (result) {
case USERDB_RESULT_OK:
unsigned int num;
unsigned int id;
if (p == NULL)
return FALSE;
return TRUE;
char *line;
bool ret;
(int)AUTH_WORKER_MAX_LINE_LENGTH);
T_BEGIN {
} T_END;
if (!ret) {
struct auth_worker_client *
FALSE);
return client;