From 08ad62b6ddf9aa1f99842e6972de4b4a78be2d22 Mon Sep 17 00:00:00 2001
From: Dorian Merz <merz@ub.uni-leipzig.de>
Date: Thu, 17 Dec 2020 16:36:43 +0100
Subject: [PATCH] refs #18605 [fid] use VuFind's permission system for
 GetIt-Box

* defines some basic functional permissions
* uses permission manager to give/deny access to
** acquisitions
** ebook links
* handle fid.Acqusitions permission via Permission Controller Plugin of VuFind
---
 fid/config/vufind/permissions.ini             | 12 +++++++++-
 .../CustomTraits/FidAcquisitionTrait.php      |  8 +++++--
 module/fid/src/View/Helper/Root/Factory.php   |  3 ++-
 module/fid/src/View/Helper/Root/GetIt.php     | 24 +++++++++++++++----
 4 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/fid/config/vufind/permissions.ini b/fid/config/vufind/permissions.ini
index d22779c8b85..4b4053857ba 100644
--- a/fid/config/vufind/permissions.ini
+++ b/fid/config/vufind/permissions.ini
@@ -39,4 +39,14 @@ permission = fid.LimitedAccess
 [fid.FullAccess]
 role[] = loggedin
 FidApiPermission[] = full_access
-permission = fid.FullAccess
\ No newline at end of file
+permission = fid.FullAccess
+
+[fid.EBooks]
+role[] = loggedin
+FidApiPermission[] = limited_access
+permission = fid.EBooks
+
+[fid.Acquisitions]
+role[] = loggedin
+FidApiPermission[] = limited_access
+permission = fid.Acquisitions
\ No newline at end of file
diff --git a/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php b/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
index bf40e3846c1..2a8f31a86bb 100644
--- a/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
+++ b/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
@@ -33,6 +33,7 @@ use fid\Service\DataTransferObject\User;
 use fid\Validator\SubitoPartialCopyPageBounds;
 use fid\Validator\SubitoPartialCopyPageSelection;
 use finc\View\Helper\Root\Citation;
+use VuFind\Exception\Forbidden as ForbiddenException;
 use Zend\Form\Form;
 
 /**
@@ -89,7 +90,10 @@ trait FidAcquisitionTrait
         /** @var User $user */
         $user = $this->client->requestUserDetails();
 
-        if ($user->hasPermission('limited_access')) {
+        try {
+            /* pass if permission is granted, else throw exception and switch to catch block */
+            $this->permission()->check('fid.Acquisitions', 'exception');
+
             $driver = $this->loadRecord();
             $recordId = $driver->tryMethod('getUniqueID');
 
@@ -126,7 +130,7 @@ trait FidAcquisitionTrait
             $view = $this->createViewModel();
             $view->setVariables(compact('form', 'driver', 'user'));
             $view->setTemplate("fid/record/acquisition-$this->type");
-        } else {
+        } catch (ForbiddenException $ex) {
             $view = $this->getPermissionDeniedView();
         }
 
diff --git a/module/fid/src/View/Helper/Root/Factory.php b/module/fid/src/View/Helper/Root/Factory.php
index 89a4248bf60..044f0f58ea6 100644
--- a/module/fid/src/View/Helper/Root/Factory.php
+++ b/module/fid/src/View/Helper/Root/Factory.php
@@ -68,7 +68,8 @@ class Factory
     {
         return new GetIt(
             $container->get('VuFind\Config')->get('getit'),
-            $container->get(Client::class)
+            $container->get(Client::class),
+            $container->get('VuFind\Role\PermissionManager')
         );
     }
 }
diff --git a/module/fid/src/View/Helper/Root/GetIt.php b/module/fid/src/View/Helper/Root/GetIt.php
index 780c6dc60be..b8a79995a37 100644
--- a/module/fid/src/View/Helper/Root/GetIt.php
+++ b/module/fid/src/View/Helper/Root/GetIt.php
@@ -29,6 +29,7 @@ namespace fid\View\Helper\Root;
 
 use VuFind\I18n\Translator\TranslatorAwareTrait;
 use VuFind\RecordDriver\AbstractBase;
+use VuFind\Role\PermissionManager;
 use VuFind\View\Helper\Root\Config;
 use Zend\View\Helper\AbstractHelper;
 
@@ -77,6 +78,14 @@ class GetIt extends AbstractHelper
      * @var \fid\Service\Client
      */
     protected $fidClient;
+
+    /**
+     * Permission Manager
+     *
+     * @var PermissionManager
+     */
+    protected $permissionManager;
+
     /**
      * Solr field source_id
      * @var
@@ -155,10 +164,11 @@ class GetIt extends AbstractHelper
      *
      * @param Config $getItConfig Get It box Configuration
      */
-    public function __construct($getItConfig, $fidClient)
+    public function __construct($getItConfig, $fidClient,$permissionManager)
     {
         $this->config = $getItConfig;
         $this->fidClient = $fidClient;
+        $this->permissionManager = $permissionManager;
     }
 
     /**
@@ -188,6 +198,10 @@ class GetIt extends AbstractHelper
         return $this;
     }
 
+    protected function hasPermission($permission) {
+        return $this->permissionManager->isAuthorized($permission);
+    }
+
     /**
      * Retrieve SIDs from config (getit.ini)
      *
@@ -446,15 +460,15 @@ class GetIt extends AbstractHelper
         &$isAiSidRecord,
         &$noticeLinkType
     ) {
-        $limited_access = false;
+        $hasEBookAccess = false;
         if ($this->fidClient->isLoggedOn()) {
-            $limited_access = $this->fidClient->requestUserDetails()->hasPermission('limited_access');
+            $hasEBookAccess = $this->hasPermission('fid.EBooks');
         }
 
         $accordeonColor = $this->accordeonColorAlternative;
         $accordeonHeadline = $this->accordeonHeadlineAlternative;
         if ($this->fidClient->isLoggedOn()) {
-            if ($limited_access) {
+            if ($hasEBookAccess) {
                 $notice = $this->translate('getit_text_13');
             } else {
                 $notice = $this->translate('getit_text_13b_1');
@@ -465,7 +479,7 @@ class GetIt extends AbstractHelper
             $noticeLinkType = "register";
         }
         $boxHeadline = $this->fidClient->isLoggedOn() ? $this->translate('Get it') : $this->translate('getit_logged_not');
-        $showLinks = $this->fidClient->isLoggedOn() && $limited_access;
+        $showLinks = $this->fidClient->isLoggedOn() && $hasEBookAccess;
     }
 
     /**
-- 
GitLab