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( 28*ae26f74eSKarsten 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'); 387faa86faSKarsten Kosmala $options->registerArgument('mail', 'mail address', true, 'add'); 397faa86faSKarsten Kosmala $options->registerArgument('full_name', 'Full name', false, 'add'); 407faa86faSKarsten Kosmala $options->registerArgument('groups', 'groups to be added', false, 'add'); 417faa86faSKarsten Kosmala $options->registerArgument('password', 'password of user', false, 'add'); 427faa86faSKarsten Kosmala $options->registerOption('notify', 'notify user', 'n', false, 'add'); 437faa86faSKarsten Kosmala 447faa86faSKarsten Kosmala // delete 45*ae26f74eSKarsten Kosmala $options->registerCommand('delete', 'Delete user(s) from auth backend'); 46*ae26f74eSKarsten Kosmala $options->registerArgument('name', 'Username(s), comma-seperated', true, 'delete'); 47*ae26f74eSKarsten Kosmala 48*ae26f74eSKarsten Kosmala // add to group 49*ae26f74eSKarsten Kosmala $options->registerCommand('addtogroup', 'Add user to group(s)'); 50*ae26f74eSKarsten Kosmala $options->registerArgument('name', 'Username, comma-seperated', true, 'addtogroup'); 51*ae26f74eSKarsten Kosmala $options->registerArgument('group', 'Group(s), comma-seperated', true, 'addtogroup'); 52*ae26f74eSKarsten Kosmala 53*ae26f74eSKarsten Kosmala // remove from group 54*ae26f74eSKarsten Kosmala $options->registerCommand('removefromgroup', 'Remove user from group(s)'); 55*ae26f74eSKarsten Kosmala $options->registerArgument('name', 'Username, comma-seperated', true, 'removefromgroup'); 56*ae26f74eSKarsten 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; 72*ae26f74eSKarsten Kosmala case 'addtogroup': 73*ae26f74eSKarsten Kosmala $ret = $this->cmdAddToGroup($options->getArgs()); 74*ae26f74eSKarsten Kosmala break; 75*ae26f74eSKarsten Kosmala case 'removefromgroup': 76*ae26f74eSKarsten Kosmala $ret = $this->cmdRemoveFromGroup($options->getArgs()); 77*ae26f74eSKarsten 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 */ 91*ae26f74eSKarsten Kosmala protected function cmdList(bool $showdetails) 927faa86faSKarsten Kosmala { 93*ae26f74eSKarsten Kosmala global $auth; 947faa86faSKarsten Kosmala 95*ae26f74eSKarsten Kosmala if (!isset($auth)) { 96*ae26f74eSKarsten Kosmala $this->error($this->getLang('noauth')); 97*ae26f74eSKarsten Kosmala return 1; 98*ae26f74eSKarsten Kosmala } elseif (!$auth->canDo('getUsers')) { 99*ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 100*ae26f74eSKarsten Kosmala return 1; 101*ae26f74eSKarsten Kosmala } else { 102*ae26f74eSKarsten Kosmala $this->listUsers($showdetails); 103*ae26f74eSKarsten 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 */ 113*ae26f74eSKarsten Kosmala protected function listUsers(bool $details = False) 1147faa86faSKarsten Kosmala { 115*ae26f74eSKarsten Kosmala global $auth; 116*ae26f74eSKarsten Kosmala $list = $auth->retrieveUsers(); 117*ae26f74eSKarsten 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 134*ae26f74eSKarsten Kosmala /** 135*ae26f74eSKarsten Kosmala * Adds an user 136*ae26f74eSKarsten Kosmala * 137*ae26f74eSKarsten Kosmala * @param bool $notify display details 138*ae26f74eSKarsten Kosmala * @param array $args 139*ae26f74eSKarsten Kosmala * @return int 140*ae26f74eSKarsten Kosmala */ 1417faa86faSKarsten Kosmala protected function cmdAdd(bool $notify, array $args) 1427faa86faSKarsten Kosmala { 143*ae26f74eSKarsten Kosmala global $auth; 1447faa86faSKarsten Kosmala 145*ae26f74eSKarsten Kosmala if (!$auth->canDo('addUser')) { 146*ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 147*ae26f74eSKarsten Kosmala return 1; 148*ae26f74eSKarsten Kosmala } 1497faa86faSKarsten Kosmala 150*ae26f74eSKarsten Kosmala list($user, $name, $mail, $grps, $pass) = $args; 151*ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 152*ae26f74eSKarsten Kosmala 153*ae26f74eSKarsten Kosmala if ($auth->canDo('modPass')) { 1547faa86faSKarsten Kosmala if (empty($pass)) { 1557faa86faSKarsten Kosmala if ($notify) { 1567faa86faSKarsten Kosmala $pass = auth_pwgen($user); 1577faa86faSKarsten Kosmala } else { 158*ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 159*ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_missing_pass')); 160*ae26f74eSKarsten Kosmala return 1; 1617faa86faSKarsten Kosmala } 1627faa86faSKarsten Kosmala } 1637faa86faSKarsten Kosmala } else { 1647faa86faSKarsten Kosmala if (!empty($pass)) { 165*ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 166*ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_modPass_disabled')); 167*ae26f74eSKarsten Kosmala return 1; 1687faa86faSKarsten Kosmala } 1697faa86faSKarsten Kosmala } 1707faa86faSKarsten Kosmala 171*ae26f74eSKarsten Kosmala if (!$auth->triggerUserMod('create', array($user, $pass, $name, $mail, $grps))) { 172*ae26f74eSKarsten Kosmala $this->error($this->getLang('add_fail')); 173*ae26f74eSKarsten Kosmala $this->error($this->getLang('addUser_error_create_event_failed')); 174*ae26f74eSKarsten Kosmala return 1; 1757faa86faSKarsten Kosmala } 1767faa86faSKarsten Kosmala 1777faa86faSKarsten Kosmala return 0; 1787faa86faSKarsten Kosmala } 1797faa86faSKarsten Kosmala 180*ae26f74eSKarsten Kosmala /** 181*ae26f74eSKarsten Kosmala * Deletes users 182*ae26f74eSKarsten Kosmala * @param array $args 183*ae26f74eSKarsten Kosmala * @return int 184*ae26f74eSKarsten Kosmala */ 1857faa86faSKarsten Kosmala protected function cmdDelete(array $args) 1867faa86faSKarsten Kosmala { 187*ae26f74eSKarsten Kosmala global $auth; 1887faa86faSKarsten Kosmala 189*ae26f74eSKarsten Kosmala if (!$auth->canDo('delUser')) { 190*ae26f74eSKarsten Kosmala $this->error($this->getLang('nosupport')); 191*ae26f74eSKarsten Kosmala return 1; 192*ae26f74eSKarsten Kosmala } 193*ae26f74eSKarsten Kosmala 194*ae26f74eSKarsten Kosmala $users = explode(',', $args[0]); 195*ae26f74eSKarsten Kosmala $count = $auth->triggerUserMod('delete', array($users)); 1967faa86faSKarsten Kosmala 1977faa86faSKarsten Kosmala if (!($count == count($users))) { 198*ae26f74eSKarsten Kosmala $part1 = str_replace('%d', $count, $this->getLang('delete_ok')); 199*ae26f74eSKarsten Kosmala $part2 = str_replace('%d', (count($users) - $count), $this->getLang('delete_fail')); 2007faa86faSKarsten Kosmala $this->error("$part1, $part2"); 201*ae26f74eSKarsten Kosmala 202*ae26f74eSKarsten Kosmala return 1; 203*ae26f74eSKarsten Kosmala } 204*ae26f74eSKarsten Kosmala 205*ae26f74eSKarsten Kosmala return 0; 206*ae26f74eSKarsten Kosmala } 207*ae26f74eSKarsten Kosmala 208*ae26f74eSKarsten Kosmala /** 209*ae26f74eSKarsten Kosmala * Adds an user to group(s) 210*ae26f74eSKarsten Kosmala * 211*ae26f74eSKarsten Kosmala * @param array $args 212*ae26f74eSKarsten Kosmala * @return int 213*ae26f74eSKarsten Kosmala */ 214*ae26f74eSKarsten Kosmala protected function cmdAddToGroup(array $args) 215*ae26f74eSKarsten Kosmala { 216*ae26f74eSKarsten Kosmala global $auth; 217*ae26f74eSKarsten Kosmala 218*ae26f74eSKarsten Kosmala list($name, $newgrps) = $args; 219*ae26f74eSKarsten Kosmala $newgrps = array_filter(array_map('trim', explode(',', $newgrps))); 220*ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 221*ae26f74eSKarsten Kosmala $changes = array(); 222*ae26f74eSKarsten Kosmala 223*ae26f74eSKarsten Kosmala if (!empty($newgrps) && $auth->canDo('modGroups')) { 224*ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 225*ae26f74eSKarsten Kosmala foreach ($newgrps as $group) { 226*ae26f74eSKarsten Kosmala if (!in_array($group, $oldinfo['grps'])) { 227*ae26f74eSKarsten Kosmala array_push($changes['grps'], $group); 228*ae26f74eSKarsten Kosmala } 229*ae26f74eSKarsten Kosmala } 230*ae26f74eSKarsten Kosmala } 231*ae26f74eSKarsten Kosmala 232*ae26f74eSKarsten Kosmala if (!empty(array_diff($changes['grps'], $oldinfo['grps']))) { 233*ae26f74eSKarsten Kosmala if ($ok = $auth->triggerUserMod('modify', array($name, $changes))) { 234*ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 235*ae26f74eSKarsten Kosmala } else { 236*ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 237*ae26f74eSKarsten Kosmala return 1; 238*ae26f74eSKarsten Kosmala } 239*ae26f74eSKarsten Kosmala } 240*ae26f74eSKarsten Kosmala 241*ae26f74eSKarsten Kosmala return 0; 242*ae26f74eSKarsten Kosmala } 243*ae26f74eSKarsten Kosmala 244*ae26f74eSKarsten Kosmala /** 245*ae26f74eSKarsten Kosmala * Removes an user from group(s) 246*ae26f74eSKarsten Kosmala * 247*ae26f74eSKarsten Kosmala * @param array $args 248*ae26f74eSKarsten Kosmala * @return int 249*ae26f74eSKarsten Kosmala */ 250*ae26f74eSKarsten Kosmala protected function cmdRemoveFromGroup(array $args) 251*ae26f74eSKarsten Kosmala { 252*ae26f74eSKarsten Kosmala global $auth; 253*ae26f74eSKarsten Kosmala 254*ae26f74eSKarsten Kosmala list($name, $grps) = $args; 255*ae26f74eSKarsten Kosmala $grps = array_filter(array_map('trim', explode(',', $grps))); 256*ae26f74eSKarsten Kosmala $oldinfo = $auth->getUserData($name); 257*ae26f74eSKarsten Kosmala $changes = array(); 258*ae26f74eSKarsten Kosmala 259*ae26f74eSKarsten Kosmala if (!empty($grps) && $auth->canDo('modGroups')) { 260*ae26f74eSKarsten Kosmala $changes['grps'] = $oldinfo['grps']; 261*ae26f74eSKarsten Kosmala foreach ($grps as $group) { 262*ae26f74eSKarsten Kosmala if (($pos = array_search($group, $changes['grps'])) ==! false) { 263*ae26f74eSKarsten Kosmala unset($changes['grps'][$pos]); 264*ae26f74eSKarsten Kosmala } 265*ae26f74eSKarsten Kosmala } 266*ae26f74eSKarsten Kosmala } 267*ae26f74eSKarsten Kosmala 268*ae26f74eSKarsten Kosmala if (!empty(array_diff($oldinfo['grps'], $changes['grps']))) { 269*ae26f74eSKarsten Kosmala if ($ok = $auth->triggerUserMod('modify', array($name, $changes))) { 270*ae26f74eSKarsten Kosmala $this->info($this->getLang('update_ok')); 271*ae26f74eSKarsten Kosmala } else { 272*ae26f74eSKarsten Kosmala $this->error($this->getLang('update_fail')); 273*ae26f74eSKarsten Kosmala return 1; 274*ae26f74eSKarsten Kosmala } 2757faa86faSKarsten Kosmala } 2767faa86faSKarsten Kosmala 2777faa86faSKarsten Kosmala return 0; 2787faa86faSKarsten Kosmala } 2797faa86faSKarsten Kosmala} 280