From cfd296bc06c0d1e947000e7d7530f6175e935a6c Mon Sep 17 00:00:00 2001
From: Alexander Purr <purr@ub.uni-leipzig.de>
Date: Wed, 22 Jun 2022 10:44:56 +0200
Subject: [PATCH] refs #20926 [fid] allow admin to flag users for deletion

* copied nearly complete functionality introduced to adlr in ticket 16184 to fid branch
* adapt admins form for editing users
* set deleted flag to false on user registration (as default)
* show deleted info in admin user view
* configurable
* switch auth error message order
** dispay deleted account message before check on blocked account
** accounts can be blocked without flagging for removal
---
 fid/config/vufind/fid.ini                     |  1 +
 fid/languages/fid/de.ini                      |  6 ++-
 fid/languages/fid/en.ini                      |  4 +-
 module/fid/config/admin-edit-form.php         | 39 ++++++++++++++++++-
 .../InputFilter/UserCreateFormInputFilter.php |  6 ++-
 module/fid/src/VuFind/Auth/Authenticator.php  | 10 ++---
 themes/fid/templates/fid/admin/edit.phtml     | 14 +++++++
 .../fid/templates/fid/admin/list-entry.phtml  |  2 +
 8 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/fid/config/vufind/fid.ini b/fid/config/vufind/fid.ini
index b2afda51e23..20d0e6e943d 100644
--- a/fid/config/vufind/fid.ini
+++ b/fid/config/vufind/fid.ini
@@ -22,6 +22,7 @@ overview_fields[] = 'UserName'
 overview_fields[] = 'Firstname'
 overview_fields[] = 'Lastname'
 overview_fields[] = 'Permissions'
+overview_fields[] = 'Deleted'
 
 ; List of all available user permissions
 permission_options[] = 'basic_access'
diff --git a/fid/languages/fid/de.ini b/fid/languages/fid/de.ini
index 69dd4b1f2c9..13aab2df6ac 100644
--- a/fid/languages/fid/de.ini
+++ b/fid/languages/fid/de.ini
@@ -197,5 +197,7 @@ order_label_due_date = "Leihfrist"
 order_list = "Liste aller Bestellungen"
 edit_order_error = "Bestellung kann nicht bearbeitet werden"
 order_update_success = "Bestellung aktualisiert"
-order_update_error = "Fehler beim Aktualisierne der Bestellung"
-order_type = "Typ"
\ No newline at end of file
+order_update_error = "Fehler beim Aktualisieren der Bestellung"
+order_type = "Typ"
+
+label_deleted = Zur Löschung vorgemerkt
\ No newline at end of file
diff --git a/fid/languages/fid/en.ini b/fid/languages/fid/en.ini
index 6e12cc06afe..5747e2a7641 100644
--- a/fid/languages/fid/en.ini
+++ b/fid/languages/fid/en.ini
@@ -194,4 +194,6 @@ order_list = "List of all orders"
 edit_order_error = "Order cannot be processed"
 order_update_success = "Order updated"
 order_update_error = "Error on updating order"
-order_type = "Type"
\ No newline at end of file
+order_type = "Type"
+
+label_deleted = Flagged for deletion
diff --git a/module/fid/config/admin-edit-form.php b/module/fid/config/admin-edit-form.php
index ecc3a00d29d..04ef501802b 100644
--- a/module/fid/config/admin-edit-form.php
+++ b/module/fid/config/admin-edit-form.php
@@ -20,6 +20,8 @@
  */
 use fid\Hydrator\UserHydrator;
 use fid\InputFilter\RootAwareBaseInputFilter;
+use Zend\Filter\Boolean;
+use Zend\Form\Element\Checkbox;
 use Zend\Form\Element\Collection;
 use Zend\Form\Element\Hidden;
 use Zend\Form\Element\Radio;
@@ -28,6 +30,7 @@ use Zend\Form\Element\Submit;
 use Zend\Form\Element\Text;
 use Zend\Form\Fieldset;
 use Zend\Form\InputFilterProviderFieldset;
+use Zend\Validator\NotEmpty;
 
 return [
     'name'             => 'user-update-form',
@@ -35,7 +38,10 @@ return [
     'validation_group' => [
         'id',
         'job_title',
-        'permissions'
+        'permissions',
+        'data' => [
+            'deleted'
+        ],
     ],
     'elements'         => [
         'id'             => [
@@ -247,6 +253,37 @@ return [
             'spec' => [
                 'name' => 'data',
                 'type' => InputFilterProviderFieldset::class,
+                'elements' => [
+                    'deleted' => [
+                        'spec' => [
+                            'name' => 'deleted',
+                            'type' => Checkbox::class,
+                            'options' => [
+                                'label' => 'label_deleted',
+                            ],
+                        ],
+                    ],
+                ],
+                'options'  => [
+                    'input_filter_spec' => [
+                        'deleted' => [
+                            'name'       => 'deleted',
+                            'filters'    => [
+                                Boolean::class => [
+                                    'name' => Boolean::class,
+                                ],
+                            ],
+                            'validators' => [
+                                NotEmpty::class => [
+                                    'name'    => NotEmpty::class,
+                                    'options' => [
+                                        'type' => NotEmpty::NULL,
+                                    ],
+                                ],
+                            ],
+                        ],
+                    ],
+                ],
             ],
         ],
         'submit'         => [
diff --git a/module/fid/src/InputFilter/UserCreateFormInputFilter.php b/module/fid/src/InputFilter/UserCreateFormInputFilter.php
index 4bdb9e93f8e..8860604e101 100644
--- a/module/fid/src/InputFilter/UserCreateFormInputFilter.php
+++ b/module/fid/src/InputFilter/UserCreateFormInputFilter.php
@@ -49,10 +49,12 @@ class UserCreateFormInputFilter extends RootAwareBaseInputFilter
      */
     public function getValues()
     {
-        $permissions = [
+        $values = parent::getValues();
+        $values['data']['deleted'] = false;
+        $values['permissions'] = [
             'basic_access' => 'granted',
             'limited_access' => 'granted'
         ];
-        return compact('permissions') + parent::getValues();
+        return $values;
     }
 }
diff --git a/module/fid/src/VuFind/Auth/Authenticator.php b/module/fid/src/VuFind/Auth/Authenticator.php
index c019c2da59d..c020615c0a8 100644
--- a/module/fid/src/VuFind/Auth/Authenticator.php
+++ b/module/fid/src/VuFind/Auth/Authenticator.php
@@ -116,17 +116,17 @@ class Authenticator extends AbstractBase
             }
         }
 
-        if (!$this->client->isAuthorized('basic_access')) {
-            $this->client->logoff();
-            throw new AuthException(self::AUTH_ERROR_ACCOUNT_BLOCKED);
-        }
-
         /* @var User $user */
         $user = $this->client->requestUserDetails();
         if ($user->isDeleted()) {
             $this->client->logoff();
             throw new AuthException(self::AUTH_ERROR_ACCOUNT_DELETED);
         }
+        
+        if (!$this->client->isAuthorized('basic_access')) {
+            $this->client->logoff();
+            throw new AuthException(self::AUTH_ERROR_ACCOUNT_BLOCKED);
+        }
 
         if ($ownerId = $logon->getOwnerId()) {
             /* @var VuFindUser $userRow */
diff --git a/themes/fid/templates/fid/admin/edit.phtml b/themes/fid/templates/fid/admin/edit.phtml
index 1acfdfedafe..20131662f20 100644
--- a/themes/fid/templates/fid/admin/edit.phtml
+++ b/themes/fid/templates/fid/admin/edit.phtml
@@ -169,6 +169,20 @@ foreach ($permissions as $permission) {
 <?php /* addresses */ ?>
 <?= $this->render('fid/user/address-collection.phtml') ?>
 
+<? /* deletion */ ?>
+<?php
+    /** @var Checkbox $elemDeleted */
+    $elemDeleted = $form->get('data')->get('deleted');
+    $elemDeleted->setAttribute('id', 'deleted');
+?>
+<div class="form-group eula">
+  <div>
+      <?= $this->formElement($elemDeleted) ?>
+      <?= $this->formLabel($elemDeleted) ?>
+  </div>
+    <?= $this->formElementErrors($elemDeleted) ?>
+</div>
+
 <?php /* submit button */ ?>
 <?php
 /** @var Submit $elemSubmit */
diff --git a/themes/fid/templates/fid/admin/list-entry.phtml b/themes/fid/templates/fid/admin/list-entry.phtml
index db2b5611242..e2c216f1e87 100644
--- a/themes/fid/templates/fid/admin/list-entry.phtml
+++ b/themes/fid/templates/fid/admin/list-entry.phtml
@@ -12,6 +12,8 @@ foreach ($this->fields as $field):
 ?>
 <?php if ($field === 'Permissions'): ?>
     <td><?=implode(', ', $permissions)?></td>
+<?php elseif ($field === 'Deleted'): ?>
+    <td><?= $user->isDeleted() ? $this->translate("fid::label_deleted") : '' ?></td>
 <?php else: ?>
     <td><?=$this->escapeHtml($user->$field)?></td>
 <?php endif; ?>
-- 
GitLab