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; }