|
Lines 51-64
sub call {
Link Here
|
| 51 |
my $self = shift; |
51 |
my $self = shift; |
| 52 |
my $env = shift; |
52 |
my $env = shift; |
| 53 |
|
53 |
|
| 54 |
if ( $env->{HTTP_X_FORWARDED_FOR} ) { |
54 |
# 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 |
| 55 |
my @trusted_proxy = $self->trusted_proxy ? @{ $self->trusted_proxy } : undef; |
55 |
my $reverse_proxy_ip_header = C4::Context->config('reverse_proxy_ip_header') || 'HTTP_X_FORWARDED_FOR'; |
| 56 |
|
56 |
|
| 57 |
if (@trusted_proxy) { |
57 |
# Check the env for the custom header, if the custom header is not set, fall back to HTTP_X_FORWARDED_FOR |
| 58 |
my $addr = get_real_ip( $env->{REMOTE_ADDR}, $env->{HTTP_X_FORWARDED_FOR}, \@trusted_proxy ); |
58 |
my $header = $env->{$reverse_proxy_ip_header} || $env->{'HTTP_X_FORWARDED_FOR'}; |
| 59 |
$ENV{REMOTE_ADDR} = $addr; |
59 |
if ($header) { |
| 60 |
$env->{REMOTE_ADDR} = $addr; |
60 |
my $addr = get_real_ip( $env->{REMOTE_ADDR}, $header ); |
| 61 |
} |
61 |
$ENV{REMOTE_ADDR} = $addr; |
|
|
62 |
$env->{REMOTE_ADDR} = $addr; |
| 62 |
} |
63 |
} |
| 63 |
|
64 |
|
| 64 |
return $self->app->($env); |
65 |
return $self->app->($env); |
|
Lines 76-81
determines the correct external ip address, and returns it.
Link Here
|
| 76 |
sub get_real_ip { |
77 |
sub get_real_ip { |
| 77 |
my ( $remote_addr, $header ) = @_; |
78 |
my ( $remote_addr, $header ) = @_; |
| 78 |
|
79 |
|
|
|
80 |
my $enable_trusted_proxy_for_headers = C4::Context->config('enable_trusted_proxy_for_headers') // 1; |
| 81 |
return $remote_addr unless $enable_trusted_proxy_for_headers; |
| 82 |
|
| 79 |
my @forwarded_for = $header =~ /([^,\s]+)/g; |
83 |
my @forwarded_for = $header =~ /([^,\s]+)/g; |
| 80 |
return $remote_addr unless @forwarded_for; |
84 |
return $remote_addr unless @forwarded_for; |
| 81 |
|
85 |
|