xref: /dokuwiki/lib/plugins/authad/action.php (revision 8549e2b519f181de69658086844cce6cb4f0bc5c)
1741b8a48SAndreas Gohr<?php
2741b8a48SAndreas Gohr/**
3741b8a48SAndreas Gohr * DokuWiki Plugin addomain (Action Component)
4741b8a48SAndreas Gohr *
5741b8a48SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6741b8a48SAndreas Gohr * @author  Andreas Gohr <gohr@cosmocode.de>
7741b8a48SAndreas Gohr */
8741b8a48SAndreas Gohr
9741b8a48SAndreas Gohr/**
10741b8a48SAndreas Gohr * Class action_plugin_addomain
11741b8a48SAndreas Gohr */
12a4337320SAndreas Gohrclass action_plugin_authad extends DokuWiki_Action_Plugin
13a4337320SAndreas Gohr{
14741b8a48SAndreas Gohr
15741b8a48SAndreas Gohr    /**
16741b8a48SAndreas Gohr     * Registers a callback function for a given event
17741b8a48SAndreas Gohr     */
18a4337320SAndreas Gohr    public function register(Doku_Event_Handler $controller)
19a4337320SAndreas Gohr    {
20741b8a48SAndreas Gohr
21a4337320SAndreas Gohr        $controller->register_hook('AUTH_LOGIN_CHECK', 'BEFORE', $this, 'handleAuthLoginCheck');
22a4337320SAndreas Gohr        $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'handleHtmlLoginformOutput');
23741b8a48SAndreas Gohr    }
24741b8a48SAndreas Gohr
25741b8a48SAndreas Gohr    /**
26741b8a48SAndreas Gohr     * Adds the selected domain as user postfix when attempting a login
27741b8a48SAndreas Gohr     *
28741b8a48SAndreas Gohr     * @param Doku_Event $event
29741b8a48SAndreas Gohr     * @param array      $param
30741b8a48SAndreas Gohr     */
31a4337320SAndreas Gohr    public function handleAuthLoginCheck(Doku_Event $event, $param)
32a4337320SAndreas Gohr    {
33741b8a48SAndreas Gohr        global $INPUT;
34741b8a48SAndreas Gohr
35741b8a48SAndreas Gohr        /** @var auth_plugin_authad $auth */
36741b8a48SAndreas Gohr        global $auth;
37741b8a48SAndreas Gohr        if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
38741b8a48SAndreas Gohr
39741b8a48SAndreas Gohr        if ($INPUT->str('dom')) {
40741b8a48SAndreas Gohr            $usr = $auth->cleanUser($event->data['user']);
41a4337320SAndreas Gohr            $dom = $auth->getUserDomain($usr);
42741b8a48SAndreas Gohr            if (!$dom) {
43741b8a48SAndreas Gohr                $usr = "$usr@".$INPUT->str('dom');
44741b8a48SAndreas Gohr            }
45741b8a48SAndreas Gohr            $INPUT->post->set('u', $usr);
46741b8a48SAndreas Gohr            $event->data['user'] = $usr;
47741b8a48SAndreas Gohr        }
48741b8a48SAndreas Gohr    }
49741b8a48SAndreas Gohr
50741b8a48SAndreas Gohr    /**
51741b8a48SAndreas Gohr     * Shows a domain selection in the login form when more than one domain is configured
52741b8a48SAndreas Gohr     *
53741b8a48SAndreas Gohr     * @param Doku_Event $event
54741b8a48SAndreas Gohr     * @param array      $param
55741b8a48SAndreas Gohr     */
56a4337320SAndreas Gohr    public function handleHtmlLoginformOutput(Doku_Event $event, $param)
57a4337320SAndreas Gohr    {
58741b8a48SAndreas Gohr        global $INPUT;
59741b8a48SAndreas Gohr        /** @var auth_plugin_authad $auth */
60741b8a48SAndreas Gohr        global $auth;
61741b8a48SAndreas Gohr        if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
62a4337320SAndreas Gohr        $domains = $auth->getConfiguredDomains();
63741b8a48SAndreas Gohr        if (count($domains) <= 1) return; // no choice at all
64741b8a48SAndreas Gohr
65741b8a48SAndreas Gohr        /** @var Doku_Form $form */
66741b8a48SAndreas Gohr        $form =& $event->data;
67741b8a48SAndreas Gohr
68741b8a48SAndreas Gohr        // any default?
69741b8a48SAndreas Gohr        $dom = '';
70741b8a48SAndreas Gohr        if ($INPUT->has('u')) {
71741b8a48SAndreas Gohr            $usr = $auth->cleanUser($INPUT->str('u'));
72a4337320SAndreas Gohr            $dom = $auth->getUserDomain($usr);
73741b8a48SAndreas Gohr
74741b8a48SAndreas Gohr            // update user field value
75741b8a48SAndreas Gohr            if ($dom) {
76a4337320SAndreas Gohr                $usr = $auth->getUserName($usr);
77*8549e2b5SSatoshi Sahara                if (is_a($form, 'dokuwiki\Form\Form')) {
78*8549e2b5SSatoshi Sahara                    if (($pos = $form->findPositionByAttribute('name', 'u')) !== false) {
79*8549e2b5SSatoshi Sahara                        $element = $form->getElementAt($pos);
80*8549e2b5SSatoshi Sahara                        $element->val($usr);
81*8549e2b5SSatoshi Sahara                    } else {
82*8549e2b5SSatoshi Sahara                        return;
83*8549e2b5SSatoshi Sahara                    }
84*8549e2b5SSatoshi Sahara                } else {
85741b8a48SAndreas Gohr                    $pos = $form->findElementByAttribute('name', 'u');
86741b8a48SAndreas Gohr                    $ele =& $form->getElementAt($pos);
87741b8a48SAndreas Gohr                    $ele['value'] = $usr;
88741b8a48SAndreas Gohr                }
89741b8a48SAndreas Gohr            }
90*8549e2b5SSatoshi Sahara        }
91741b8a48SAndreas Gohr
92741b8a48SAndreas Gohr        // add select box
93*8549e2b5SSatoshi Sahara        if (is_a($form, 'dokuwiki\Form\Form')) {
94*8549e2b5SSatoshi Sahara            $element = new \dokuwiki\Form\DropdownElement('dom', $domains, $this->getLang('domain'));
95*8549e2b5SSatoshi Sahara            $element->addClass('block');
96*8549e2b5SSatoshi Sahara            // locate domain selector just after the username input box
97*8549e2b5SSatoshi Sahara            $form->addElement($element, $pos +1);
98*8549e2b5SSatoshi Sahara        } else {
99741b8a48SAndreas Gohr            $element = form_makeListboxField('dom', $domains, $dom, $this->getLang('domain'), '', 'block');
100741b8a48SAndreas Gohr            $pos = $form->findElementByAttribute('name', 'p');
101741b8a48SAndreas Gohr            $form->insertElement($pos + 1, $element);
102741b8a48SAndreas Gohr        }
103741b8a48SAndreas Gohr    }
104*8549e2b5SSatoshi Sahara}
105741b8a48SAndreas Gohr
106741b8a48SAndreas Gohr// vim:ts=4:sw=4:et:
107