Bug 24537: Allow IP ranges in ILS-DI:AuthorizedIPs using Net::Netmask
This patch uses Net::Netmask to match IPs from ILS-DI:AuthorizedIPs
against $ENV{REMOTE_USER}. By using Net::Netmask, we can use addresses
in a variety of formats. This includes 127.0.0.1, 192.168.1.0/24,
10.0.0, and so on.
To Test:
1. Apply the patch
2. Empty the 'ILS-DI:AuthorizedIPs' system preference
3. Send a request to '/cgi-bin/koha/ilsdi.pl?service=LookupPatron&id=1&id_type=cardnumber'
3b. Note that the request is successful
4. Set the 'ILS-DI:AuthorizedIPs' system preference to a subnet including
your IP address (e.g. 192.168.1.0/24)
5. Send a request to '/cgi-bin/koha/ilsdi.pl?service=LookupPatron&id=1&id_type=cardnumber'
5b. Note that the request is successful
6. Set the 'ILS-DI:AuthorizedIPs' system preference to a subnet that doesn't include
your IP address (e.g. 1.1.1)
7. Send a request to '/cgi-bin/koha/ilsdi.pl?service=LookupPatron&id=1&id_type=cardnumber'
7b. Note that your request is refused
8. Try a variety of permutations including bad values (e.g. 192.168.1.) or multiple values
(e.g. 10.0.0.0/8,192.168.1.0/24) or multiple values including a mix of good and bad values
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
parent
2e1e9c5b48
commit
cede9bbe43
|
|
@ -27,6 +27,7 @@ use C4::Context;
|
|||
use List::MoreUtils qw(any);
|
||||
use XML::Simple;
|
||||
use CGI qw ( -utf8 );
|
||||
use Net::Netmask;
|
||||
|
||||
=head1 DLF ILS-DI for Koha
|
||||
|
||||
|
|
@ -164,11 +165,19 @@ unless ( C4::Context->preference('ILS-DI') ) {
|
|||
|
||||
# If the remote address is not allowed, redirect to 403
|
||||
my @AuthorizedIPs = split(/,/, C4::Context->preference('ILS-DI:AuthorizedIPs'));
|
||||
if ( @AuthorizedIPs # If no filter set, allow access to everybody
|
||||
and not any { $ENV{'REMOTE_ADDR'} eq $_ } @AuthorizedIPs # IP Check
|
||||
) {
|
||||
$out->{'code'} = "NotAllowed";
|
||||
$out->{'message'} = "Unauthorized IP address: ".$ENV{'REMOTE_ADDR'}.".";
|
||||
if ( @AuthorizedIPs ){ # If no filter set, allow access to everybody
|
||||
my $authorized = 0;
|
||||
foreach my $ip (@AuthorizedIPs){
|
||||
my $netmask = Net::Netmask->new2($ip);
|
||||
if ( $netmask && $netmask->match($ENV{'REMOTE_ADDR'}) ){
|
||||
$authorized = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
unless ($authorized){
|
||||
$out->{'code'} = "NotAllowed";
|
||||
$out->{'message'} = "Unauthorized IP address: ".$ENV{'REMOTE_ADDR'}.".";
|
||||
}
|
||||
}
|
||||
|
||||
my $service = $cgi->param('service') || "ilsdi";
|
||||
|
|
|
|||
Loading…
Reference in New Issue