]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm auth: Support forward and extra fields with -x parameter
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 25 Jun 2020 17:03:57 +0000 (20:03 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 27 Aug 2020 06:20:18 +0000 (06:20 +0000)
Using "forward_" prefix assumes that it's a forwarded field. Otherwise
all unknown parameters are assumed to be extra fields.

src/doveadm/doveadm-auth.c

index e7406ae8929e70d7f342c84214f9276befe936e9..62caee4410917c21addb547ca3c15df70e80fe36 100644 (file)
@@ -7,6 +7,7 @@
 #include "base64.h"
 #include "hex-binary.h"
 #include "str.h"
+#include "strescape.h"
 #include "var-expand.h"
 #include "wildcard-match.h"
 #include "settings-parser.h"
@@ -193,6 +194,8 @@ static void auth_connected(struct auth_client *client,
        info.local_port = input->info.local_port;
        info.remote_ip = input->info.remote_ip;
        info.remote_port = input->info.remote_port;
+       info.extra_fields = input->info.extra_fields;
+       info.forward_fields = input->info.forward_fields;
        info.initial_resp_base64 = str_c(base64_resp);
        if (doveadm_settings->auth_debug ||
            event_want_debug_log(event_auth))
@@ -240,8 +243,27 @@ static void auth_user_info_parse(struct auth_user_info *info, const char *arg)
        } else if (str_begins(arg, "rport=")) {
                if (net_str2port(arg + 6, &info->remote_port) < 0)
                        i_fatal("rport: Invalid port number");
+       } else if (str_begins(arg, "forward_")) {
+               const char *key = arg+8;
+               const char *value = strchr(arg+8, '=');
+
+               if (value == NULL)
+                       value = "";
+               else
+                       key = t_strdup_until(key, value++);
+               key = str_tabescape(key);
+               value = str_tabescape(value);
+               if (info->forward_fields == NULL) {
+                       info->forward_fields =
+                               t_strdup_printf("%s=%s", key, value);
+               } else {
+                       info->forward_fields =
+                               t_strdup_printf("%s\t%s=%s", info->forward_fields, key, value);
+               }
        } else {
-               i_fatal("Unknown -x argument: %s", arg);
+               if (!array_is_created(&info->extra_fields))
+                       t_array_init(&info->extra_fields, 4);
+               array_push_back(&info->extra_fields, &arg);
        }
 }