xref: /plugin/oauth/action/user.php (revision 290e9b1f10bf4135eb82799dc58da0055064d995)
137d2401aSAnna Dabrowska<?php
237d2401aSAnna Dabrowska
3*290e9b1fSAndreas Gohruse dokuwiki\Extension\ActionPlugin;
4*290e9b1fSAndreas Gohruse dokuwiki\Extension\EventHandler;
5*290e9b1fSAndreas Gohruse dokuwiki\Extension\Event;
6b0c07e15SAndreas Gohruse dokuwiki\Form\Form;
7b0c07e15SAndreas Gohr
837d2401aSAnna Dabrowska/**
937d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component)
1037d2401aSAnna Dabrowska *
1174b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups.
1274b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services.
1374b4d4a4SAndreas Gohr *
1437d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
1537d2401aSAnna Dabrowska * @author  Andreas Gohr <andi@splitbrain.org>
1637d2401aSAnna Dabrowska */
17*290e9b1fSAndreas Gohrclass action_plugin_oauth_user extends ActionPlugin
1837d2401aSAnna Dabrowska{
1937d2401aSAnna Dabrowska    /** @var helper_plugin_oauth */
2037d2401aSAnna Dabrowska    protected $hlp;
2137d2401aSAnna Dabrowska
2237d2401aSAnna Dabrowska    /**
2337d2401aSAnna Dabrowska     * Constructor
2437d2401aSAnna Dabrowska     *
2537d2401aSAnna Dabrowska     * Initializes the helper
2637d2401aSAnna Dabrowska     */
2737d2401aSAnna Dabrowska    public function __construct()
2837d2401aSAnna Dabrowska    {
2937d2401aSAnna Dabrowska        $this->hlp = plugin_load('helper', 'oauth');
3037d2401aSAnna Dabrowska    }
3137d2401aSAnna Dabrowska
3237d2401aSAnna Dabrowska    /**
3337d2401aSAnna Dabrowska     * Registers a callback function for a given event
3437d2401aSAnna Dabrowska     *
35*290e9b1fSAndreas Gohr     * @param EventHandler $controller DokuWiki's event controller object
3637d2401aSAnna Dabrowska     * @return void
3737d2401aSAnna Dabrowska     */
38*290e9b1fSAndreas Gohr    public function register(EventHandler $controller)
3937d2401aSAnna Dabrowska    {
4037d2401aSAnna Dabrowska        global $conf;
4137d2401aSAnna Dabrowska        if ($conf['authtype'] != 'oauth') return;
4237d2401aSAnna Dabrowska
4337d2401aSAnna Dabrowska        $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users
4437d2401aSAnna Dabrowska
45*290e9b1fSAndreas Gohr        $controller->register_hook(
46*290e9b1fSAndreas Gohr            'HTML_UPDATEPROFILEFORM_OUTPUT',
47*290e9b1fSAndreas Gohr            'BEFORE',
48*290e9b1fSAndreas Gohr            $this,
49*290e9b1fSAndreas Gohr            'handleOldProfileform'
50*290e9b1fSAndreas Gohr        ); // deprecated
51b0c07e15SAndreas Gohr        $controller->register_hook('FORM_UPDATEPROFILE_OUTPUT', 'BEFORE', $this, 'handleProfileform');
5237d2401aSAnna Dabrowska        $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod');
5337d2401aSAnna Dabrowska    }
54b0c07e15SAndreas Gohr
5537d2401aSAnna Dabrowska    /**
5637d2401aSAnna Dabrowska     * Save groups for all the services a user has enabled
5737d2401aSAnna Dabrowska     *
58*290e9b1fSAndreas Gohr     * @param Event $event event object by reference
5937d2401aSAnna Dabrowska     * @return void
6037d2401aSAnna Dabrowska     */
61*290e9b1fSAndreas Gohr    public function handleUsermod(Event $event)
6237d2401aSAnna Dabrowska    {
6337d2401aSAnna Dabrowska        global $ACT;
6437d2401aSAnna Dabrowska        global $USERINFO;
6537d2401aSAnna Dabrowska        global $auth;
6637d2401aSAnna Dabrowska        global $INPUT;
6737d2401aSAnna Dabrowska
6837d2401aSAnna Dabrowska        if ($event->data['type'] != 'modify') return;
6937d2401aSAnna Dabrowska        if ($ACT != 'profile') return;
7037d2401aSAnna Dabrowska
7137d2401aSAnna Dabrowska        // we want to modify the user's groups
7237d2401aSAnna Dabrowska        $groups = $USERINFO['grps']; //current groups
7337d2401aSAnna Dabrowska        if (isset($event->data['params'][1]['grps'])) {
7437d2401aSAnna Dabrowska            // something already defined new groups
7537d2401aSAnna Dabrowska            $groups = $event->data['params'][1]['grps'];
7637d2401aSAnna Dabrowska        }
7737d2401aSAnna Dabrowska
7837d2401aSAnna Dabrowska        // get enabled and configured services
7937d2401aSAnna Dabrowska        $enabled = $INPUT->arr('oauth_group');
8037d2401aSAnna Dabrowska        $services = array_keys($this->hlp->listServices());
8137d2401aSAnna Dabrowska        $services = array_map([$auth, 'cleanGroup'], $services);
8237d2401aSAnna Dabrowska
8337d2401aSAnna Dabrowska        // add all enabled services as group, remove all disabled services
8437d2401aSAnna Dabrowska        foreach ($services as $service) {
8537d2401aSAnna Dabrowska            if (isset($enabled[$service])) {
8637d2401aSAnna Dabrowska                $groups[] = $service;
8737d2401aSAnna Dabrowska            } else {
8837d2401aSAnna Dabrowska                $idx = array_search($service, $groups);
8937d2401aSAnna Dabrowska                if ($idx !== false) unset($groups[$idx]);
9037d2401aSAnna Dabrowska            }
9137d2401aSAnna Dabrowska        }
9237d2401aSAnna Dabrowska        $groups = array_unique($groups);
9337d2401aSAnna Dabrowska
9437d2401aSAnna Dabrowska        // add new group array to event data
9537d2401aSAnna Dabrowska        $event->data['params'][1]['grps'] = $groups;
9637d2401aSAnna Dabrowska    }
9737d2401aSAnna Dabrowska
9837d2401aSAnna Dabrowska    /**
9937d2401aSAnna Dabrowska     * Add service selection to user profile
10037d2401aSAnna Dabrowska     *
101*290e9b1fSAndreas Gohr     * @param Event $event event object by reference
10237d2401aSAnna Dabrowska     * @return void
103b0c07e15SAndreas Gohr     * @deprecated
10437d2401aSAnna Dabrowska     */
105*290e9b1fSAndreas Gohr    public function handleOldProfileform(Event $event)
10637d2401aSAnna Dabrowska    {
10737d2401aSAnna Dabrowska        global $USERINFO;
10837d2401aSAnna Dabrowska        /** @var auth_plugin_authplain $auth */
10937d2401aSAnna Dabrowska        global $auth;
11037d2401aSAnna Dabrowska
11137d2401aSAnna Dabrowska        /** @var Doku_Form $form */
11237d2401aSAnna Dabrowska        $form = $event->data;
11337d2401aSAnna Dabrowska        $pos = $form->findElementByAttribute('type', 'submit');
11437d2401aSAnna Dabrowska
11537d2401aSAnna Dabrowska        $services = $this->hlp->listServices();
11637d2401aSAnna Dabrowska        if (!$services) return;
11737d2401aSAnna Dabrowska
11837d2401aSAnna Dabrowska        $form->insertElement($pos, form_closefieldset());
11937d2401aSAnna Dabrowska        $form->insertElement(
12037d2401aSAnna Dabrowska            ++$pos,
12137d2401aSAnna Dabrowska            form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth'])
12237d2401aSAnna Dabrowska        );
12337d2401aSAnna Dabrowska        foreach ($services as $service) {
12437d2401aSAnna Dabrowska            $group = $auth->cleanGroup($service->getServiceID());
12537d2401aSAnna Dabrowska            $elem = form_makeCheckboxField(
12637d2401aSAnna Dabrowska                'oauth_group[' . $group . ']',
127*290e9b1fSAndreas Gohr                1,
128*290e9b1fSAndreas Gohr                $service->getLabel(),
129*290e9b1fSAndreas Gohr                '',
130*290e9b1fSAndreas Gohr                'simple',
13137d2401aSAnna Dabrowska                [
13237d2401aSAnna Dabrowska                    'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '',
13337d2401aSAnna Dabrowska                ]
13437d2401aSAnna Dabrowska            );
13537d2401aSAnna Dabrowska
13637d2401aSAnna Dabrowska            $form->insertElement(++$pos, $elem);
13737d2401aSAnna Dabrowska        }
13837d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_closefieldset());
13937d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_openfieldset([]));
14037d2401aSAnna Dabrowska    }
141b0c07e15SAndreas Gohr
142b0c07e15SAndreas Gohr    /**
143b0c07e15SAndreas Gohr     * Add service selection to user profile
144b0c07e15SAndreas Gohr     *
145*290e9b1fSAndreas Gohr     * @param Event $event event object by reference
146b0c07e15SAndreas Gohr     * @return void
147b0c07e15SAndreas Gohr     */
148*290e9b1fSAndreas Gohr    public function handleProfileform(Event $event)
149b0c07e15SAndreas Gohr    {
150b0c07e15SAndreas Gohr        global $USERINFO;
151b0c07e15SAndreas Gohr        /** @var auth_plugin_authplain $auth */
152b0c07e15SAndreas Gohr        global $auth;
153b0c07e15SAndreas Gohr
154b0c07e15SAndreas Gohr        /** @var Form $form */
155b0c07e15SAndreas Gohr        $form = $event->data;
156b0c07e15SAndreas Gohr        $pos = $form->findPositionByAttribute('type', 'submit');
157b0c07e15SAndreas Gohr
158b0c07e15SAndreas Gohr        $services = $this->hlp->listServices();
159b0c07e15SAndreas Gohr        if (!$services) return;
160b0c07e15SAndreas Gohr
161b0c07e15SAndreas Gohr        $form->addFieldsetOpen($this->getLang('loginwith'), $pos)->addClass('plugin_oauth');
162b0c07e15SAndreas Gohr
163b0c07e15SAndreas Gohr        foreach ($services as $service) {
164b0c07e15SAndreas Gohr            $group = $auth->cleanGroup($service->getServiceID());
165b0c07e15SAndreas Gohr            $cb = $form->addCheckbox(
166b0c07e15SAndreas Gohr                'oauth_group[' . $group . ']',
16704a78b87SAndreas Gohr                $service->getLabel(),
168b0c07e15SAndreas Gohr                ++$pos
169b0c07e15SAndreas Gohr            );
170b0c07e15SAndreas Gohr            if (in_array($group, $USERINFO['grps'])) {
171b0c07e15SAndreas Gohr                $cb->attr('checked', 'checked');
172b0c07e15SAndreas Gohr            }
173b0c07e15SAndreas Gohr        }
174b0c07e15SAndreas Gohr        $form->addFieldsetClose(++$pos);
175b0c07e15SAndreas Gohr    }
17637d2401aSAnna Dabrowska}
177