]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Pass userdb fields to worker
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 12 Oct 2016 09:04:10 +0000 (12:04 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 13 Oct 2016 08:28:21 +0000 (10:28 +0200)
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
src/auth/auth-worker-client.c

index f5a2e26ddae3c7d0fa5d5728c99cb155c1ea1a37..e170da0c2b5ffcf475d3c9a0b3f54a858d7b8800 100644 (file)
@@ -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;
index c2c28f93bd91c0166e2109a2564bf5cc74519585..f6daa4a0e958e0d74e2346fd93168d801f48f197 100644 (file)
@@ -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);