From 29d7afe6c3eaebb3b212810630243d012415a926 Mon Sep 17 00:00:00 2001 From: Doug Hoyte Date: Fri, 18 Oct 2024 18:04:21 -0400 Subject: [PATCH] =?UTF-8?q?hack=20to=20workaround=20uWebsockets=20issue=20?= =?UTF-8?q?preventing=20parsing=20of=20some=20IPv6=20addresses=20(reported?= =?UTF-8?q?=20by=20Petr=20Krac=C3=ADk)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES | 2 ++ src/apps/relay/RelayWebsocket.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/CHANGES b/CHANGES index 17b379c..0ded833 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ * New config param: relay.info.nips which allows you to override the NIPs that are claimed to be supported (requested by ismyhc) * New connectionTimeout parameter in router config (thanks Braydon Fuller!) + * Bugfix: IPv4-mapped IPv6 addresses in X-Real-IP headers were not parsed + correctly (reported by Petr KracĂ­k) 1.0.1 * Prevent exporting a v2 DB using --fried. The packed representation will be diff --git a/src/apps/relay/RelayWebsocket.cpp b/src/apps/relay/RelayWebsocket.cpp index 6ba1503..b87de56 100644 --- a/src/apps/relay/RelayWebsocket.cpp +++ b/src/apps/relay/RelayWebsocket.cpp @@ -197,6 +197,11 @@ void RelayServer::runWebsocket(ThreadPool::Thread &thr) { if (cfg().relay__realIpHeader.size()) { auto header = req.getHeader(cfg().relay__realIpHeader.c_str()).toString(); // not string_view: parseIP needs trailing 0 byte + + // HACK: uWebSockets strips leading : characters, which interferes with IPv6 parsing. + // This fixes it for the common ::1 and ::ffff:1.2.3.4 cases. FIXME: fix the underlying library. + if (header == "1" || header.starts_with("ffff:")) header = std::string("::") + header; + c->ipAddr = parseIP(header); if (c->ipAddr.size() == 0) LW << "Couldn't parse IP from header " << cfg().relay__realIpHeader << ": " << header; }