From c9a5348193bd8405fe413dfe265e2fdc419f578c Mon Sep 17 00:00:00 2001 From: djmaze <> Date: Mon, 26 Oct 2026 00:23:08 +0100 Subject: [PATCH] Also check domainname for valid ip address --- .../0.0.0/app/libraries/RainLoop/ServiceActions.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index c2ef623c9..f853f4df7 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -279,10 +279,18 @@ class ServiceActions // https://github.com/the-djmaze/snappymail/security/advisories/GHSA-xpr6-5vj6-wq26 private static function allowedProxyUri($uri) : bool { - if (!\preg_match('#^https?://([^/:]+)#i', $uri, $m)) { + if (!\preg_match('#^https?://#i', $uri)) { return false; } - $host = $m[1]; + $host = \parse_url($uri, \PHP_URL_HOST); + if (!\is_string($host) || '' === $host) { + return null; + } + // Bracketed IPv6 literals (http://[::1]/): parse_url keeps the + // brackets, which filter_var rejects, so strip them first. + if (\str_starts_with($host, '[') && \str_ends_with($host, ']')) { + $host = \substr($host, 1, -1); + } // Validate direct IP or resolve hostname $ips = \filter_var($host, \FILTER_VALIDATE_IP) ? [$host] : \gethostbynamel($host); if (!$ips || !\is_array($ips)) {