From bd51bfd369bebd5ab3fe35836ff26c516804dfa1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be>
Date: Tue, 13 Mar 2018 15:19:19 +0100
Subject: [PATCH] :ambulance: fix(users) Fix error message when account locking
 fails

issue #5788
---
 .../class_password-methods-clear.inc             |  2 +-
 .../password-methods/class_password-methods.inc  | 16 +++++++++++++---
 plugins/admin/users/class_userManagement.inc     | 14 ++++++++++++--
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/include/password-methods/class_password-methods-clear.inc b/include/password-methods/class_password-methods-clear.inc
index d3d1ef3e3..2f21f22ea 100644
--- a/include/password-methods/class_password-methods-clear.inc
+++ b/include/password-methods/class_password-methods-clear.inc
@@ -31,7 +31,7 @@
  */
 class passwordMethodClear extends passwordMethod
 {
-  var $lockable = FALSE;
+  protected $lockable = FALSE;
 
   /*!
    * \brief passwordMethodClear Constructor
diff --git a/include/password-methods/class_password-methods.inc b/include/password-methods/class_password-methods.inc
index 11719942c..efbf1a119 100644
--- a/include/password-methods/class_password-methods.inc
+++ b/include/password-methods/class_password-methods.inc
@@ -32,7 +32,8 @@ class passwordMethod
   var $attrs    = array();
   var $display  = FALSE;
   var $hash     = '';
-  var $lockable = TRUE;
+
+  protected $lockable = TRUE;
 
   /*!
    * \brief Password method contructor
@@ -62,6 +63,16 @@ class passwordMethod
     return TRUE;
   }
 
+  /*!
+   * \brief If we can lock the password
+   *
+   * \return boolean
+   */
+  function is_lockable()
+  {
+    return $this->lockable;
+  }
+
   /*!
    * \brief Is locked
    *
@@ -123,7 +134,7 @@ class passwordMethod
       return FALSE;
     }
     if ($mode != 'LOCK' && $mode != 'UNLOCK') {
-      die('Invalid mode "'.$mode.'"');
+      throw new FusionDirectoryException('Invalid mode "'.$mode.'"');
     }
 
     /* Get current password hash */
@@ -142,7 +153,6 @@ class passwordMethod
 
     /* We can only lock/unlock non-empty passwords */
     if (!empty($pwd)) {
-
       /* Check if this entry is already locked. */
       if (!preg_match("/^[^\}]*+\}!/", $pwd)) {
         if ($mode == 'UNLOCK') {
diff --git a/plugins/admin/users/class_userManagement.inc b/plugins/admin/users/class_userManagement.inc
index 84837ebe2..72df50b8f 100644
--- a/plugins/admin/users/class_userManagement.inc
+++ b/plugins/admin/users/class_userManagement.inc
@@ -170,6 +170,16 @@ class userManagement extends simpleManagement
         $method   = passwordMethod::get_method($pwd, $val['dn']);
         $success  = TRUE;
         if ($method instanceOf passwordMethod) {
+          if (!$method->is_lockable()) {
+            $hn = $method->get_hash_name();
+            if (is_array($hn)) {
+              $hn = $hn[0];
+            }
+            msg_dialog::display(_('Account locking'),
+                sprintf(_('Password method "%s" does not support locking. Account "%s" has not been locked!'),
+                  $hn, $dn), ERROR_DIALOG);
+            return;
+          }
           if ($type == 'toggle') {
             if ($method->is_locked($val['dn'])) {
               $success = $method->unlock_account($val['dn']);
@@ -189,8 +199,8 @@ class userManagement extends simpleManagement
               $hn = $hn[0];
             }
             msg_dialog::display(_('Account locking'),
-                sprintf(_('Password method "%s" does not support locking. Account "%s" has not been locked!'),
-                  $hn, $dn), WARNING_DIALOG);
+                sprintf(_('Locking failed using password method "%s". Account "%s" has not been locked!'),
+                  $hn, $dn), ERROR_DIALOG);
           }
         }
       }
-- 
GitLab