From c9b34314e0c237a4c4187b127569ccb987787400 Mon Sep 17 00:00:00 2001
From: gloas <gloas@afi-sa.fr>
Date: Thu, 30 Aug 2018 11:43:40 +0200
Subject: [PATCH] hotline #78264 fix lekiosk dashboard

---
 VERSIONS_HOTLINE/78264                        |  1 +
 library/Class/AdminVar.php                    |  5 +
 library/Class/AdminVar/Meta.php               |  5 +
 .../ZendAfi/View/Helper/Admin/AdminVar.php    | 33 +++++--
 library/digital_resources/Lekiosk/Config.php  | 31 ++++--
 .../{LeKioskTest.php => LekioskTest.php}      | 98 +++++++++++++++----
 6 files changed, 139 insertions(+), 34 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/78264
 rename library/digital_resources/Lekiosk/tests/{LeKioskTest.php => LekioskTest.php} (84%)

diff --git a/VERSIONS_HOTLINE/78264 b/VERSIONS_HOTLINE/78264
new file mode 100644
index 00000000000..1819bdc6352
--- /dev/null
+++ b/VERSIONS_HOTLINE/78264
@@ -0,0 +1 @@
+ - ticket #78264 : Connecteur Le Kiosk
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 7fcfa85c4dd..0e67930df7b 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -1007,6 +1007,11 @@ class Class_AdminVar extends Storm_Model_Abstract {
   }
 
 
+  public function isEncodedData() {
+    return $this->getMeta()->isEncodedData();
+  }
+
+
   public function isCombo() {
     return $this->getMeta()->isCombo();
   }
diff --git a/library/Class/AdminVar/Meta.php b/library/Class/AdminVar/Meta.php
index 35b3d4b52b6..6732d8a4d4c 100644
--- a/library/Class/AdminVar/Meta.php
+++ b/library/Class/AdminVar/Meta.php
@@ -100,6 +100,11 @@ class Class_AdminVar_Meta {
   }
 
 
+  public function isEncodedData() {
+    return static::TYPE_ENCODED_DATA == $this->_type;
+  }
+
+
   public function isCombo() {
     return self::TYPE_COMBO == $this->_type;
   }
diff --git a/library/ZendAfi/View/Helper/Admin/AdminVar.php b/library/ZendAfi/View/Helper/Admin/AdminVar.php
index ad2a79d5337..c6a1a4eabcb 100644
--- a/library/ZendAfi/View/Helper/Admin/AdminVar.php
+++ b/library/ZendAfi/View/Helper/Admin/AdminVar.php
@@ -22,7 +22,13 @@
 
 class ZendAfi_View_Helper_Admin_AdminVar extends ZendAfi_View_Helper_BaseHelper {
   public function adminVar($var) {
-    return $var->isOnOff() ? $this->renderOnOff($var) : $this->renderSimple($var);
+    if ($var->isOnOff())
+      return $this->renderOnOff($var);
+
+    if ($var->isMultiInput())
+      return $this->renderMultiInput($var);
+
+    return $this->renderSimple($var);
   }
 
 
@@ -43,18 +49,33 @@ class ZendAfi_View_Helper_Admin_AdminVar extends ZendAfi_View_Helper_BaseHelper
   }
 
 
+  protected function renderMultiInput($var) {
+    $value = $var->getValeur();
+    if (!$values = array_filter(explode(';', $value)))
+      return $value;
+
+    $lis = [];
+    foreach ($values as $item)
+      $lis [] = $this->_tag('li', $item);
+
+    return $this->_tag('ul', implode($lis));
+  }
+
+
   protected function renderSimple($var) {
     return wordwrap($this->cleanValue($var), 35, '<br />', true);
   }
 
 
   protected function cleanValue($var) {
-    if ($var->isRawText())
-      return $this->view->escape($var->getValeur());
+    $value = $var->getValeur();
+
+    if (preg_match('^%0D%0A^', $var->getValeur()))
+      $value = str_replace('%0D%0A', '<br />', $value);
 
-    if(preg_match('^%0D%0A^', $var->getValeur()))
-      return urldecode(str_replace('%0D%0A', '<br />', $var->getValeur()));
+    if ($var->isEncodedData())
+      return urldecode($value);
 
-    return urldecode($var->getValeur());
+    return $this->view->escape($value);
   }
 }
\ No newline at end of file
diff --git a/library/digital_resources/Lekiosk/Config.php b/library/digital_resources/Lekiosk/Config.php
index 2f2e6e6922a..44fe56cf2e8 100644
--- a/library/digital_resources/Lekiosk/Config.php
+++ b/library/digital_resources/Lekiosk/Config.php
@@ -110,21 +110,32 @@ class Lekiosk_Config extends Class_DigitalResource_Config {
     $service = $this->getServiceInstance();
     $token_url = $service->getTokenUrl();
     $catalogue_url = $service->getCatalogUrl(1);
-    $token_response = $service->getTokenResponse();
-    $token = $service->getTokenFrom($token_response);
+    $raw_token_response = $service->getTokenResponse();
+    $token_response = $view->escape($raw_token_response);
+    $token = $view->escape($service->getTokenFrom($raw_token_response));
+    $xml = $token
+      ? $view->escape($service->getXmlWithToken($token))
+      : '';
 
     $html = [$view->tag('p', $this->_('Ce moissonnage se compose de deux étapes:')),
              $view->tag('h4', $this->_('Première étape: La récupération du token JWT avec le login et password fourni à l\'adresse:')),
              $view->tag('pre', $token_url),
              $view->tag('p', $this->_('Réponse reçue à la demande de token :')),
-             $view->tag('pre', $token_response),
-             $view->tag('p', $this->_('Token reçu :')),
-             $view->tag('pre', $token),
-             $view->tag('h4', $this->_('Deuxième étape: La récupération du catalogue avec le token reçu à l\'adresse:')),
-             $view->tag('pre', $catalogue_url),
-             $view->tag('p', $this->_('Réponse reçue à la demande du catalogue:')),
-             $view->tag('pre', $view->escape($service->getXmlWithToken($token))),
-    ];
+             $view->tag('pre', $token_response)];
+
+    if (!$token) {
+      $html [] = $view->tagError($this->_('La réponse reçue ne permet pas de récupérer le "token". Il est donc impossible de récupérer le catalogue. Veuillez vérifier les variables liées au moissonnage. Si le problème persiste, contacter le prestataire en lui fournissant le paramétrage ainsi que le rapport du diagnostique de moissonnage.'));
+      return implode($html);
+    }
+
+    $html = array_merge($html,
+                        [$view->tag('p', $this->_('Token reçu :')),
+                         $view->tag('pre', $token),
+                         $view->tag('h4', $this->_('Deuxième étape: La récupération du catalogue avec le token reçu à l\'adresse:')),
+                         $view->tag('pre', $catalogue_url),
+                         $view->tag('p', $this->_('Réponse reçue à la demande du catalogue:')),
+                         $view->tag('pre', $xml),
+                        ]);
 
     return implode($html);
   }
diff --git a/library/digital_resources/Lekiosk/tests/LeKioskTest.php b/library/digital_resources/Lekiosk/tests/LekioskTest.php
similarity index 84%
rename from library/digital_resources/Lekiosk/tests/LeKioskTest.php
rename to library/digital_resources/Lekiosk/tests/LekioskTest.php
index ae80903ce80..035afcd645b 100644
--- a/library/digital_resources/Lekiosk/tests/LeKioskTest.php
+++ b/library/digital_resources/Lekiosk/tests/LekioskTest.php
@@ -39,7 +39,7 @@ class LekioskAdminVars {
 
 
 
-abstract class LeKioskLinkModeLinkTestCase extends ModelTestCase {
+abstract class LekioskLinkModeLinkTestCase extends ModelTestCase {
   protected
     $_storm_default_to_volatile = true;
 
@@ -58,7 +58,7 @@ abstract class LeKioskLinkModeLinkTestCase extends ModelTestCase {
 
 
 
-class LeKioskLinkModeLinkTest extends LeKioskLinkModeLinkTestCase {
+class LekioskLinkModeLinkTest extends LekioskLinkModeLinkTestCase {
   /** @test */
   public function urlForMyemailAtLekioskDotComShouldContainsEncryptedEmail() {
     $expected = 'https://pros.lekiosk.com/login/accesshash?email=1671f18f515f49271985280397c1c2bc48e1bfa31a3b638cb22e510e4953d65e&id=29&AccessHash=4eef094aacc80db2698f841214bba28f8b5d001a';
@@ -87,7 +87,7 @@ class LeKioskLinkModeLinkTest extends LeKioskLinkModeLinkTestCase {
 
 
 
-class LeKioskLinkModeSSOTest extends LeKioskLinkModeLinkTestCase {
+class LekioskLinkModeSSOTest extends LekioskLinkModeLinkTestCase {
   public function setUp() {
     parent::setUp();
 
@@ -101,7 +101,7 @@ class LeKioskLinkModeSSOTest extends LeKioskLinkModeLinkTestCase {
 
 
   /** @test */
-  public function linkShouldBeCasUrlWithLeKioskId() {
+  public function linkShouldBeCasUrlWithLekioskId() {
     $url = 'https://apipros.lekiosk.com/login/cas?'
       .'cas_fournisseur=' . urlencode(Class_Url::rootUrl() . BASE_URL . '/cas-server-v10')
                           .'&id=29'
@@ -116,7 +116,7 @@ class LeKioskLinkModeSSOTest extends LeKioskLinkModeLinkTestCase {
 
 
 
-class LeKioskModulesControllerUserWithGroupWithRightTest
+class LekioskModulesControllerUserWithGroupWithRightTest
   extends AbstractControllerTestCase {
 
   protected $_storm_default_to_volatile = true;
@@ -163,8 +163,8 @@ class LeKioskModulesControllerUserWithGroupWithRightTest
 
 
 
-class LeKioskModulesControllerUserWithGroupWithRightInPhoneTest
-  extends LeKioskModulesControllerUserWithGroupWithRightTest {
+class LekioskModulesControllerUserWithGroupWithRightInPhoneTest
+  extends LekioskModulesControllerUserWithGroupWithRightTest {
 
   public function setUp() {
     parent::setUp();
@@ -185,7 +185,7 @@ class LeKioskModulesControllerUserWithGroupWithRightInPhoneTest
 
 
 
-class LeKioskModulesControllerTest extends AbstractControllerTestCase {
+class LekioskModulesControllerTest extends AbstractControllerTestCase {
   protected
     $_storm_default_to_volatile = true,
     $_expected_login_redirect;
@@ -245,7 +245,7 @@ class LeKioskModulesControllerTest extends AbstractControllerTestCase {
 
 
 
-abstract class LeKioskServiceTestCase extends AbstractControllerTestCase {
+abstract class LekioskServiceTestCase extends AbstractControllerTestCase {
   protected
     $_10_national_sport,
     $_service,
@@ -281,7 +281,7 @@ abstract class LeKioskServiceTestCase extends AbstractControllerTestCase {
 
 
 
-class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
+class LekioskServiceHarvestTest extends LekioskServiceTestCase {
 
   /** @test */
   public function nameShouldBeLekiosk() {
@@ -302,7 +302,7 @@ class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
 
 
   /** @test */
-  public function categoryLeKioskShouldBeCreated() {
+  public function categoryLekioskShouldBeCreated() {
     $this->assertEquals('Lekiosk', $this->_10_national_sport->getCategoryLabel());
   }
 
@@ -337,7 +337,7 @@ class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
 
 
   /** @test */
-  public function nationalSportSSOUrlShouldBeLeKioskDotCom() {
+  public function nationalSportSSOUrlShouldBeLekioskDotCom() {
     $this->assertEquals('https://pro.lekiosk.com/lekiosque.sso.aspx?ReturnUrl=Le-10-Sport-National-z1962566.aspx', $this->_10_national_sport->getExternalUri());
   }
 
@@ -349,8 +349,8 @@ class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
 
 
   /** @test */
-  public function nationalSportDoctypeShouldBeNumericSerialLeKiosk() {
-    $this->assertEquals('Magazine numérique LeKiosk', $this->_10_national_sport->getTypeDoc()->getLabel());
+  public function nationalSportDoctypeShouldBeNumericSerialLekiosk() {
+    $this->assertEquals('Magazine numérique Lekiosk', $this->_10_national_sport->getTypeDoc()->getLabel());
   }
 
 
@@ -376,7 +376,7 @@ class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
 
 
 
-class LeKioskRenderAlbumFromRecordTest extends LekioskServiceTestCase {
+class LekioskRenderAlbumFromRecordTest extends LekioskServiceTestCase {
   public function setUp() {
     parent::setUp();
     Class_AdminVar::set('Lekiosk_SSO_MODE', 'CAS');
@@ -479,7 +479,7 @@ class LekioskAdminUserGroupControllerRessourcesNumeriquesTest extends Admin_Abst
   public function ressourceActivatedShouldBeVisible() {
     LekioskAdminVars::activate();
     $this->dispatch('admin/usergroup/edit/id/6', true);
-    $this->assertXPathContentContains('//label', 'Bibliothèque numérique: accéder à LeKiosk');
+    $this->assertXPathContentContains('//label', 'Bibliothèque numérique: accéder à Lekiosk');
   }
 
 
@@ -487,7 +487,7 @@ class LekioskAdminUserGroupControllerRessourcesNumeriquesTest extends Admin_Abst
   public function ressourceDeactivatedShouldNotBeVisible() {
     LekioskAdminVars::deactivate();
     $this->dispatch('admin/usergroup/edit/id/6', true);
-    $this->assertNotXPathContentContains('//label', 'LeKiosk');
+    $this->assertNotXPathContentContains('//label', 'Lekiosk');
   }
 }
 
@@ -547,7 +547,7 @@ class LekioskJsonReport extends ZendAfi_View_Helper_Status_TestCase {
 
 
 
-class LeKioskServiceHttpHarvestingTestCase extends AbstractControllerTestCase {
+class LekioskServiceHttpHarvestingTestCase extends AbstractControllerTestCase {
 
   protected $_storm_default_to_volatile = true;
 
@@ -607,3 +607,65 @@ class LeKioskServiceHttpHarvestingTestCase extends AbstractControllerTestCase {
   }
 
 }
+
+
+
+
+class LekioskPluginTest extends Admin_AbstractControllerTestCase {
+
+  protected $_storm_default_to_volatile = true;
+
+
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('Lekiosk_ID', '29');
+
+    Class_AdminVar::set('Lekiosk_HARVEST_URL', 'http://lekiosk.org/oai');
+    Class_AdminVar::set('Lekiosk_HTTP_LOGIN', 'lekiosk');
+    Class_AdminVar::set('Lekiosk_HTTP_PASSWORD', 'PWD+456');
+
+    $group = $this->fixture('Class_UserGroup',
+                            ['id' => 1,
+                             'libelle' => 'group']);
+
+    $user = $this->fixture('Class_Users',
+                           ['id' => 1,
+                            'login' => 'Tom',
+                            'password' => 'pwd']);
+    $user
+      ->beAbonneSIGB()
+      ->setDateFin('9999-01-01')
+      ->setIdabon('2345')
+      ->setBib($this->fixture('Class_Bib',
+                              ['id' => 2,
+                               'libelle' => 'Annecy']))
+      ->setUserGroups([$group])
+      ->save();
+
+    ZendAfi_Auth::getInstance()->logUser($user);
+
+    $this->fixture('Class_Permission',
+                   ['id' => 1,
+                    'code' => 'Lekiosk'])
+         ->permitTo($group,  new Class_Entity());
+
+    $this->fixture('Class_Batch',
+                   ['id' => 1,
+                    'type' => 'Lekiosk_Batch'
+                   ]);
+
+    $this->dispatch('/Lekiosk_Plugin', true);
+  }
+
+
+  /** @test */
+  public function httpPasswordShouldBeDisplayedWithPlus() {
+    $this->assertXPathContentContains('//table', 'PWD+456');
+  }
+
+
+  /** @test */
+  public function noTokenErrorMessageShouldBePresent() {
+    $this->assertXPathContentContains('//div', 'La réponse reçue ne permet pas de récupérer le "token". Il est donc impossible de récupérer le catalogue. Veuillez vérifier les variables liées au moissonnage. Si le problème persiste, contacter le prestataire en lui fournissant le paramétrage ainsi que le rapport du diagnostique de moissonnage.');
+  }
+}
\ No newline at end of file
-- 
GitLab