xref: /plugin/oauth/action/user.php (revision 37d2401af36bcd0808d771338cb0144d66312030) !
1*37d2401aSAnna Dabrowska<?php
2*37d2401aSAnna Dabrowska
3*37d2401aSAnna Dabrowska/**
4*37d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component)
5*37d2401aSAnna Dabrowska *
6*37d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7*37d2401aSAnna Dabrowska * @author  Andreas Gohr <andi@splitbrain.org>
8*37d2401aSAnna Dabrowska */
9*37d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin
10*37d2401aSAnna Dabrowska{
11*37d2401aSAnna Dabrowska    /** @var helper_plugin_oauth */
12*37d2401aSAnna Dabrowska    protected $hlp;
13*37d2401aSAnna Dabrowska
14*37d2401aSAnna Dabrowska    /**
15*37d2401aSAnna Dabrowska     * Constructor
16*37d2401aSAnna Dabrowska     *
17*37d2401aSAnna Dabrowska     * Initializes the helper
18*37d2401aSAnna Dabrowska     */
19*37d2401aSAnna Dabrowska    public function __construct()
20*37d2401aSAnna Dabrowska    {
21*37d2401aSAnna Dabrowska        $this->hlp = plugin_load('helper', 'oauth');
22*37d2401aSAnna Dabrowska    }
23*37d2401aSAnna Dabrowska
24*37d2401aSAnna Dabrowska    /**
25*37d2401aSAnna Dabrowska     * Registers a callback function for a given event
26*37d2401aSAnna Dabrowska     *
27*37d2401aSAnna Dabrowska     * @param Doku_Event_Handler $controller DokuWiki's event controller object
28*37d2401aSAnna Dabrowska     * @return void
29*37d2401aSAnna Dabrowska     */
30*37d2401aSAnna Dabrowska    public function register(Doku_Event_Handler $controller)
31*37d2401aSAnna Dabrowska    {
32*37d2401aSAnna Dabrowska        global $conf;
33*37d2401aSAnna Dabrowska        if ($conf['authtype'] != 'oauth') return;
34*37d2401aSAnna Dabrowska
35*37d2401aSAnna Dabrowska        $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users
36*37d2401aSAnna Dabrowska
37*37d2401aSAnna Dabrowska        $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handleProfileform');
38*37d2401aSAnna Dabrowska        $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod');
39*37d2401aSAnna Dabrowska    }
40*37d2401aSAnna Dabrowska    /**
41*37d2401aSAnna Dabrowska     * Save groups for all the services a user has enabled
42*37d2401aSAnna Dabrowska     *
43*37d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
44*37d2401aSAnna Dabrowska     * @return void
45*37d2401aSAnna Dabrowska     */
46*37d2401aSAnna Dabrowska    public function handleUsermod(Doku_Event $event)
47*37d2401aSAnna Dabrowska    {
48*37d2401aSAnna Dabrowska        global $ACT;
49*37d2401aSAnna Dabrowska        global $USERINFO;
50*37d2401aSAnna Dabrowska        global $auth;
51*37d2401aSAnna Dabrowska        global $INPUT;
52*37d2401aSAnna Dabrowska
53*37d2401aSAnna Dabrowska        if ($event->data['type'] != 'modify') return;
54*37d2401aSAnna Dabrowska        if ($ACT != 'profile') return;
55*37d2401aSAnna Dabrowska
56*37d2401aSAnna Dabrowska        // we want to modify the user's groups
57*37d2401aSAnna Dabrowska        $groups = $USERINFO['grps']; //current groups
58*37d2401aSAnna Dabrowska        if (isset($event->data['params'][1]['grps'])) {
59*37d2401aSAnna Dabrowska            // something already defined new groups
60*37d2401aSAnna Dabrowska            $groups = $event->data['params'][1]['grps'];
61*37d2401aSAnna Dabrowska        }
62*37d2401aSAnna Dabrowska
63*37d2401aSAnna Dabrowska        // get enabled and configured services
64*37d2401aSAnna Dabrowska        $enabled = $INPUT->arr('oauth_group');
65*37d2401aSAnna Dabrowska        $services = array_keys($this->hlp->listServices());
66*37d2401aSAnna Dabrowska        $services = array_map([$auth, 'cleanGroup'], $services);
67*37d2401aSAnna Dabrowska
68*37d2401aSAnna Dabrowska        // add all enabled services as group, remove all disabled services
69*37d2401aSAnna Dabrowska        foreach ($services as $service) {
70*37d2401aSAnna Dabrowska            if (isset($enabled[$service])) {
71*37d2401aSAnna Dabrowska                $groups[] = $service;
72*37d2401aSAnna Dabrowska            } else {
73*37d2401aSAnna Dabrowska                $idx = array_search($service, $groups);
74*37d2401aSAnna Dabrowska                if ($idx !== false) unset($groups[$idx]);
75*37d2401aSAnna Dabrowska            }
76*37d2401aSAnna Dabrowska        }
77*37d2401aSAnna Dabrowska        $groups = array_unique($groups);
78*37d2401aSAnna Dabrowska
79*37d2401aSAnna Dabrowska        // add new group array to event data
80*37d2401aSAnna Dabrowska        $event->data['params'][1]['grps'] = $groups;
81*37d2401aSAnna Dabrowska    }
82*37d2401aSAnna Dabrowska
83*37d2401aSAnna Dabrowska    /**
84*37d2401aSAnna Dabrowska     * Add service selection to user profile
85*37d2401aSAnna Dabrowska     *
86*37d2401aSAnna Dabrowska     * @param Doku_Event $event event object by reference
87*37d2401aSAnna Dabrowska     * @return void
88*37d2401aSAnna Dabrowska     */
89*37d2401aSAnna Dabrowska    public function handleProfileform(Doku_Event $event)
90*37d2401aSAnna Dabrowska    {
91*37d2401aSAnna Dabrowska        global $USERINFO;
92*37d2401aSAnna Dabrowska        /** @var auth_plugin_authplain $auth */
93*37d2401aSAnna Dabrowska        global $auth;
94*37d2401aSAnna Dabrowska
95*37d2401aSAnna Dabrowska        /** @var Doku_Form $form */
96*37d2401aSAnna Dabrowska        $form = $event->data;
97*37d2401aSAnna Dabrowska        $pos = $form->findElementByAttribute('type', 'submit');
98*37d2401aSAnna Dabrowska
99*37d2401aSAnna Dabrowska        $services = $this->hlp->listServices();
100*37d2401aSAnna Dabrowska        if (!$services) return;
101*37d2401aSAnna Dabrowska
102*37d2401aSAnna Dabrowska        $form->insertElement($pos, form_closefieldset());
103*37d2401aSAnna Dabrowska        $form->insertElement(
104*37d2401aSAnna Dabrowska            ++$pos,
105*37d2401aSAnna Dabrowska            form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth'])
106*37d2401aSAnna Dabrowska        );
107*37d2401aSAnna Dabrowska        foreach ($services as $service) {
108*37d2401aSAnna Dabrowska            $group = $auth->cleanGroup($service->getServiceID());
109*37d2401aSAnna Dabrowska            $elem = form_makeCheckboxField(
110*37d2401aSAnna Dabrowska                'oauth_group[' . $group . ']',
111*37d2401aSAnna Dabrowska                1, $service->getServiceLabel(), '', 'simple',
112*37d2401aSAnna Dabrowska                [
113*37d2401aSAnna Dabrowska                    'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '',
114*37d2401aSAnna Dabrowska                ]
115*37d2401aSAnna Dabrowska            );
116*37d2401aSAnna Dabrowska
117*37d2401aSAnna Dabrowska            $form->insertElement(++$pos, $elem);
118*37d2401aSAnna Dabrowska        }
119*37d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_closefieldset());
120*37d2401aSAnna Dabrowska        $form->insertElement(++$pos, form_openfieldset([]));
121*37d2401aSAnna Dabrowska    }
122*37d2401aSAnna Dabrowska}
123