From 72037a5a2ddbeed791824909587aa5f8e117470e Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Tue, 13 May 2025 17:47:15 +0000 Subject: [PATCH] Bug 39789: Check requests for the custom header with fallback to X-Forwarded-For This patch updates the feature to allow both the custom header and X-Forwarded-For to work harmoniously For example, CloudFlare has it's own custom header. This patch allows a site to be configured for Cloudflare's proxy before the proxy is enabled. --- C4/Context.pm | 13 ++++++------- Koha/Middleware/RealIP.pm | 14 ++++++-------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/C4/Context.pm b/C4/Context.pm index 95a33ae3e3d..589554e7f20 100644 --- a/C4/Context.pm +++ b/C4/Context.pm @@ -880,13 +880,12 @@ variable to be set correctly. sub set_remote_address { if ( C4::Context->config('koha_trusted_proxies') ) { require CGI; - if ( my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header') ) { # Updated here - my $header = CGI->http($reverse_proxy_ip_header); - - if ($header) { - require Koha::Middleware::RealIP; - $ENV{REMOTE_ADDR} = Koha::Middleware::RealIP::get_real_ip( $ENV{REMOTE_ADDR}, $header ); - } + my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header'); + my $header = $reverse_proxy_ip_header ? CGI->http($reverse_proxy_ip_header) : undef; + $header ||= CGI->http('HTTP_X_FORWARDED_FOR'); # If custom header is not set, fallback to X-Forwarded-For + if ($header) { + require Koha::Middleware::RealIP; + $ENV{REMOTE_ADDR} = Koha::Middleware::RealIP::get_real_ip( $ENV{REMOTE_ADDR}, $header ); } } } diff --git a/Koha/Middleware/RealIP.pm b/Koha/Middleware/RealIP.pm index 97394dffe6c..95409ce93ef 100644 --- a/Koha/Middleware/RealIP.pm +++ b/Koha/Middleware/RealIP.pm @@ -52,14 +52,12 @@ sub call { my $env = shift; my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header'); - if ( $reverse_proxy_ip_header && $env->{$reverse_proxy_ip_header} ) { - my @trusted_proxy = $self->trusted_proxy ? @{ $self->trusted_proxy } : undef; - - if (@trusted_proxy) { - my $addr = get_real_ip( $env->{REMOTE_ADDR}, $env->{$reverse_proxy_ip_header}, \@trusted_proxy ); - $ENV{REMOTE_ADDR} = $addr; - $env->{REMOTE_ADDR} = $addr; - } + my $header = $reverse_proxy_ip_header ? CGI->http($reverse_proxy_ip_header) : undef; + $header ||= CGI->http('HTTP_X_FORWARDED_FOR'); # If custom header is not set, fallback to X-Forwarded-For + if ($header) { + my $addr = get_real_ip( $env->{REMOTE_ADDR}, $header ); + $ENV{REMOTE_ADDR} = $addr; + $env->{REMOTE_ADDR} = $addr; } return $self->app->($env); -- 2.39.5 (Apple Git-154)