From c41f966ca1d1496e1f0a52c0a897b30cb61743df Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
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.
---
 C4/Auth.pm | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/C4/Auth.pm b/C4/Auth.pm
index 1d31c5b7466..7c77bb5a358 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
@@ -1211,15 +1212,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.34.1