From 3e2a8df440a63e5a8772d3451697913933197b08 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Fri, 22 Oct 2021 21:54:43 +0200
Subject: [PATCH] managesieve-login: Pass forward_ passdb args using XCLIENT
 command.

---
 src/managesieve-login/managesieve-proxy.c | 33 ++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/managesieve-login/managesieve-proxy.c b/src/managesieve-login/managesieve-proxy.c
index b99b756ff..4e7898021 100644
--- a/src/managesieve-login/managesieve-proxy.c
+++ b/src/managesieve-login/managesieve-proxy.c
@@ -8,6 +8,7 @@
 #include "ostream.h"
 #include "str.h"
 #include "str-sanitize.h"
+#include "strescape.h"
 #include "safe-memset.h"
 #include "buffer.h"
 #include "base64.h"
@@ -31,13 +32,43 @@ static const char *managesieve_proxy_state_names[MSIEVE_PROXY_STATE_COUNT] = {
 	"none", "tls-start", "tls-ready", "xclient", "auth"
 };
 
+static string_t *
+proxy_compose_xclient_forward(struct managesieve_client *client)
+{
+	const char *const *arg;
+	string_t *str;
+
+	if (*client->common.auth_passdb_args == NULL)
+		return NULL;
+
+	str = t_str_new(128);
+	for (arg = client->common.auth_passdb_args; *arg != NULL; arg++) {
+		if (strncasecmp(*arg, "forward_", 8) == 0) {
+			if (str_len(str) > 0)
+				str_append_c(str, '\t');
+			str_append_tabescaped(str, (*arg)+8);
+		}
+	}
+	if (str_len(str) == 0)
+		return NULL;
+
+	return str;
+}
+
 static void
 proxy_write_xclient(struct managesieve_client *client, string_t *str)
 {
-	str_printfa(str, "XCLIENT ADDR=%s PORT=%u SESSION=%s TTL=%u\r\n",
+	string_t *fwd = proxy_compose_xclient_forward(client);
+
+	str_printfa(str, "XCLIENT ADDR=%s PORT=%u SESSION=%s TTL=%u",
 		    net_ip2addr(&client->common.ip), client->common.remote_port,
 		    client_get_session_id(&client->common),
 		    client->common.proxy_ttl - 1);
+	if (fwd != NULL) {
+		str_append(str, " FORWARD=");
+		base64_encode(str_data(fwd), str_len(fwd), str);
+	}
+	str_append(str, "\r\n");
 }
 
 static void
-- 
GitLab