xref: /plugin/oauth/action/user.php (revision 74b4d4a4cf1d79813740d8ba18696e5fb2b4089b)
137d2401aSAnna Dabrowska<?php
237d2401aSAnna Dabrowska
337d2401aSAnna Dabrowska/**
437d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component)
537d2401aSAnna Dabrowska *
6*74b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups.
7*74b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services.
8*74b4d4a4SAndreas Gohr *
937d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
1037d2401aSAnna Dabrowska * @author  Andreas Gohr <andi@splitbrain.org>
1137d2401aSAnna Dabrowska */
1237d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin
1337d2401aSAnna Dabrowska{
1437d2401aSAnna Dabrowska    /** @var helper_plugin_oauth */
1537d2401aSAnna Dabrowska    protected $hlp;
1637d2401aSAnna Dabrowska
1737d2401aSAnna Dabrowska    /**
1837d2401aSAnna Dabrowska     * Constructor
1937d2401aSAnna Dabrowska     *
2037d2401aSAnna Dabrowska     * Initializes the helper
2137d2401aSAnna Dabrowska     */
2237d2401aSAnna Dabrowska    public function __construct()
2337d2401aSAnna Dabrowska    {
2437d2401aSAnna Dabrowska        $this->hlp = plugin_load('helper', 'oauth');
2537d2401aSAnna Dabrowska    }
2637d2401aSAnna Dabrowska
2737d2401aSAnna Dabrowska    /**
2837d2401aSAnna Dabrowska     * Registers a callback function for a given event
2937d2401aSAnna Dabrowska     *
3037d2401aSAnna Dabrowska     * @param Doku_Event_Handler $controller DokuWiki's event controller object
3137d2401aSAnna Dabrowska     * @return void
3237d2401aSAnna Dabrowska     */
3337d2401aSAnna Dabrowska    public function register(Doku_Event_Handler $controller)
3437d2401aSAnna Dabrowska    {
3537d2401aSAnna Dabrowska        global $conf;
3637d2401aSAnna Dabrowska        if ($conf['authtype'] != 'oauth') return;
3737d2401aSAnna Dabrowska
3837d2401aSAnna Dabrowska        $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users
3937d2401aSAnna Dabrowska
4037d2401aSAnna Dabrowska        $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handleProfileform');
4137d2401aSAnna Dabrowska        $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod');
4237d2401aSAnna Dabrowska    }
4337d2401aSAnna Dabrowska    /**
4437d2401aSAnna Dabrowska     * Save groups for all the services a user has enabled
4537d2401aSAnna Dabrowska     *
4637d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
4737d2401aSAnna Dabrowska     * @return void
4837d2401aSAnna Dabrowska     */
4937d2401aSAnna Dabrowska    public function handleUsermod(Doku_Event $event)
5037d2401aSAnna Dabrowska    {
5137d2401aSAnna Dabrowska        global $ACT;
5237d2401aSAnna Dabrowska        global $USERINFO;
5337d2401aSAnna Dabrowska        global $auth;
5437d2401aSAnna Dabrowska        global $INPUT;
5537d2401aSAnna Dabrowska
5637d2401aSAnna Dabrowska        if ($event->data['type'] != 'modify') return;
5737d2401aSAnna Dabrowska        if ($ACT != 'profile') return;
5837d2401aSAnna Dabrowska
5937d2401aSAnna Dabrowska        // we want to modify the user's groups
6037d2401aSAnna Dabrowska        $groups = $USERINFO['grps']; //current groups
6137d2401aSAnna Dabrowska        if (isset($event->data['params'][1]['grps'])) {
6237d2401aSAnna Dabrowska            // something already defined new groups
6337d2401aSAnna Dabrowska            $groups = $event->data['params'][1]['grps'];
6437d2401aSAnna Dabrowska        }
6537d2401aSAnna Dabrowska
6637d2401aSAnna Dabrowska        // get enabled and configured services
6737d2401aSAnna Dabrowska        $enabled = $INPUT->arr('oauth_group');
6837d2401aSAnna Dabrowska        $services = array_keys($this->hlp->listServices());
6937d2401aSAnna Dabrowska        $services = array_map([$auth, 'cleanGroup'], $services);
7037d2401aSAnna Dabrowska
7137d2401aSAnna Dabrowska        // add all enabled services as group, remove all disabled services
7237d2401aSAnna Dabrowska        foreach ($services as $service) {
7337d2401aSAnna Dabrowska            if (isset($enabled[$service])) {
7437d2401aSAnna Dabrowska                $groups[] = $service;
7537d2401aSAnna Dabrowska            } else {
7637d2401aSAnna Dabrowska                $idx = array_search($service, $groups);
7737d2401aSAnna Dabrowska                if ($idx !== false) unset($groups[$idx]);
7837d2401aSAnna Dabrowska            }
7937d2401aSAnna Dabrowska        }
8037d2401aSAnna Dabrowska        $groups = array_unique($groups);
8137d2401aSAnna Dabrowska
8237d2401aSAnna Dabrowska        // add new group array to event data
8337d2401aSAnna Dabrowska        $event->data['params'][1]['grps'] = $groups;
8437d2401aSAnna Dabrowska    }
8537d2401aSAnna Dabrowska
8637d2401aSAnna Dabrowska    /**
8737d2401aSAnna Dabrowska     * Add service selection to user profile
8837d2401aSAnna Dabrowska     *
8937d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
9037d2401aSAnna Dabrowska     * @return void
9137d2401aSAnna Dabrowska     */
9237d2401aSAnna Dabrowska    public function handleProfileform(Doku_Event $event)
9337d2401aSAnna Dabrowska    {
9437d2401aSAnna Dabrowska        global $USERINFO;
9537d2401aSAnna Dabrowska        /** @var auth_plugin_authplain $auth */
9637d2401aSAnna Dabrowska        global $auth;
9737d2401aSAnna Dabrowska
9837d2401aSAnna Dabrowska        /** @var Doku_Form $form */
9937d2401aSAnna Dabrowska        $form = $event->data;
10037d2401aSAnna Dabrowska        $pos = $form->findElementByAttribute('type', 'submit');
10137d2401aSAnna Dabrowska
10237d2401aSAnna Dabrowska        $services = $this->hlp->listServices();
10337d2401aSAnna Dabrowska        if (!$services) return;
10437d2401aSAnna Dabrowska
10537d2401aSAnna Dabrowska        $form->insertElement($pos, form_closefieldset());
10637d2401aSAnna Dabrowska        $form->insertElement(
10737d2401aSAnna Dabrowska            ++$pos,
10837d2401aSAnna Dabrowska            form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth'])
10937d2401aSAnna Dabrowska        );
11037d2401aSAnna Dabrowska        foreach ($services as $service) {
11137d2401aSAnna Dabrowska            $group = $auth->cleanGroup($service->getServiceID());
11237d2401aSAnna Dabrowska            $elem = form_makeCheckboxField(
11337d2401aSAnna Dabrowska                'oauth_group[' . $group . ']',
11437d2401aSAnna Dabrowska                1, $service->getServiceLabel(), '', 'simple',
11537d2401aSAnna Dabrowska                [
11637d2401aSAnna Dabrowska                    'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '',
11737d2401aSAnna Dabrowska                ]
11837d2401aSAnna Dabrowska            );
11937d2401aSAnna Dabrowska
12037d2401aSAnna Dabrowska            $form->insertElement(++$pos, $elem);
12137d2401aSAnna Dabrowska        }
12237d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_closefieldset());
12337d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_openfieldset([]));
12437d2401aSAnna Dabrowska    }
12537d2401aSAnna Dabrowska}
126