diff --git a/C4/Context.pm b/C4/Context.pm index b4fc94a466..9e48a499b9 100644 --- a/C4/Context.pm +++ b/C4/Context.pm @@ -915,7 +915,12 @@ variable to be set correctly. sub set_remote_address { if ( C4::Context->config('koha_trusted_proxies') ) { require CGI; - my $header = CGI->http('HTTP_X_FORWARDED_FOR'); + + # If no reverse_proxy_ip_header, just use HTTP_X_FORWARDED_FOR as the header to check, simplifies logic and is a bit faster that way + my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header') || 'HTTP_X_FORWARDED_FOR'; + + # Check the cgi for the custom header, if the custom header is not set, fall back to HTTP_X_FORWARDED_FOR + my $header = CGI->http($reverse_proxy_ip_header) || CGI->http('HTTP_X_FORWARDED_FOR'); if ($header) { require Koha::Middleware::RealIP; diff --git a/Koha/Middleware/RealIP.pm b/Koha/Middleware/RealIP.pm index 352f484ea2..2c0c077497 100644 --- a/Koha/Middleware/RealIP.pm +++ b/Koha/Middleware/RealIP.pm @@ -51,14 +51,15 @@ sub call { my $self = shift; my $env = shift; - if ( $env->{HTTP_X_FORWARDED_FOR} ) { - my @trusted_proxy = $self->trusted_proxy ? @{ $self->trusted_proxy } : undef; + # If no reverse_proxy_ip_header, just use HTTP_X_FORWARDED_FOR as the header to check, simplifies logic and is a bit faster that way + my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header') || 'HTTP_X_FORWARDED_FOR'; - if (@trusted_proxy) { - my $addr = get_real_ip( $env->{REMOTE_ADDR}, $env->{HTTP_X_FORWARDED_FOR}, \@trusted_proxy ); - $ENV{REMOTE_ADDR} = $addr; - $env->{REMOTE_ADDR} = $addr; - } + # Check the env for the custom header, if the custom header is not set, fall back to HTTP_X_FORWARDED_FOR + my $header = $env->{$reverse_proxy_ip_header} || $env->{'HTTP_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); @@ -76,6 +77,9 @@ determines the correct external ip address, and returns it. sub get_real_ip { my ( $remote_addr, $header ) = @_; + my $enable_trusted_proxy_for_headers = C4::Context->config('enable_trusted_proxy_for_headers') // 1; + return $remote_addr unless $enable_trusted_proxy_for_headers; + my @forwarded_for = $header =~ /([^,\s]+)/g; return $remote_addr unless @forwarded_for; diff --git a/debian/templates/koha-conf-site.xml.in b/debian/templates/koha-conf-site.xml.in index 7ef3785748..cda08eaa57 100644 --- a/debian/templates/koha-conf-site.xml.in +++ b/debian/templates/koha-conf-site.xml.in @@ -346,8 +346,11 @@ __END_SRU_PUBLICSERVER__ 2 +