]> 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)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 12 Oct 2016 11:46:27 +0000 (14:46 +0300)
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 3045e2724a9b7e2bb43b7b2bbf1d438d6d627053..7a60c977318d18575cb624ab25692cf2c658b0b2 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 283a13333382fc13c5614d1c8438cec96a5939b3..2cd4ac2bf29814a12e5ce605027d9370e4191d41 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);