Fix #7724 - Bulk password change
authorAlan <alan@roojs.com>
Wed, 28 Jun 2023 05:04:16 +0000 (13:04 +0800)
committerAlan <alan@roojs.com>
Wed, 28 Jun 2023 05:04:16 +0000 (13:04 +0800)
DataObjects/Core_person.php
Pman.Tab.PersonList.js

index 05dbd5c..a2942f8 100644 (file)
@@ -1445,6 +1445,11 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
     
     function beforeInsert($req, $roo)
     {
+         if (!empty($req['_bulk_update_passwords'])) {
+            $this->bulkUpdatePasswords($req['_bulk_update_passwords'], $roo);
+            return;
+        }
+        
         $p = DB_DataObject::factory('core_person');
         if ($roo->authUser->id > -1 ||  $p->count() > 1) {
             $pp = DB_DataObject::factory('core_person');
@@ -1718,6 +1723,58 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         
         return $content;
     }
-    
+    function bulkUpdatePasswords($data, $roo)
+    {
+         $rows = explode("\n",$data);
+        $upd = array();
+        $bad  = array();
+        
+        foreach($rows  as $i=>$row) {
+            if (!strlen(trim($row))) {
+                continue;
+            }
+            $bits = preg_split('/\s+/', trim($row));
+            if (count($bits) != 2) {
+                $bad[] = "Invalid line: {$row}";
+                continue;
+            }
+            // validate.
+            $upd[strtolower($bits[0])] = $bits[1];
+            
+        }
+        if (empty($upd)) {
+            
+            $roo->jerr(empty($bad) ? "No rows to update": ("ERRORS: ". implode("\n", $bad)));
+            return;
+        }
+        // next fetch them all.
+        $p = DB_DataObject::factory('core_person');
+        $p->whereAddIn('email', array_keys($upd), 'string');
+        foreach($p->fetchAll() as $p) {
+            $map[strtolower($p->email)] = $p;
+        }
+        foreach($upd as $k=>$nv) {
+            if (!isset($map[$k])) {
+                $bad[] = "Missing account with email: " . $k;
+                continue;
+            }
+            if ($map[$k]->id == $roo->authUser->id) {
+                $bad[] = "You can not update your own password here: " . $k;
+                continue;
+            }
+        }
+        if (!empty($bad)) {
+            $roo->jerr("ERRORS: ". implode("\n", $bad));
+            return;
+        }
+        foreach($map as $k => $p) {
+            $pp = clone($p);
+            $p->setPassword($upd[$k]);
+            $p->update($pp);
+        }
+        $roo->jok("Updated");
+        
+        
+    }
     
  }
index cf2c313..8ee3fb1 100644 (file)
@@ -564,8 +564,27 @@ Pman.Tab.PersonList.prototype = {
                 }
             
                      
-            }
+            },
+            '->',
             
+              {
+               
+                xtype : 'Button',
+                xns : Roo.Toolbar,
+               
+                text: "Bulk Change Passwords",
+                hidden : _this.permName != 'Core.Staff' || !Pman.hasPerm('Core.Staff', 'E'),
+                listeners : {
+                    click : function () {
+                        Pman.Dialog.AdminBulkPassword.show({}, function() { 
+                          refreshPager();
+                        });
+                        
+                    }
+                }
+            
+                     
+            }
 
         );