17faa86faSKarsten Kosmala<?php 27faa86faSKarsten Kosmala 3*44c2bd91SAndreas Gohruse dokuwiki\Extension\AuthPlugin; 4*44c2bd91SAndreas Gohruse splitbrain\phpcli\Options; 57faa86faSKarsten Kosmalause splitbrain\phpcli\TableFormatter; 67faa86faSKarsten Kosmala 77faa86faSKarsten Kosmala/** 87faa86faSKarsten Kosmala * Class cli_plugin_usermanager 97faa86faSKarsten Kosmala * 107faa86faSKarsten Kosmala * Command Line component for the usermanager 117faa86faSKarsten Kosmala * 127faa86faSKarsten Kosmala * @license GPL2 137faa86faSKarsten Kosmala * @author Karsten Kosmala <karsten.kosmala@gmail.com> 147faa86faSKarsten Kosmala */ 157faa86faSKarsten Kosmalaclass cli_plugin_usermanager extends DokuWiki_CLI_Plugin 167faa86faSKarsten Kosmala{ 177faa86faSKarsten Kosmala public function __construct() 187faa86faSKarsten Kosmala { 197faa86faSKarsten Kosmala parent::__construct(); 207faa86faSKarsten Kosmala auth_setup(); 217faa86faSKarsten Kosmala } 227faa86faSKarsten Kosmala 237faa86faSKarsten Kosmala /** @inheritdoc */ 24*44c2bd91SAndreas Gohr protected function setup(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'); 382bf5aa0cSKarsten Kosmala $options->registerArgument('mail', 'Email address', true, 'add'); 397faa86faSKarsten Kosmala $options->registerArgument('full_name', 'Full name', false, 'add'); 402bf5aa0cSKarsten Kosmala $options->registerArgument('groups', 'Groups to be added', false, 'add'); 412bf5aa0cSKarsten Kosmala $options->registerArgument('password', 'Password of user', false, 'add'); 422bf5aa0cSKarsten Kosmala $options->registerOption('notify', 'Notify user', 'n', false, 'add'); 437faa86faSKarsten Kosmala 447faa86faSKarsten Kosmala // delete 45*44c2bd91SAndreas Gohr $options->registerCommand('delete', 'Deletes 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)'); 502bf5aa0cSKarsten 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)'); 552bf5aa0cSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'removefromgroup'); 56*44c2bd91SAndreas Gohr $options->registerArgument('group', 'Group(s), comma-separated', true, 'removefromgroup'); 577faa86faSKarsten Kosmala } 587faa86faSKarsten Kosmala 597faa86faSKarsten Kosmala /** @inheritdoc */ 60*44c2bd91SAndreas Gohr protected function main(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 { 93*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 94ae26f74eSKarsten Kosmala global $auth; 957faa86faSKarsten Kosmala 96ae26f74eSKarsten Kosmala if (!isset($auth)) { 97ae26f74eSKarsten Kosmala $this->error($this->getLang('noauth')); 98ae26f74eSKarsten Kosmala return 1; 99ae26f74eSKarsten Kosmala } elseif (!$auth->canDo('getUsers')) { 100ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 101ae26f74eSKarsten Kosmala return 1; 102ae26f74eSKarsten Kosmala } else { 103ae26f74eSKarsten Kosmala $this->listUsers($showdetails); 104ae26f74eSKarsten Kosmala } 1057faa86faSKarsten Kosmala 1067faa86faSKarsten Kosmala return 0; 1077faa86faSKarsten Kosmala } 1087faa86faSKarsten Kosmala 1097faa86faSKarsten Kosmala /** 1107faa86faSKarsten Kosmala * List the given users 1117faa86faSKarsten Kosmala * 1127faa86faSKarsten Kosmala * @param bool $details display details 1137faa86faSKarsten Kosmala */ 114*44c2bd91SAndreas Gohr protected function listUsers(bool $details = false) 1157faa86faSKarsten Kosmala { 116*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 117ae26f74eSKarsten Kosmala global $auth; 118ae26f74eSKarsten Kosmala $list = $auth->retrieveUsers(); 119ae26f74eSKarsten Kosmala 1207faa86faSKarsten Kosmala $tr = new TableFormatter($this->colors); 1217faa86faSKarsten Kosmala 1227faa86faSKarsten Kosmala foreach ($list as $username => $user) { 1237faa86faSKarsten Kosmala $content = [$username]; 1247faa86faSKarsten Kosmala if ($details) { 1257faa86faSKarsten Kosmala array_push($content, $user['name']); 1267faa86faSKarsten Kosmala array_push($content, $user['mail']); 1277faa86faSKarsten Kosmala array_push($content, implode(", ", $user['grps'])); 1287faa86faSKarsten Kosmala } 1297faa86faSKarsten Kosmala echo $tr->format( 1307faa86faSKarsten Kosmala [15, 25, 25, 15], 1317faa86faSKarsten Kosmala $content 1327faa86faSKarsten Kosmala ); 1337faa86faSKarsten Kosmala } 1347faa86faSKarsten Kosmala } 1357faa86faSKarsten Kosmala 136ae26f74eSKarsten Kosmala /** 137ae26f74eSKarsten Kosmala * Adds an user 138ae26f74eSKarsten Kosmala * 139ae26f74eSKarsten Kosmala * @param bool $notify display details 140ae26f74eSKarsten Kosmala * @param array $args 141ae26f74eSKarsten Kosmala * @return int 142ae26f74eSKarsten Kosmala */ 1437faa86faSKarsten Kosmala protected function cmdAdd(bool $notify, array $args) 1447faa86faSKarsten Kosmala { 145*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 146ae26f74eSKarsten Kosmala global $auth; 1477faa86faSKarsten Kosmala 148ae26f74eSKarsten Kosmala if (!$auth->canDo('addUser')) { 149ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 150ae26f74eSKarsten Kosmala return 1; 151ae26f74eSKarsten Kosmala } 1527faa86faSKarsten Kosmala 153ae26f74eSKarsten Kosmala list($user, $name, $mail, $grps, $pass) = $args; 154ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 155ae26f74eSKarsten Kosmala 156ae26f74eSKarsten Kosmala if ($auth->canDo('modPass')) { 1577faa86faSKarsten Kosmala if (empty($pass)) { 1587faa86faSKarsten Kosmala if ($notify) { 1597faa86faSKarsten Kosmala $pass = auth_pwgen($user); 1607faa86faSKarsten Kosmala } else { 161ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 162ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_missing_pass')); 163ae26f74eSKarsten Kosmala return 1; 1647faa86faSKarsten Kosmala } 1657faa86faSKarsten Kosmala } 1667faa86faSKarsten Kosmala } else { 1677faa86faSKarsten Kosmala if (!empty($pass)) { 168ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 169ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_modPass_disabled')); 170ae26f74eSKarsten Kosmala return 1; 1717faa86faSKarsten Kosmala } 1727faa86faSKarsten Kosmala } 1737faa86faSKarsten Kosmala 174ae26f74eSKarsten Kosmala if (!$auth->triggerUserMod('create', array($user, $pass, $name, $mail, $grps))) { 175ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 176ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_create_event_failed')); 177ae26f74eSKarsten Kosmala return 1; 1787faa86faSKarsten Kosmala } 1797faa86faSKarsten Kosmala 1807faa86faSKarsten Kosmala return 0; 1817faa86faSKarsten Kosmala } 1827faa86faSKarsten Kosmala 183ae26f74eSKarsten Kosmala /** 184ae26f74eSKarsten Kosmala * Deletes users 185ae26f74eSKarsten Kosmala * @param array $args 186ae26f74eSKarsten Kosmala * @return int 187ae26f74eSKarsten Kosmala */ 1887faa86faSKarsten Kosmala protected function cmdDelete(array $args) 1897faa86faSKarsten Kosmala { 190*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 191ae26f74eSKarsten Kosmala global $auth; 1927faa86faSKarsten Kosmala 193ae26f74eSKarsten Kosmala if (!$auth->canDo('delUser')) { 194ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 195ae26f74eSKarsten Kosmala return 1; 196ae26f74eSKarsten Kosmala } 197ae26f74eSKarsten Kosmala 198ae26f74eSKarsten Kosmala $users = explode(',', $args[0]); 199ae26f74eSKarsten Kosmala $count = $auth->triggerUserMod('delete', array($users)); 2007faa86faSKarsten Kosmala 2017faa86faSKarsten Kosmala if (!($count == count($users))) { 202ae26f74eSKarsten Kosmala $part1 = str_replace('%d', $count, $this->getLang('delete_ok')); 203ae26f74eSKarsten Kosmala $part2 = str_replace('%d', (count($users) - $count), $this->getLang('delete_fail')); 2047faa86faSKarsten Kosmala $this->error("$part1, $part2"); 205ae26f74eSKarsten Kosmala 206ae26f74eSKarsten Kosmala return 1; 207ae26f74eSKarsten Kosmala } 208ae26f74eSKarsten Kosmala 209ae26f74eSKarsten Kosmala return 0; 210ae26f74eSKarsten Kosmala } 211ae26f74eSKarsten Kosmala 212ae26f74eSKarsten Kosmala /** 213ae26f74eSKarsten Kosmala * Adds an user to group(s) 214ae26f74eSKarsten Kosmala * 215ae26f74eSKarsten Kosmala * @param array $args 216ae26f74eSKarsten Kosmala * @return int 217ae26f74eSKarsten Kosmala */ 218ae26f74eSKarsten Kosmala protected function cmdAddToGroup(array $args) 219ae26f74eSKarsten Kosmala { 220*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 221ae26f74eSKarsten Kosmala global $auth; 222ae26f74eSKarsten Kosmala 223ae26f74eSKarsten Kosmala list($name, $newgrps) = $args; 224ae26f74eSKarsten Kosmala $newgrps = array_filter(array_map('trim', explode(',', $newgrps))); 225ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 226ae26f74eSKarsten Kosmala $changes = array(); 227ae26f74eSKarsten Kosmala 228ae26f74eSKarsten Kosmala if (!empty($newgrps) && $auth->canDo('modGroups')) { 229ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 230ae26f74eSKarsten Kosmala foreach ($newgrps as $group) { 231ae26f74eSKarsten Kosmala if (!in_array($group, $oldinfo['grps'])) { 232ae26f74eSKarsten Kosmala array_push($changes['grps'], $group); 233ae26f74eSKarsten Kosmala } 234ae26f74eSKarsten Kosmala } 235ae26f74eSKarsten Kosmala } 236ae26f74eSKarsten Kosmala 237ae26f74eSKarsten Kosmala if (!empty(array_diff($changes['grps'], $oldinfo['grps']))) { 238c93d7d34SKarsten Kosmala if ($auth->triggerUserMod('modify', array($name, $changes))) { 239ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 240ae26f74eSKarsten Kosmala } else { 241ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 242ae26f74eSKarsten Kosmala return 1; 243ae26f74eSKarsten Kosmala } 244ae26f74eSKarsten Kosmala } 245ae26f74eSKarsten Kosmala 246ae26f74eSKarsten Kosmala return 0; 247ae26f74eSKarsten Kosmala } 248ae26f74eSKarsten Kosmala 249ae26f74eSKarsten Kosmala /** 250ae26f74eSKarsten Kosmala * Removes an user from group(s) 251ae26f74eSKarsten Kosmala * 252ae26f74eSKarsten Kosmala * @param array $args 253ae26f74eSKarsten Kosmala * @return int 254ae26f74eSKarsten Kosmala */ 255ae26f74eSKarsten Kosmala protected function cmdRemoveFromGroup(array $args) 256ae26f74eSKarsten Kosmala { 257*44c2bd91SAndreas Gohr /** @var AuthPlugin $auth */ 258ae26f74eSKarsten Kosmala global $auth; 259ae26f74eSKarsten Kosmala 260ae26f74eSKarsten Kosmala list($name, $grps) = $args; 261ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 262ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 263ae26f74eSKarsten Kosmala $changes = array(); 264ae26f74eSKarsten Kosmala 265ae26f74eSKarsten Kosmala if (!empty($grps) && $auth->canDo('modGroups')) { 266ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 267ae26f74eSKarsten Kosmala foreach ($grps as $group) { 268ae26f74eSKarsten Kosmala if (($pos = array_search($group, $changes['grps'])) == !false) { 269ae26f74eSKarsten Kosmala unset($changes['grps'][$pos]); 270ae26f74eSKarsten Kosmala } 271ae26f74eSKarsten Kosmala } 272ae26f74eSKarsten Kosmala } 273ae26f74eSKarsten Kosmala 274ae26f74eSKarsten Kosmala if (!empty(array_diff($oldinfo['grps'], $changes['grps']))) { 275c93d7d34SKarsten Kosmala if ($auth->triggerUserMod('modify', array($name, $changes))) { 276ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 277ae26f74eSKarsten Kosmala } else { 278ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 279ae26f74eSKarsten Kosmala return 1; 280ae26f74eSKarsten Kosmala } 2817faa86faSKarsten Kosmala } 2827faa86faSKarsten Kosmala 2837faa86faSKarsten Kosmala return 0; 2847faa86faSKarsten Kosmala } 2857faa86faSKarsten Kosmala} 286