From 88174f1cef5a01412b1ab57acc6672c507496697 Mon Sep 17 00:00:00 2001
From: Demian Katz <demian.katz@villanova.edu>
Date: Thu, 3 Mar 2016 08:53:04 -0500
Subject: [PATCH] Standardized behavior related to blank passwords.

---
 module/VuFind/src/VuFind/Auth/CAS.php        | 14 +++++++++++--
 module/VuFind/src/VuFind/Auth/LDAP.php       | 14 +++++++++++--
 module/VuFind/src/VuFind/Auth/Shibboleth.php | 21 +++++++++-----------
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/module/VuFind/src/VuFind/Auth/CAS.php b/module/VuFind/src/VuFind/Auth/CAS.php
index b58fb4656d2..4fd2a760327 100644
--- a/module/VuFind/src/VuFind/Auth/CAS.php
+++ b/module/VuFind/src/VuFind/Auth/CAS.php
@@ -149,9 +149,19 @@ class CAS extends AbstractBase
             }
         }
 
-        // Save credentials if applicable:
+        // Save credentials if applicable. Note that we want to allow empty
+        // passwords (see https://github.com/vufind-org/vufind/pull/532), but
+        // we also want to be careful not to replace a non-blank password with a
+        // blank one in case the auth mechanism fails to provide a password on
+        // an occasion after the user has manually stored one. (For discussion,
+        // see https://github.com/vufind-org/vufind/pull/612). Note that in the
+        // (unlikely) scenario that a password can actually change from non-blank
+        // to blank, additional work may need to be done here.
         if (!empty($user->cat_username)) {
-            $user->saveCredentials($user->cat_username, $catPassword);
+            $user->saveCredentials(
+                $user->cat_username,
+                empty($catPassword) ? $user->getCatPassword() : $catPassword
+            );
         }
 
         // Save and return the user object:
diff --git a/module/VuFind/src/VuFind/Auth/LDAP.php b/module/VuFind/src/VuFind/Auth/LDAP.php
index 53441e5af30..883383bb33a 100644
--- a/module/VuFind/src/VuFind/Auth/LDAP.php
+++ b/module/VuFind/src/VuFind/Auth/LDAP.php
@@ -289,9 +289,19 @@ class LDAP extends AbstractBase
             }
         }
 
-        // Save credentials if applicable:
+        // Save credentials if applicable. Note that we want to allow empty
+        // passwords (see https://github.com/vufind-org/vufind/pull/532), but
+        // we also want to be careful not to replace a non-blank password with a
+        // blank one in case the auth mechanism fails to provide a password on
+        // an occasion after the user has manually stored one. (For discussion,
+        // see https://github.com/vufind-org/vufind/pull/612). Note that in the
+        // (unlikely) scenario that a password can actually change from non-blank
+        // to blank, additional work may need to be done here.
         if (!empty($user->cat_username)) {
-            $user->saveCredentials($user->cat_username, $catPassword);
+            $user->saveCredentials(
+                $user->cat_username,
+                empty($catPassword) ? $user->getCatPassword() : $catPassword
+            );
         }
 
         // Update the user in the database, then return it to the caller:
diff --git a/module/VuFind/src/VuFind/Auth/Shibboleth.php b/module/VuFind/src/VuFind/Auth/Shibboleth.php
index 83219f7adec..f747febcd20 100644
--- a/module/VuFind/src/VuFind/Auth/Shibboleth.php
+++ b/module/VuFind/src/VuFind/Auth/Shibboleth.php
@@ -121,21 +121,18 @@ class Shibboleth extends AbstractBase
             }
         }
 
-        // Save credentials if applicable. Note that if $catPassword is empty,
-        // we'll pass through the existing password already in the database;
-        // otherwise, when users log out, their passwords may be cleared from
-        // the database. We can't simply skip saving credentials when the password
-        // is empty, because in some scenarios, an empty password is normal
-        // (see https://github.com/vufind-org/vufind/pull/532 for details).
-        // Note that this leaves an edge case where, if a user changes their
-        // password from something to nothing, VuFind will not properly clear it
-        // out. This seems unlikely, but if it is encountered, we may need to
-        // add more logic here. See https://github.com/vufind-org/vufind/pull/612
-        // for related discussion.
+        // Save credentials if applicable. Note that we want to allow empty
+        // passwords (see https://github.com/vufind-org/vufind/pull/532), but
+        // we also want to be careful not to replace a non-blank password with a
+        // blank one in case the auth mechanism fails to provide a password on
+        // an occasion after the user has manually stored one. (For discussion,
+        // see https://github.com/vufind-org/vufind/pull/612). Note that in the
+        // (unlikely) scenario that a password can actually change from non-blank
+        // to blank, additional work may need to be done here.
         if (!empty($user->cat_username)) {
             $user->saveCredentials(
                 $user->cat_username,
-                empty($catPassword) ? $user->cat_password : $catPassword
+                empty($catPassword) ? $user->getCatPassword() : $catPassword
             );
         }
 
-- 
GitLab