From 4b9d980e9e383cdecea210b4477c53980b8ee455 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Fri, 26 Jan 2024 08:58:17 +0100 Subject: [PATCH] Bug 35918: Fix auto library connect (AutoLocation) This code is a bit weird, its purpose it to auto select the library depending on the IP. A problem appears if the same IP is used, then the user's choice will might be overwritten randomly by another library. To recreate the problem: Turn on AutoLocation Use koha/koha @CPL for test And the following config: *************************** 1. row *************************** branchcode: CPL branchname: Centerville branchip: 172.18.0.1 *************************** 2. row *************************** branchcode: FFL branchname: Fairfield branchip: 172.18.0.1 *************************** 3. row *************************** branchcode: FPL branchname: Fairview branchip: 172.18.0.4 Connect and select CPL. Randomly FFL will be picked instead. Signed-off-by: Magnus Enger Tested this on top of 35890 and 35904 because git bz said they were required dependencies. Figured out the IP Koha was seeing me as coming from in /var/log/koha/kohadev/plack.log. Added that IP to the branchip for Centerville, Fairfield and Fairview. Set AutoLocation = Yes. After this I could recreate the problem: If i left the "Library" field in the login screen at "My Library" I got logged into a random library selected from the three i had set branchip for. Applying the patches fixed this, as expected. Tests pass, with AutoLocation off. Signed-off-by: Kyle M Hall (cherry picked from commit 4efe74fe12075298680965db3605f717f1da10d0) Signed-off-by: Fridolin Somers --- C4/Auth.pm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/C4/Auth.pm b/C4/Auth.pm index fe84671c82..01604fae88 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -26,6 +26,7 @@ use CGI::Session; use CGI::Session::ErrorHandler; use URI; use URI::QueryParam; +use List::MoreUtils qw( uniq ); use C4::Context; use C4::Templates; # to get the template @@ -1213,15 +1214,18 @@ sub checkauth { } } - foreach my $br ( keys %$branches ) { + if ( C4::Context->preference('AutoLocation') && $auth_state ne 'failed' ) { + foreach my $br ( uniq( $branchcode, keys %$branches ) ) { - # now we work with the treatment of ip - my $domain = $branches->{$br}->{'branchip'}; - if ( $domain && $ip =~ /^$domain/ ) { - $branchcode = $branches->{$br}->{'branchcode'}; + # now we work with the treatment of ip + my $domain = $branches->{$br}->{'branchip'}; + if ( $domain && $ip =~ /^$domain/ ) { + $branchcode = $branches->{$br}->{'branchcode'}; - # new op dev : add the branchname to the cookie - $branchname = $branches->{$br}->{'branchname'}; + # new op dev : add the branchname to the cookie + $branchname = $branches->{$br}->{'branchname'}; + last; + } } } -- 2.20.1