xref: /plugin/oauth/action/user.php (revision b0c07e1504f8b294d481d0effb467ef2726794a5)
137d2401aSAnna Dabrowska<?php
237d2401aSAnna Dabrowska
3*b0c07e15SAndreas Gohruse dokuwiki\Form\Form;
4*b0c07e15SAndreas Gohr
537d2401aSAnna Dabrowska/**
637d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component)
737d2401aSAnna Dabrowska *
874b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups.
974b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services.
1074b4d4a4SAndreas Gohr *
1137d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
1237d2401aSAnna Dabrowska * @author  Andreas Gohr <andi@splitbrain.org>
1337d2401aSAnna Dabrowska */
1437d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin
1537d2401aSAnna Dabrowska{
1637d2401aSAnna Dabrowska    /** @var helper_plugin_oauth */
1737d2401aSAnna Dabrowska    protected $hlp;
1837d2401aSAnna Dabrowska
1937d2401aSAnna Dabrowska    /**
2037d2401aSAnna Dabrowska     * Constructor
2137d2401aSAnna Dabrowska     *
2237d2401aSAnna Dabrowska     * Initializes the helper
2337d2401aSAnna Dabrowska     */
2437d2401aSAnna Dabrowska    public function __construct()
2537d2401aSAnna Dabrowska    {
2637d2401aSAnna Dabrowska        $this->hlp = plugin_load('helper', 'oauth');
2737d2401aSAnna Dabrowska    }
2837d2401aSAnna Dabrowska
2937d2401aSAnna Dabrowska    /**
3037d2401aSAnna Dabrowska     * Registers a callback function for a given event
3137d2401aSAnna Dabrowska     *
3237d2401aSAnna Dabrowska     * @param Doku_Event_Handler $controller DokuWiki's event controller object
3337d2401aSAnna Dabrowska     * @return void
3437d2401aSAnna Dabrowska     */
3537d2401aSAnna Dabrowska    public function register(Doku_Event_Handler $controller)
3637d2401aSAnna Dabrowska    {
3737d2401aSAnna Dabrowska        global $conf;
3837d2401aSAnna Dabrowska        if ($conf['authtype'] != 'oauth') return;
3937d2401aSAnna Dabrowska
4037d2401aSAnna Dabrowska        $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users
4137d2401aSAnna Dabrowska
42*b0c07e15SAndreas Gohr        $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this,
43*b0c07e15SAndreas Gohr            'handleOldProfileform'); // deprecated
44*b0c07e15SAndreas Gohr        $controller->register_hook('FORM_UPDATEPROFILE_OUTPUT', 'BEFORE', $this, 'handleProfileform');
4537d2401aSAnna Dabrowska        $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod');
4637d2401aSAnna Dabrowska    }
47*b0c07e15SAndreas Gohr
4837d2401aSAnna Dabrowska    /**
4937d2401aSAnna Dabrowska     * Save groups for all the services a user has enabled
5037d2401aSAnna Dabrowska     *
5137d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
5237d2401aSAnna Dabrowska     * @return void
5337d2401aSAnna Dabrowska     */
5437d2401aSAnna Dabrowska    public function handleUsermod(Doku_Event $event)
5537d2401aSAnna Dabrowska    {
5637d2401aSAnna Dabrowska        global $ACT;
5737d2401aSAnna Dabrowska        global $USERINFO;
5837d2401aSAnna Dabrowska        global $auth;
5937d2401aSAnna Dabrowska        global $INPUT;
6037d2401aSAnna Dabrowska
6137d2401aSAnna Dabrowska        if ($event->data['type'] != 'modify') return;
6237d2401aSAnna Dabrowska        if ($ACT != 'profile') return;
6337d2401aSAnna Dabrowska
6437d2401aSAnna Dabrowska        // we want to modify the user's groups
6537d2401aSAnna Dabrowska        $groups = $USERINFO['grps']; //current groups
6637d2401aSAnna Dabrowska        if (isset($event->data['params'][1]['grps'])) {
6737d2401aSAnna Dabrowska            // something already defined new groups
6837d2401aSAnna Dabrowska            $groups = $event->data['params'][1]['grps'];
6937d2401aSAnna Dabrowska        }
7037d2401aSAnna Dabrowska
7137d2401aSAnna Dabrowska        // get enabled and configured services
7237d2401aSAnna Dabrowska        $enabled = $INPUT->arr('oauth_group');
7337d2401aSAnna Dabrowska        $services = array_keys($this->hlp->listServices());
7437d2401aSAnna Dabrowska        $services = array_map([$auth, 'cleanGroup'], $services);
7537d2401aSAnna Dabrowska
7637d2401aSAnna Dabrowska        // add all enabled services as group, remove all disabled services
7737d2401aSAnna Dabrowska        foreach ($services as $service) {
7837d2401aSAnna Dabrowska            if (isset($enabled[$service])) {
7937d2401aSAnna Dabrowska                $groups[] = $service;
8037d2401aSAnna Dabrowska            } else {
8137d2401aSAnna Dabrowska                $idx = array_search($service, $groups);
8237d2401aSAnna Dabrowska                if ($idx !== false) unset($groups[$idx]);
8337d2401aSAnna Dabrowska            }
8437d2401aSAnna Dabrowska        }
8537d2401aSAnna Dabrowska        $groups = array_unique($groups);
8637d2401aSAnna Dabrowska
8737d2401aSAnna Dabrowska        // add new group array to event data
8837d2401aSAnna Dabrowska        $event->data['params'][1]['grps'] = $groups;
8937d2401aSAnna Dabrowska    }
9037d2401aSAnna Dabrowska
9137d2401aSAnna Dabrowska    /**
9237d2401aSAnna Dabrowska     * Add service selection to user profile
9337d2401aSAnna Dabrowska     *
9437d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
9537d2401aSAnna Dabrowska     * @return void
96*b0c07e15SAndreas Gohr     * @deprecated
9737d2401aSAnna Dabrowska     */
98*b0c07e15SAndreas Gohr    public function handleOldProfileform(Doku_Event $event)
9937d2401aSAnna Dabrowska    {
10037d2401aSAnna Dabrowska        global $USERINFO;
10137d2401aSAnna Dabrowska        /** @var auth_plugin_authplain $auth */
10237d2401aSAnna Dabrowska        global $auth;
10337d2401aSAnna Dabrowska
10437d2401aSAnna Dabrowska        /** @var Doku_Form $form */
10537d2401aSAnna Dabrowska        $form = $event->data;
10637d2401aSAnna Dabrowska        $pos = $form->findElementByAttribute('type', 'submit');
10737d2401aSAnna Dabrowska
10837d2401aSAnna Dabrowska        $services = $this->hlp->listServices();
10937d2401aSAnna Dabrowska        if (!$services) return;
11037d2401aSAnna Dabrowska
11137d2401aSAnna Dabrowska        $form->insertElement($pos, form_closefieldset());
11237d2401aSAnna Dabrowska        $form->insertElement(
11337d2401aSAnna Dabrowska            ++$pos,
11437d2401aSAnna Dabrowska            form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth'])
11537d2401aSAnna Dabrowska        );
11637d2401aSAnna Dabrowska        foreach ($services as $service) {
11737d2401aSAnna Dabrowska            $group = $auth->cleanGroup($service->getServiceID());
11837d2401aSAnna Dabrowska            $elem = form_makeCheckboxField(
11937d2401aSAnna Dabrowska                'oauth_group[' . $group . ']',
12037d2401aSAnna Dabrowska                1, $service->getServiceLabel(), '', 'simple',
12137d2401aSAnna Dabrowska                [
12237d2401aSAnna Dabrowska                    'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '',
12337d2401aSAnna Dabrowska                ]
12437d2401aSAnna Dabrowska            );
12537d2401aSAnna Dabrowska
12637d2401aSAnna Dabrowska            $form->insertElement(++$pos, $elem);
12737d2401aSAnna Dabrowska        }
12837d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_closefieldset());
12937d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_openfieldset([]));
13037d2401aSAnna Dabrowska    }
131*b0c07e15SAndreas Gohr
132*b0c07e15SAndreas Gohr    /**
133*b0c07e15SAndreas Gohr     * Add service selection to user profile
134*b0c07e15SAndreas Gohr     *
135*b0c07e15SAndreas Gohr     * @param Doku_Event $event event object by reference
136*b0c07e15SAndreas Gohr     * @return void
137*b0c07e15SAndreas Gohr     */
138*b0c07e15SAndreas Gohr    public function handleProfileform(Doku_Event $event)
139*b0c07e15SAndreas Gohr    {
140*b0c07e15SAndreas Gohr        global $USERINFO;
141*b0c07e15SAndreas Gohr        /** @var auth_plugin_authplain $auth */
142*b0c07e15SAndreas Gohr        global $auth;
143*b0c07e15SAndreas Gohr
144*b0c07e15SAndreas Gohr        /** @var Form $form */
145*b0c07e15SAndreas Gohr        $form = $event->data;
146*b0c07e15SAndreas Gohr        $pos = $form->findPositionByAttribute('type', 'submit');
147*b0c07e15SAndreas Gohr
148*b0c07e15SAndreas Gohr        $services = $this->hlp->listServices();
149*b0c07e15SAndreas Gohr        if (!$services) return;
150*b0c07e15SAndreas Gohr
151*b0c07e15SAndreas Gohr        $form->addFieldsetOpen($this->getLang('loginwith'), $pos)->addClass('plugin_oauth');
152*b0c07e15SAndreas Gohr
153*b0c07e15SAndreas Gohr        foreach ($services as $service) {
154*b0c07e15SAndreas Gohr            $group = $auth->cleanGroup($service->getServiceID());
155*b0c07e15SAndreas Gohr            $cb = $form->addCheckbox(
156*b0c07e15SAndreas Gohr                'oauth_group[' . $group . ']',
157*b0c07e15SAndreas Gohr                $service->getServiceLabel(),
158*b0c07e15SAndreas Gohr                ++$pos
159*b0c07e15SAndreas Gohr            );
160*b0c07e15SAndreas Gohr            if (in_array($group, $USERINFO['grps'])) {
161*b0c07e15SAndreas Gohr                $cb->attr('checked', 'checked');
162*b0c07e15SAndreas Gohr            }
163*b0c07e15SAndreas Gohr        }
164*b0c07e15SAndreas Gohr        $form->addFieldsetClose(++$pos);
165*b0c07e15SAndreas Gohr    }
16637d2401aSAnna Dabrowska}
167