1*7faa86faSKarsten Kosmala<?php 2*7faa86faSKarsten Kosmala 3*7faa86faSKarsten Kosmalause splitbrain\phpcli\TableFormatter; 4*7faa86faSKarsten Kosmala 5*7faa86faSKarsten Kosmala/** 6*7faa86faSKarsten Kosmala * Class cli_plugin_usermanager 7*7faa86faSKarsten Kosmala * 8*7faa86faSKarsten Kosmala * Command Line component for the usermanager 9*7faa86faSKarsten Kosmala * 10*7faa86faSKarsten Kosmala * @license GPL2 11*7faa86faSKarsten Kosmala * @author Karsten Kosmala <karsten.kosmala@gmail.com> 12*7faa86faSKarsten Kosmala */ 13*7faa86faSKarsten Kosmalaclass cli_plugin_usermanager extends DokuWiki_CLI_Plugin 14*7faa86faSKarsten Kosmala{ 15*7faa86faSKarsten Kosmala protected $auth = null; // auth object 16*7faa86faSKarsten Kosmala 17*7faa86faSKarsten Kosmala public function __construct() 18*7faa86faSKarsten Kosmala { 19*7faa86faSKarsten Kosmala parent::__construct(); 20*7faa86faSKarsten Kosmala global $auth; 21*7faa86faSKarsten Kosmala 22*7faa86faSKarsten Kosmala /** @var DokuWiki_Auth_Plugin $auth */ 23*7faa86faSKarsten Kosmala auth_setup(); 24*7faa86faSKarsten Kosmala $this->auth = $auth; 25*7faa86faSKarsten Kosmala 26*7faa86faSKarsten Kosmala $this->setupLocale(); 27*7faa86faSKarsten Kosmala } 28*7faa86faSKarsten Kosmala 29*7faa86faSKarsten Kosmala /** @inheritdoc */ 30*7faa86faSKarsten Kosmala protected function setup(\splitbrain\phpcli\Options $options) 31*7faa86faSKarsten Kosmala { 32*7faa86faSKarsten Kosmala // general setup 33*7faa86faSKarsten Kosmala $options->setHelp( 34*7faa86faSKarsten Kosmala "Manage users for this DokuWiki instance\n\n" 35*7faa86faSKarsten Kosmala ); 36*7faa86faSKarsten Kosmala 37*7faa86faSKarsten Kosmala // list 38*7faa86faSKarsten Kosmala $options->registerCommand('list', 'List users'); 39*7faa86faSKarsten Kosmala $options->registerOption('verbose', 'Show detailed user information', 'v', false, 'list'); 40*7faa86faSKarsten Kosmala 41*7faa86faSKarsten Kosmala // add 42*7faa86faSKarsten Kosmala $options->registerCommand('add', 'Add an user to auth backend'); 43*7faa86faSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'add'); 44*7faa86faSKarsten Kosmala $options->registerArgument('mail', 'mail address', true, 'add'); 45*7faa86faSKarsten Kosmala $options->registerArgument('full_name', 'Full name', false, 'add'); 46*7faa86faSKarsten Kosmala $options->registerArgument('groups', 'groups to be added', false, 'add'); 47*7faa86faSKarsten Kosmala $options->registerArgument('password', 'password of user', false, 'add'); 48*7faa86faSKarsten Kosmala $options->registerOption('notify', 'notify user', 'n', false, 'add'); 49*7faa86faSKarsten Kosmala 50*7faa86faSKarsten Kosmala // delete 51*7faa86faSKarsten Kosmala $options->registerCommand('delete', 'Delete user from auth backend'); 52*7faa86faSKarsten Kosmala $options->registerArgument('name', 'Username', true, 'delete'); 53*7faa86faSKarsten Kosmala } 54*7faa86faSKarsten Kosmala 55*7faa86faSKarsten Kosmala /** @inheritdoc */ 56*7faa86faSKarsten Kosmala protected function main(\splitbrain\phpcli\Options $options) 57*7faa86faSKarsten Kosmala { 58*7faa86faSKarsten Kosmala switch ($options->getCmd()) { 59*7faa86faSKarsten Kosmala case 'list': 60*7faa86faSKarsten Kosmala $ret = $this->cmdList($options->getOpt('verbose')); 61*7faa86faSKarsten Kosmala break; 62*7faa86faSKarsten Kosmala case 'add': 63*7faa86faSKarsten Kosmala $ret = $this->cmdAdd($options->getOpt('notify'), $options->getArgs()); 64*7faa86faSKarsten Kosmala break; 65*7faa86faSKarsten Kosmala case 'delete': 66*7faa86faSKarsten Kosmala $ret = $this->cmdDelete($options->getArgs()); 67*7faa86faSKarsten Kosmala break; 68*7faa86faSKarsten Kosmala 69*7faa86faSKarsten Kosmala default: 70*7faa86faSKarsten Kosmala echo $options->help(); 71*7faa86faSKarsten Kosmala $ret = 0; 72*7faa86faSKarsten Kosmala } 73*7faa86faSKarsten Kosmala 74*7faa86faSKarsten Kosmala exit($ret); 75*7faa86faSKarsten Kosmala } 76*7faa86faSKarsten Kosmala 77*7faa86faSKarsten Kosmala /** 78*7faa86faSKarsten Kosmala * @param bool $showdetails 79*7faa86faSKarsten Kosmala * @return int 80*7faa86faSKarsten Kosmala * @throws \splitbrain\phpcli\Exception 81*7faa86faSKarsten Kosmala */ 82*7faa86faSKarsten Kosmala protected function cmdList($showdetails) 83*7faa86faSKarsten Kosmala { 84*7faa86faSKarsten Kosmala if (!$this->auth->canDo('getUsers')) echo 'Authentication backend not available'; 85*7faa86faSKarsten Kosmala 86*7faa86faSKarsten Kosmala $list = $this->getUsers(); 87*7faa86faSKarsten Kosmala $this->listUsers($list, $showdetails); 88*7faa86faSKarsten Kosmala 89*7faa86faSKarsten Kosmala return 0; 90*7faa86faSKarsten Kosmala } 91*7faa86faSKarsten Kosmala 92*7faa86faSKarsten Kosmala /** 93*7faa86faSKarsten Kosmala * Get all users 94*7faa86faSKarsten Kosmala * 95*7faa86faSKarsten Kosmala * @return array 96*7faa86faSKarsten Kosmala */ 97*7faa86faSKarsten Kosmala protected function getUsers() 98*7faa86faSKarsten Kosmala { 99*7faa86faSKarsten Kosmala return $this->auth->retrieveUsers(); 100*7faa86faSKarsten Kosmala } 101*7faa86faSKarsten Kosmala 102*7faa86faSKarsten Kosmala /** 103*7faa86faSKarsten Kosmala * List the given users 104*7faa86faSKarsten Kosmala * 105*7faa86faSKarsten Kosmala * @param string[] list display details 106*7faa86faSKarsten Kosmala * @param bool $details display details 107*7faa86faSKarsten Kosmala * @throws \splitbrain\phpcli\Exception 108*7faa86faSKarsten Kosmala */ 109*7faa86faSKarsten Kosmala protected function listUsers($list, bool $details = False) 110*7faa86faSKarsten Kosmala { 111*7faa86faSKarsten Kosmala $tr = new TableFormatter($this->colors); 112*7faa86faSKarsten Kosmala 113*7faa86faSKarsten Kosmala foreach ($list as $username => $user) { 114*7faa86faSKarsten Kosmala $content = [$username]; 115*7faa86faSKarsten Kosmala if ($details) { 116*7faa86faSKarsten Kosmala array_push($content, $user['name']); 117*7faa86faSKarsten Kosmala array_push($content, $user['mail']); 118*7faa86faSKarsten Kosmala array_push($content, implode(", ", $user['grps'])); 119*7faa86faSKarsten Kosmala } 120*7faa86faSKarsten Kosmala echo $tr->format( 121*7faa86faSKarsten Kosmala [15, 25, 25, 15], 122*7faa86faSKarsten Kosmala $content 123*7faa86faSKarsten Kosmala ); 124*7faa86faSKarsten Kosmala } 125*7faa86faSKarsten Kosmala } 126*7faa86faSKarsten Kosmala 127*7faa86faSKarsten Kosmala protected function cmdAdd(bool $notify, array $args) 128*7faa86faSKarsten Kosmala { 129*7faa86faSKarsten Kosmala if (!$this->auth->canDo('addUser')) return false; 130*7faa86faSKarsten Kosmala 131*7faa86faSKarsten Kosmala $user = $args[0]; 132*7faa86faSKarsten Kosmala $name = $args[1]; 133*7faa86faSKarsten Kosmala $mail = $args[2]; 134*7faa86faSKarsten Kosmala $grps = explode(',', $args[3]); 135*7faa86faSKarsten Kosmala $pass = $args[4]; 136*7faa86faSKarsten Kosmala 137*7faa86faSKarsten Kosmala if ($this->auth->canDo('modPass')) { 138*7faa86faSKarsten Kosmala if (empty($pass)) { 139*7faa86faSKarsten Kosmala if ($notify) { 140*7faa86faSKarsten Kosmala $pass = auth_pwgen($user); 141*7faa86faSKarsten Kosmala } else { 142*7faa86faSKarsten Kosmala $this->error($this->lang['add_fail']); 143*7faa86faSKarsten Kosmala $this->error($this->lang['addUser_error_missing_pass']); 144*7faa86faSKarsten Kosmala return false; 145*7faa86faSKarsten Kosmala } 146*7faa86faSKarsten Kosmala } 147*7faa86faSKarsten Kosmala } else { 148*7faa86faSKarsten Kosmala if (!empty($pass)) { 149*7faa86faSKarsten Kosmala $this->error($this->lang['add_fail']); 150*7faa86faSKarsten Kosmala $this->error($this->lang['addUser_error_modPass_disabled']); 151*7faa86faSKarsten Kosmala return false; 152*7faa86faSKarsten Kosmala } 153*7faa86faSKarsten Kosmala } 154*7faa86faSKarsten Kosmala 155*7faa86faSKarsten Kosmala if (!$this->auth->triggerUserMod('create', array($user, $pass, $name, $mail, $grps))) { 156*7faa86faSKarsten Kosmala $this->error($this->lang['add_fail']); 157*7faa86faSKarsten Kosmala $this->error($this->lang['addUser_error_create_event_failed']); 158*7faa86faSKarsten Kosmala return false; 159*7faa86faSKarsten Kosmala } 160*7faa86faSKarsten Kosmala 161*7faa86faSKarsten Kosmala return 0; 162*7faa86faSKarsten Kosmala } 163*7faa86faSKarsten Kosmala 164*7faa86faSKarsten Kosmala protected function cmdDelete(array $args) 165*7faa86faSKarsten Kosmala { 166*7faa86faSKarsten Kosmala if (!$this->auth->canDo('delUser')) return false; 167*7faa86faSKarsten Kosmala $users = explode(',', $args[0]); 168*7faa86faSKarsten Kosmala 169*7faa86faSKarsten Kosmala $count = $this->auth->triggerUserMod('delete', array($users)); 170*7faa86faSKarsten Kosmala 171*7faa86faSKarsten Kosmala if (!($count == count($users))) { 172*7faa86faSKarsten Kosmala $part1 = str_replace('%d', $count, $this->lang['delete_ok']); 173*7faa86faSKarsten Kosmala $part2 = str_replace('%d', (count($users)-$count), $this->lang['delete_fail']); 174*7faa86faSKarsten Kosmala $this->error("$part1, $part2"); 175*7faa86faSKarsten Kosmala } 176*7faa86faSKarsten Kosmala 177*7faa86faSKarsten Kosmala return 0; 178*7faa86faSKarsten Kosmala } 179*7faa86faSKarsten Kosmala} 180