17faa86faSKarsten Kosmala<?php 27faa86faSKarsten Kosmala 37faa86faSKarsten Kosmalause splitbrain\phpcli\TableFormatter; 47faa86faSKarsten Kosmala 57faa86faSKarsten Kosmala/** 67faa86faSKarsten Kosmala * Class cli_plugin_usermanager 77faa86faSKarsten Kosmala * 87faa86faSKarsten Kosmala * Command Line component for the usermanager 97faa86faSKarsten Kosmala * 107faa86faSKarsten Kosmala * @license GPL2 117faa86faSKarsten Kosmala * @author Karsten Kosmala <karsten.kosmala@gmail.com> 127faa86faSKarsten Kosmala */ 137faa86faSKarsten Kosmalaclass cli_plugin_usermanager extends DokuWiki_CLI_Plugin 147faa86faSKarsten Kosmala{ 157faa86faSKarsten Kosmala public function __construct() 167faa86faSKarsten Kosmala { 177faa86faSKarsten Kosmala parent::__construct(); 187faa86faSKarsten Kosmala 197faa86faSKarsten Kosmala /** @var DokuWiki_Auth_Plugin $auth */ 207faa86faSKarsten Kosmala auth_setup(); 217faa86faSKarsten Kosmala } 227faa86faSKarsten Kosmala 237faa86faSKarsten Kosmala /** @inheritdoc */ 247faa86faSKarsten Kosmala protected function setup(\splitbrain\phpcli\Options $options) 257faa86faSKarsten Kosmala { 267faa86faSKarsten Kosmala // general setup 277faa86faSKarsten Kosmala $options->setHelp( 28ae26f74eSKarsten Kosmala "Manage users for this DokuWiki instance\n" 297faa86faSKarsten Kosmala ); 307faa86faSKarsten Kosmala 317faa86faSKarsten Kosmala // list 327faa86faSKarsten Kosmala $options->registerCommand('list', 'List users'); 337faa86faSKarsten Kosmala $options->registerOption('verbose', 'Show detailed user information', 'v', false, 'list'); 347faa86faSKarsten Kosmala 357faa86faSKarsten Kosmala // add 367faa86faSKarsten Kosmala $options->registerCommand('add', 'Add an user to auth backend'); 377faa86faSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'add'); 38*2bf5aa0cSKarsten Kosmala $options->registerArgument('mail', 'Email address', true, 'add'); 397faa86faSKarsten Kosmala $options->registerArgument('full_name', 'Full name', false, 'add'); 40*2bf5aa0cSKarsten Kosmala $options->registerArgument('groups', 'Groups to be added', false, 'add'); 41*2bf5aa0cSKarsten Kosmala $options->registerArgument('password', 'Password of user', false, 'add'); 42*2bf5aa0cSKarsten Kosmala $options->registerOption('notify', 'Notify user', 'n', false, 'add'); 437faa86faSKarsten Kosmala 447faa86faSKarsten Kosmala // delete 45ae26f74eSKarsten Kosmala $options->registerCommand('delete', 'Delete user(s) from auth backend'); 46ae26f74eSKarsten Kosmala $options->registerArgument('name', 'Username(s), comma-seperated', true, 'delete'); 47ae26f74eSKarsten Kosmala 48ae26f74eSKarsten Kosmala // add to group 49ae26f74eSKarsten Kosmala $options->registerCommand('addtogroup', 'Add user to group(s)'); 50*2bf5aa0cSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'addtogroup'); 51ae26f74eSKarsten Kosmala $options->registerArgument('group', 'Group(s), comma-seperated', true, 'addtogroup'); 52ae26f74eSKarsten Kosmala 53ae26f74eSKarsten Kosmala // remove from group 54ae26f74eSKarsten Kosmala $options->registerCommand('removefromgroup', 'Remove user from group(s)'); 55*2bf5aa0cSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'removefromgroup'); 56ae26f74eSKarsten Kosmala $options->registerArgument('group', 'Group(s), comma-seperated', true, 'removefromgroup'); 577faa86faSKarsten Kosmala } 587faa86faSKarsten Kosmala 597faa86faSKarsten Kosmala /** @inheritdoc */ 607faa86faSKarsten Kosmala protected function main(\splitbrain\phpcli\Options $options) 617faa86faSKarsten Kosmala { 627faa86faSKarsten Kosmala switch ($options->getCmd()) { 637faa86faSKarsten Kosmala case 'list': 647faa86faSKarsten Kosmala $ret = $this->cmdList($options->getOpt('verbose')); 657faa86faSKarsten Kosmala break; 667faa86faSKarsten Kosmala case 'add': 677faa86faSKarsten Kosmala $ret = $this->cmdAdd($options->getOpt('notify'), $options->getArgs()); 687faa86faSKarsten Kosmala break; 697faa86faSKarsten Kosmala case 'delete': 707faa86faSKarsten Kosmala $ret = $this->cmdDelete($options->getArgs()); 717faa86faSKarsten Kosmala break; 72ae26f74eSKarsten Kosmala case 'addtogroup': 73ae26f74eSKarsten Kosmala $ret = $this->cmdAddToGroup($options->getArgs()); 74ae26f74eSKarsten Kosmala break; 75ae26f74eSKarsten Kosmala case 'removefromgroup': 76ae26f74eSKarsten Kosmala $ret = $this->cmdRemoveFromGroup($options->getArgs()); 77ae26f74eSKarsten Kosmala break; 787faa86faSKarsten Kosmala 797faa86faSKarsten Kosmala default: 807faa86faSKarsten Kosmala echo $options->help(); 817faa86faSKarsten Kosmala $ret = 0; 827faa86faSKarsten Kosmala } 837faa86faSKarsten Kosmala 847faa86faSKarsten Kosmala exit($ret); 857faa86faSKarsten Kosmala } 867faa86faSKarsten Kosmala 877faa86faSKarsten Kosmala /** 887faa86faSKarsten Kosmala * @param bool $showdetails 897faa86faSKarsten Kosmala * @return int 907faa86faSKarsten Kosmala */ 91ae26f74eSKarsten Kosmala protected function cmdList(bool $showdetails) 927faa86faSKarsten Kosmala { 93ae26f74eSKarsten Kosmala global $auth; 947faa86faSKarsten Kosmala 95ae26f74eSKarsten Kosmala if (!isset($auth)) { 96ae26f74eSKarsten Kosmala $this->error($this->getLang('noauth')); 97ae26f74eSKarsten Kosmala return 1; 98ae26f74eSKarsten Kosmala } elseif (!$auth->canDo('getUsers')) { 99ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 100ae26f74eSKarsten Kosmala return 1; 101ae26f74eSKarsten Kosmala } else { 102ae26f74eSKarsten Kosmala $this->listUsers($showdetails); 103ae26f74eSKarsten Kosmala } 1047faa86faSKarsten Kosmala 1057faa86faSKarsten Kosmala return 0; 1067faa86faSKarsten Kosmala } 1077faa86faSKarsten Kosmala 1087faa86faSKarsten Kosmala /** 1097faa86faSKarsten Kosmala * List the given users 1107faa86faSKarsten Kosmala * 1117faa86faSKarsten Kosmala * @param bool $details display details 1127faa86faSKarsten Kosmala */ 113ae26f74eSKarsten Kosmala protected function listUsers(bool $details = False) 1147faa86faSKarsten Kosmala { 115ae26f74eSKarsten Kosmala global $auth; 116ae26f74eSKarsten Kosmala $list = $auth->retrieveUsers(); 117ae26f74eSKarsten Kosmala 1187faa86faSKarsten Kosmala $tr = new TableFormatter($this->colors); 1197faa86faSKarsten Kosmala 1207faa86faSKarsten Kosmala foreach ($list as $username => $user) { 1217faa86faSKarsten Kosmala $content = [$username]; 1227faa86faSKarsten Kosmala if ($details) { 1237faa86faSKarsten Kosmala array_push($content, $user['name']); 1247faa86faSKarsten Kosmala array_push($content, $user['mail']); 1257faa86faSKarsten Kosmala array_push($content, implode(", ", $user['grps'])); 1267faa86faSKarsten Kosmala } 1277faa86faSKarsten Kosmala echo $tr->format( 1287faa86faSKarsten Kosmala [15, 25, 25, 15], 1297faa86faSKarsten Kosmala $content 1307faa86faSKarsten Kosmala ); 1317faa86faSKarsten Kosmala } 1327faa86faSKarsten Kosmala } 1337faa86faSKarsten Kosmala 134ae26f74eSKarsten Kosmala /** 135ae26f74eSKarsten Kosmala * Adds an user 136ae26f74eSKarsten Kosmala * 137ae26f74eSKarsten Kosmala * @param bool $notify display details 138ae26f74eSKarsten Kosmala * @param array $args 139ae26f74eSKarsten Kosmala * @return int 140ae26f74eSKarsten Kosmala */ 1417faa86faSKarsten Kosmala protected function cmdAdd(bool $notify, array $args) 1427faa86faSKarsten Kosmala { 143ae26f74eSKarsten Kosmala global $auth; 1447faa86faSKarsten Kosmala 145ae26f74eSKarsten Kosmala if (!$auth->canDo('addUser')) { 146ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 147ae26f74eSKarsten Kosmala return 1; 148ae26f74eSKarsten Kosmala } 1497faa86faSKarsten Kosmala 150ae26f74eSKarsten Kosmala list($user, $name, $mail, $grps, $pass) = $args; 151ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 152ae26f74eSKarsten Kosmala 153ae26f74eSKarsten Kosmala if ($auth->canDo('modPass')) { 1547faa86faSKarsten Kosmala if (empty($pass)) { 1557faa86faSKarsten Kosmala if ($notify) { 1567faa86faSKarsten Kosmala $pass = auth_pwgen($user); 1577faa86faSKarsten Kosmala } else { 158ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 159ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_missing_pass')); 160ae26f74eSKarsten Kosmala return 1; 1617faa86faSKarsten Kosmala } 1627faa86faSKarsten Kosmala } 1637faa86faSKarsten Kosmala } else { 1647faa86faSKarsten Kosmala if (!empty($pass)) { 165ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 166ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_modPass_disabled')); 167ae26f74eSKarsten Kosmala return 1; 1687faa86faSKarsten Kosmala } 1697faa86faSKarsten Kosmala } 1707faa86faSKarsten Kosmala 171ae26f74eSKarsten Kosmala if (!$auth->triggerUserMod('create', array($user, $pass, $name, $mail, $grps))) { 172ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 173ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_create_event_failed')); 174ae26f74eSKarsten Kosmala return 1; 1757faa86faSKarsten Kosmala } 1767faa86faSKarsten Kosmala 1777faa86faSKarsten Kosmala return 0; 1787faa86faSKarsten Kosmala } 1797faa86faSKarsten Kosmala 180ae26f74eSKarsten Kosmala /** 181ae26f74eSKarsten Kosmala * Deletes users 182ae26f74eSKarsten Kosmala * @param array $args 183ae26f74eSKarsten Kosmala * @return int 184ae26f74eSKarsten Kosmala */ 1857faa86faSKarsten Kosmala protected function cmdDelete(array $args) 1867faa86faSKarsten Kosmala { 187ae26f74eSKarsten Kosmala global $auth; 1887faa86faSKarsten Kosmala 189ae26f74eSKarsten Kosmala if (!$auth->canDo('delUser')) { 190ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 191ae26f74eSKarsten Kosmala return 1; 192ae26f74eSKarsten Kosmala } 193ae26f74eSKarsten Kosmala 194ae26f74eSKarsten Kosmala $users = explode(',', $args[0]); 195ae26f74eSKarsten Kosmala $count = $auth->triggerUserMod('delete', array($users)); 1967faa86faSKarsten Kosmala 1977faa86faSKarsten Kosmala if (!($count == count($users))) { 198ae26f74eSKarsten Kosmala $part1 = str_replace('%d', $count, $this->getLang('delete_ok')); 199ae26f74eSKarsten Kosmala $part2 = str_replace('%d', (count($users) - $count), $this->getLang('delete_fail')); 2007faa86faSKarsten Kosmala $this->error("$part1, $part2"); 201ae26f74eSKarsten Kosmala 202ae26f74eSKarsten Kosmala return 1; 203ae26f74eSKarsten Kosmala } 204ae26f74eSKarsten Kosmala 205ae26f74eSKarsten Kosmala return 0; 206ae26f74eSKarsten Kosmala } 207ae26f74eSKarsten Kosmala 208ae26f74eSKarsten Kosmala /** 209ae26f74eSKarsten Kosmala * Adds an user to group(s) 210ae26f74eSKarsten Kosmala * 211ae26f74eSKarsten Kosmala * @param array $args 212ae26f74eSKarsten Kosmala * @return int 213ae26f74eSKarsten Kosmala */ 214ae26f74eSKarsten Kosmala protected function cmdAddToGroup(array $args) 215ae26f74eSKarsten Kosmala { 216ae26f74eSKarsten Kosmala global $auth; 217ae26f74eSKarsten Kosmala 218ae26f74eSKarsten Kosmala list($name, $newgrps) = $args; 219ae26f74eSKarsten Kosmala $newgrps = array_filter(array_map('trim', explode(',', $newgrps))); 220ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 221ae26f74eSKarsten Kosmala $changes = array(); 222ae26f74eSKarsten Kosmala 223ae26f74eSKarsten Kosmala if (!empty($newgrps) && $auth->canDo('modGroups')) { 224ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 225ae26f74eSKarsten Kosmala foreach ($newgrps as $group) { 226ae26f74eSKarsten Kosmala if (!in_array($group, $oldinfo['grps'])) { 227ae26f74eSKarsten Kosmala array_push($changes['grps'], $group); 228ae26f74eSKarsten Kosmala } 229ae26f74eSKarsten Kosmala } 230ae26f74eSKarsten Kosmala } 231ae26f74eSKarsten Kosmala 232ae26f74eSKarsten Kosmala if (!empty(array_diff($changes['grps'], $oldinfo['grps']))) { 233c93d7d34SKarsten Kosmala if ($auth->triggerUserMod('modify', array($name, $changes))) { 234ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 235ae26f74eSKarsten Kosmala } else { 236ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 237ae26f74eSKarsten Kosmala return 1; 238ae26f74eSKarsten Kosmala } 239ae26f74eSKarsten Kosmala } 240ae26f74eSKarsten Kosmala 241ae26f74eSKarsten Kosmala return 0; 242ae26f74eSKarsten Kosmala } 243ae26f74eSKarsten Kosmala 244ae26f74eSKarsten Kosmala /** 245ae26f74eSKarsten Kosmala * Removes an user from group(s) 246ae26f74eSKarsten Kosmala * 247ae26f74eSKarsten Kosmala * @param array $args 248ae26f74eSKarsten Kosmala * @return int 249ae26f74eSKarsten Kosmala */ 250ae26f74eSKarsten Kosmala protected function cmdRemoveFromGroup(array $args) 251ae26f74eSKarsten Kosmala { 252ae26f74eSKarsten Kosmala global $auth; 253ae26f74eSKarsten Kosmala 254ae26f74eSKarsten Kosmala list($name, $grps) = $args; 255ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 256ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 257ae26f74eSKarsten Kosmala $changes = array(); 258ae26f74eSKarsten Kosmala 259ae26f74eSKarsten Kosmala if (!empty($grps) && $auth->canDo('modGroups')) { 260ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 261ae26f74eSKarsten Kosmala foreach ($grps as $group) { 262ae26f74eSKarsten Kosmala if (($pos = array_search($group, $changes['grps'])) == !false) { 263ae26f74eSKarsten Kosmala unset($changes['grps'][$pos]); 264ae26f74eSKarsten Kosmala } 265ae26f74eSKarsten Kosmala } 266ae26f74eSKarsten Kosmala } 267ae26f74eSKarsten Kosmala 268ae26f74eSKarsten Kosmala if (!empty(array_diff($oldinfo['grps'], $changes['grps']))) { 269c93d7d34SKarsten Kosmala if ($auth->triggerUserMod('modify', array($name, $changes))) { 270ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 271ae26f74eSKarsten Kosmala } else { 272ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 273ae26f74eSKarsten Kosmala return 1; 274ae26f74eSKarsten Kosmala } 2757faa86faSKarsten Kosmala } 2767faa86faSKarsten Kosmala 2777faa86faSKarsten Kosmala return 0; 2787faa86faSKarsten Kosmala } 2797faa86faSKarsten Kosmala} 280