From: Timo Sirainen Date: Thu, 25 Jun 2020 17:03:57 +0000 (+0300) Subject: doveadm auth: Support forward and extra fields with -x parameter X-Git-Tag: 2.3.13~300 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b06d4c7309de18e7562a30123e6c48475a455a10;p=thirdparty%2Fdovecot%2Fcore.git doveadm auth: Support forward and extra fields with -x parameter Using "forward_" prefix assumes that it's a forwarded field. Otherwise all unknown parameters are assumed to be extra fields. --- diff --git a/src/doveadm/doveadm-auth.c b/src/doveadm/doveadm-auth.c index e7406ae892..62caee4410 100644 --- a/src/doveadm/doveadm-auth.c +++ b/src/doveadm/doveadm-auth.c @@ -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); } }