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