xref: /dokuwiki/lib/plugins/usermanager/cli.php (revision ae26f74eded5b09ebe15a3294ac95fd6d2fdc016)
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