From 6a012765c15d835c1e0558fdd9419742959276a5 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Wed, 12 Oct 2016 12:04:10 +0300 Subject: [PATCH] auth: Pass userdb fields to worker If this is not done, then those userdb handlers that need access to userdb variables for e.g. interpolation, cannot access them. --- src/auth/auth-request.c | 16 +++++++++++++++- src/auth/auth-worker-client.c | 5 +++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/auth/auth-request.c b/src/auth/auth-request.c index f5a2e26dda..e170da0c2b 100644 --- a/src/auth/auth-request.c +++ b/src/auth/auth-request.c @@ -7,6 +7,7 @@ #include "sha1.h" #include "hex-binary.h" #include "str.h" +#include "array.h" #include "safe-memset.h" #include "str-sanitize.h" #include "strescape.h" @@ -334,6 +335,15 @@ void auth_request_export(struct auth_request *request, string_t *dest) str_append(dest, "\tsuccessful"); if (request->mech_name != NULL) auth_str_add_keyvalue(dest, "mech", request->mech_name); + /* export any userdb fields */ + if (request->userdb_reply != NULL) { + const ARRAY_TYPE(auth_field) *fields = auth_fields_export(request->userdb_reply); + const struct auth_field *field; + array_foreach(fields, field) { + str_printfa(dest, "\tuserdb_%s=", field->key); + str_append_tabescaped(dest, field->value); + } + } } bool auth_request_import_info(struct auth_request *request, @@ -442,7 +452,11 @@ bool auth_request_import(struct auth_request *request, request->skip_password_check = TRUE; else if (strcmp(key, "mech") == 0) request->mech_name = p_strdup(request->pool, value); - else + else if (strncmp(key, "userdb_", 7) == 0) { + if (request->userdb_reply == NULL) + request->userdb_reply = auth_fields_init(request->pool); + auth_fields_add(request->userdb_reply, key+7, value, 0); + } else return FALSE; return TRUE; diff --git a/src/auth/auth-worker-client.c b/src/auth/auth-worker-client.c index c2c28f93bd..f6daa4a0e9 100644 --- a/src/auth/auth-worker-client.c +++ b/src/auth/auth-worker-client.c @@ -437,7 +437,8 @@ auth_worker_handle_user(struct auth_worker_client *client, return FALSE; } - auth_request_init_userdb_reply(auth_request); + if (auth_request->userdb_reply == NULL) + auth_request_init_userdb_reply(auth_request); auth_request->userdb->userdb->iface-> lookup(auth_request, lookup_user_callback); return TRUE; @@ -605,7 +606,7 @@ auth_worker_handle_line(struct auth_worker_client *client, const char *line) unsigned int id; bool ret = FALSE; - args = t_strsplit_tab(line); + args = t_strsplit_tabescaped(line); if (args[0] == NULL || args[1] == NULL || args[2] == NULL || str_to_uint(args[0], &id) < 0) { i_error("BUG: Invalid input: %s", line);