From 6170054a81a0c38f1d7cf8284d39ec2644fff246 Mon Sep 17 00:00:00 2001
From: Patrick Barroca <pbarroca@afi-sa.fr>
Date: Thu, 16 Feb 2017 16:27:27 +0100
Subject: [PATCH] dev #50215 sso using standard controller/module_menu api

---
 .../opac/controllers/ModulesController.php      | 14 ++++++--------
 library/Class/DigitalResource.php               |  9 +++++++++
 library/Class/DigitalResource/ModuleMenu.php    |  7 ++++++-
 library/Class/Notice/Sso.php                    | 13 +++++--------
 .../digital_resources/Bibliondemand/Config.php  | 16 +++++-----------
 .../Bibliondemand/ModuleMenu.php                | 17 ++++++++++++++---
 6 files changed, 45 insertions(+), 31 deletions(-)

diff --git a/application/modules/opac/controllers/ModulesController.php b/application/modules/opac/controllers/ModulesController.php
index ed09d049c95..1fe1e1f449d 100644
--- a/application/modules/opac/controllers/ModulesController.php
+++ b/application/modules/opac/controllers/ModulesController.php
@@ -95,17 +95,15 @@ class ModulesController extends ZendAfi_Controller_Action {
       return;
     }
 
-    if ($url = (new Class_Notice_Sso($record))->getUrl()) {
-      $viewRenderer = $this->getHelper('ViewRenderer');
-      $viewRenderer->setNoRender();
-      $this->getResponse()->setHeader('Content-Type', 'text/html;charset=utf-8');
-      $this->getResponse()->setBody('<script>window.location="'.$url.'";</script>');
+    $sso_record = new Class_Notice_Sso($record);
+    if(!$module_menu = $sso_record->getModuleMenu()) {
+      $this->_helper->notify($this->_('Oups, l\'adresse de consultation de ce document est indeterminée'));
+      $this->_redirectToReferer();
       return;
     }
 
-    $this->_helper->notify($this->_('Oups, l\'adresse de consultation de ce document est indeterminée'));
-    $this->_redirectToReferer();
-    return;
+    $module_menu->setRecord($sso_record);
+    $this->simple($module_menu);
   }
 
 
diff --git a/library/Class/DigitalResource.php b/library/Class/DigitalResource.php
index 5e75e54e458..7adf793e87e 100644
--- a/library/Class/DigitalResource.php
+++ b/library/Class/DigitalResource.php
@@ -208,6 +208,15 @@ class Class_DigitalResource extends Class_Entity {
   }
 
 
+  public function getModuleMenuFor($name) {
+    $modules = $this->getModulesMenu();
+    if(!isset($modules[$name]))
+      return null;
+
+    return $modules[$name];
+  }
+
+
   public function isPluginDocType($type) {
     if(!$type)
       return false;
diff --git a/library/Class/DigitalResource/ModuleMenu.php b/library/Class/DigitalResource/ModuleMenu.php
index e2c1ce6bf44..0fbe9c988a5 100644
--- a/library/Class/DigitalResource/ModuleMenu.php
+++ b/library/Class/DigitalResource/ModuleMenu.php
@@ -48,9 +48,14 @@ class Class_DigitalResource_ModuleMenu extends Class_Systeme_ModulesMenu_SSOAbst
     if ($user
         && $this->_config->hasRightAccess($user)
         && $this->_config->isEnabled())
-      return $this->_config->getSsoUrl($user);
+      return $this->getSsoUrl($user);
 
     $this->setMessage($this->_config->getNotAllowedMessage());
     return '';
   }
+
+
+  protected function getSsoUrl($user) {
+    return $this->_config->getSsoUrl($user);
+  }
 }
diff --git a/library/Class/Notice/Sso.php b/library/Class/Notice/Sso.php
index 45d6b114ff9..2ab654de7a5 100644
--- a/library/Class/Notice/Sso.php
+++ b/library/Class/Notice/Sso.php
@@ -43,20 +43,17 @@ class Class_Notice_Sso extends Class_Entity {
   }
 
 
-  protected function getFirstPrivateUrl() {
+  public function getFirstPrivateUrl() {
     $urls = $this->getRecord()->get_subfield('956', 'u');
     return reset($urls);
   }
 
 
-  public function getUrl() {
+  public function getModuleMenu() {
     if (!$this->isValid())
-      return '';
+      return null;
 
-    $agency = $this->getFirstCatalogAgency();
-    $digital_resource = Class_DigitalResource::getInstance();
-
-    if ($config = $digital_resource->getPluginForSsoAction($agency))
-      return $config->getSsoUrl(Class_Users::getIdentity(), $this->getFirstPrivateUrl());
+    return Class_DigitalResource::getInstance()
+      ->getModuleMenuFor($this->getFirstCatalogAgency());
   }
 }
diff --git a/library/digital_resources/Bibliondemand/Config.php b/library/digital_resources/Bibliondemand/Config.php
index 49c3ff0c6c1..d630edb866b 100644
--- a/library/digital_resources/Bibliondemand/Config.php
+++ b/library/digital_resources/Bibliondemand/Config.php
@@ -40,19 +40,13 @@ class Bibliondemand_Config extends Class_DigitalResource_Config {
   }
 
 
-  public function getSsoUrl($user, $url = '') {
-    if(!$this->isEnabled())
-      return '';
-
-    if (!$user->isAbonnementValid())
-      return '';
-
-    $sso = $this->getAdminVar('SSO_URL');
+  public function hasRightAccess($user) {
+    return $user && $user->isAbonnementValid();
+  }
 
-    if(!$url)
-      return $sso;
 
-    return $sso . '&' . http_build_query(['returnUrl' => $url]);
+  public function getSsoUrl($user) {
+    return $this->getAdminVar('SSO_URL');
   }
 
 
diff --git a/library/digital_resources/Bibliondemand/ModuleMenu.php b/library/digital_resources/Bibliondemand/ModuleMenu.php
index a73463f7d05..ec498e46052 100644
--- a/library/digital_resources/Bibliondemand/ModuleMenu.php
+++ b/library/digital_resources/Bibliondemand/ModuleMenu.php
@@ -21,10 +21,21 @@
 
 
 class Bibliondemand_ModuleMenu extends Class_DigitalResource_ModuleMenu {
-    public function urlForUser($user) {
-      if (!$url = $this->_config->getSsoUrl($user))
-        $this->setMessage($this->_config->getNotAllowedMessage());
+  protected $_record;
 
+  protected function getSsoUrl($user) {
+    $url = parent::getSsoUrl($user);
+
+    if (!$this->_record
+       || (!$record_url = $this->_record->getFirstPrivateUrl()))
       return $url;
+
+    return $url . '&' . http_build_query(['returnUrl' => $record_url]);
+  }
+
+
+  public function setRecord($record) {
+    $this->_record = $record;
+    return $this;
   }
 }
\ No newline at end of file
-- 
GitLab