From 401d5c6160c9cbff1cd00205d2903ad7ff24cf29 Mon Sep 17 00:00:00 2001
From: Patrick Barroca <pbarroca@afi-sa.fr>
Date: Tue, 5 Feb 2019 16:05:53 +0100
Subject: [PATCH] hotline #86381 : fix Nanook authentication through ILS only

---
 VERSIONS_HOTLINE/86381                        |  1 +
 .../Class/WebService/SIGB/Nanook/Service.php  | 21 ++++++++++++--
 .../Class/WebService/SIGB/NanookTest.php      | 29 +++++++++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/86381

diff --git a/VERSIONS_HOTLINE/86381 b/VERSIONS_HOTLINE/86381
new file mode 100644
index 00000000000..59c5a5449e9
--- /dev/null
+++ b/VERSIONS_HOTLINE/86381
@@ -0,0 +1 @@
+ - ticket #86381 : SIGB Nanook : Correction de l'authentification par SIGB uniquement
\ No newline at end of file
diff --git a/library/Class/WebService/SIGB/Nanook/Service.php b/library/Class/WebService/SIGB/Nanook/Service.php
index d474d356220..616186c94f5 100644
--- a/library/Class/WebService/SIGB/Nanook/Service.php
+++ b/library/Class/WebService/SIGB/Nanook/Service.php
@@ -107,19 +107,34 @@ class Class_Webservice_SIGB_Nanook_Service extends Class_WebService_SIGB_Abstrac
    * @return Class_WebService_SIGB_Emprunteur
    */
   public function getEmprunteur($user) {
-    if (!$this->ilsdiAuthenticatePatron($user))
+    if (!$user
+        || (!$patron_id = $this->_patronIdFromUser($user)))
       return Class_WebService_SIGB_Emprunteur::nullInstance();
-    $emprunteur= $this->ilsdiGetPatronInfo(['patronId' => $user->getIdSigb()],
-                                     Class_WebService_SIGB_Nanook_PatronInfoReader::newInstance());
+
+    $emprunteur = $this->ilsdiGetPatronInfo(['patronId' => $user->getIdSigb()],
+                                            Class_WebService_SIGB_Nanook_PatronInfoReader::newInstance());
 
     if (!$emprunteur->getCodeBarres())
       $emprunteur->setCodeBarres($user->getLogin());
 
     $emprunteur->setPassword($user->getPassword());
+
     return $emprunteur;
   }
 
 
+  protected function _patronIdFromUser($user) {
+    $patron_id = Class_Users::isLogged($user)
+      ? $user->getIdSigb()
+      : '';
+
+    if (!$patron_id && $this->ilsdiAuthenticatePatron($user))
+      $patron_id = $user->getIdSigb();
+
+    return $patron_id;
+  }
+
+
   public function getUserAnnexe($user) {
     return $user->id_site;
   }
diff --git a/tests/library/Class/WebService/SIGB/NanookTest.php b/tests/library/Class/WebService/SIGB/NanookTest.php
index be53739a3d0..53716110fef 100644
--- a/tests/library/Class/WebService/SIGB/NanookTest.php
+++ b/tests/library/Class/WebService/SIGB/NanookTest.php
@@ -888,6 +888,35 @@ class NanookGetEmprunteurAuthenticateTest extends NanookTestCase {
     $this->assertEmpty($emprunteur->getPassword());
   }
 
+
+
+  /** @test */
+  public function withLoginThroughSigbOnlyAndAlreadyLoggedShouldNotAuthenticatePatron() {
+    $this->_mock_web_client
+      ->whenCalled('open_url')
+      ->with('http://localhost:8080/afi_Nanook/ilsdi/service/GetPatronInfo/patronId/999')
+      ->answers(NanookFixtures::xmlGetPatronError());
+
+    Class_AdminVar::set('LOGIN_THROUGH_SIGB_ONLY', '1');
+
+    $user = $this->fixture('Class_Users',
+                   ['id' => 98734,
+                    'id_site' => 3,
+                    'idabon' => 'A-00001',
+                    'id_sigb' => '999',
+                    'login' => '90175000410218',
+                    'password' => '',
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB,
+                   ]);
+
+    ZendAfi_Auth::getInstance()->logUser($user);
+
+    $emprunteur = $this->_service->getEmprunteur($user);
+
+    $this->assertTrue($this->_mock_web_client
+                      ->methodHasBeenCalledWithParams('open_url',
+                                                      ['http://localhost:8080/afi_Nanook/ilsdi/service/GetPatronInfo/patronId/999']));
+  }
 }
 
 
-- 
GitLab