xref: /template/strap/action/login.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1a6bf47aaSNickeau<?php
2a6bf47aaSNickeau/**
3a6bf47aaSNickeau * Action Component
4a6bf47aaSNickeau * Add a button in the edit toolbar
5a6bf47aaSNickeau *
6a6bf47aaSNickeau * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7a6bf47aaSNickeau * @author     Nicolas GERARD
8a6bf47aaSNickeau */
9a6bf47aaSNickeau
10a6bf47aaSNickeauuse ComboStrap\Identity;
11a6bf47aaSNickeauuse ComboStrap\LogUtility;
12a6bf47aaSNickeauuse ComboStrap\PluginUtility;
13a6bf47aaSNickeauuse ComboStrap\Snippet;
14a6bf47aaSNickeauuse dokuwiki\Menu\Item\Login;
15a6bf47aaSNickeau
16a6bf47aaSNickeauif (!defined('DOKU_INC')) die();
1737748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
18a6bf47aaSNickeau
19a6bf47aaSNickeau/**
20a6bf47aaSNickeau * Class action_plugin_combo_login
21a6bf47aaSNickeau *
22a6bf47aaSNickeau * $conf['rememberme']
23a6bf47aaSNickeau */
24a6bf47aaSNickeauclass action_plugin_combo_login extends DokuWiki_Action_Plugin
25a6bf47aaSNickeau{
26a6bf47aaSNickeau
27a6bf47aaSNickeau
28a6bf47aaSNickeau    const CANONICAL = Identity::CANONICAL;
29a6bf47aaSNickeau    const TAG = "login";
30a6bf47aaSNickeau    const FORM_LOGIN_CLASS = "form-" . self::TAG;
31a6bf47aaSNickeau
32a6bf47aaSNickeau    const CONF_ENABLE_LOGIN_FORM = "enableLoginForm";
33a6bf47aaSNickeau
34a6bf47aaSNickeau
35a6bf47aaSNickeau    function register(Doku_Event_Handler $controller)
36a6bf47aaSNickeau    {
37a6bf47aaSNickeau        /**
38a6bf47aaSNickeau         * To modify the form and add class
39a6bf47aaSNickeau         *
40a6bf47aaSNickeau         * Deprecated object passed by the event but still in use
41a6bf47aaSNickeau         * https://www.dokuwiki.org/devel:event:html_loginform_output
42a6bf47aaSNickeau         */
43a6bf47aaSNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_LOGIN_FORM, 1)) {
44a6bf47aaSNickeau            $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'handle_login_html', array());
45a6bf47aaSNickeau        }
46a6bf47aaSNickeau
47a6bf47aaSNickeau        /**
48a6bf47aaSNickeau         * Event using the new object but only in use in
49a6bf47aaSNickeau         * the {@link https://codesearch.dokuwiki.org/xref/dokuwiki/lib/plugins/authad/action.php authad plugin}
50a6bf47aaSNickeau         * (ie login against active directory)
51a6bf47aaSNickeau         *
52a6bf47aaSNickeau         * https://www.dokuwiki.org/devel:event:form_login_output
53a6bf47aaSNickeau         */
54*c3437056SNickeau        //$controller->register_hook('FORM_LOGIN_OUTPUT', 'BEFORE', $this, 'handle_login_html_new', array());
55a6bf47aaSNickeau
56a6bf47aaSNickeau
57a6bf47aaSNickeau    }
58a6bf47aaSNickeau
59a6bf47aaSNickeau    function handle_login_html(&$event, $param)
60a6bf47aaSNickeau    {
61a6bf47aaSNickeau
62a6bf47aaSNickeau        /**
63a6bf47aaSNickeau         * The Login page is created via buffer
64a6bf47aaSNickeau         * We print before the forms
65a6bf47aaSNickeau         * to avoid a FOUC
66a6bf47aaSNickeau         */
67a6bf47aaSNickeau        $loginCss = Snippet::createCssSnippet(self::TAG);
68a6bf47aaSNickeau        $content = $loginCss->getContent();
69a6bf47aaSNickeau        $class = $loginCss->getClass();
70a6bf47aaSNickeau        $cssHtml = <<<EOF
71a6bf47aaSNickeau<style class="$class">
72a6bf47aaSNickeau$content
73a6bf47aaSNickeau</style>
74a6bf47aaSNickeauEOF;
75a6bf47aaSNickeau        print $cssHtml;
76a6bf47aaSNickeau
77a6bf47aaSNickeau
78a6bf47aaSNickeau        /**
79a6bf47aaSNickeau         * @var Doku_Form $form
80a6bf47aaSNickeau         */
81a6bf47aaSNickeau        $form = &$event->data;
82a6bf47aaSNickeau        $form->params["class"] = self::FORM_LOGIN_CLASS;
83a6bf47aaSNickeau
84a6bf47aaSNickeau
85a6bf47aaSNickeau        /**
86a6bf47aaSNickeau         * Heading
87a6bf47aaSNickeau         */
88a6bf47aaSNickeau        $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_LOGIN_CLASS);
89a6bf47aaSNickeau
90a6bf47aaSNickeau        /**
91a6bf47aaSNickeau         * Field
92a6bf47aaSNickeau         */
93a6bf47aaSNickeau        foreach ($form->_content as $field) {
94a6bf47aaSNickeau            if (!is_array($field)) {
95a6bf47aaSNickeau                continue;
96a6bf47aaSNickeau            }
97a6bf47aaSNickeau            $fieldName = $field["name"];
98a6bf47aaSNickeau            if ($fieldName == null) {
99a6bf47aaSNickeau                // this is not an input field
100a6bf47aaSNickeau                if ($field["type"] == "submit") {
101a6bf47aaSNickeau                    /**
102a6bf47aaSNickeau                     * This is important to keep the submit element intact
103a6bf47aaSNickeau                     * for forms integration such as captcha
104a6bf47aaSNickeau                     * They search the submit button to insert before it
105a6bf47aaSNickeau                     */
106a6bf47aaSNickeau                    $classes = "btn btn-primary btn-block";
107a6bf47aaSNickeau                    if (isset($field["class"])) {
108a6bf47aaSNickeau                        $field["class"] = $field["class"] . " " . $classes;
109a6bf47aaSNickeau                    } else {
110a6bf47aaSNickeau                        $field["class"] = $classes;
111a6bf47aaSNickeau                    }
112a6bf47aaSNickeau                    $newFormContent[] = $field;
113a6bf47aaSNickeau                }
114a6bf47aaSNickeau                continue;
115a6bf47aaSNickeau            }
116a6bf47aaSNickeau            switch ($fieldName) {
117a6bf47aaSNickeau                case "u":
118a6bf47aaSNickeau                    $loginText = $field["_text"];
119a6bf47aaSNickeau                    $loginValue = $field["value"];
120a6bf47aaSNickeau                    $loginHTMLField = <<<EOF
121a6bf47aaSNickeau<div class="form-floating">
122a6bf47aaSNickeau    <input type="text" id="inputUserName" class="form-control" placeholder="$loginText" required="required" autofocus="" name="u" value="$loginValue">
123a6bf47aaSNickeau    <label for="inputUserName">$loginText</label>
124a6bf47aaSNickeau</div>
125a6bf47aaSNickeauEOF;
126a6bf47aaSNickeau                    $newFormContent[] = $loginHTMLField;
127a6bf47aaSNickeau                    break;
128a6bf47aaSNickeau                case "p":
129a6bf47aaSNickeau                    $passwordText = $field["_text"];
130a6bf47aaSNickeau                    $passwordFieldHTML = <<<EOF
131a6bf47aaSNickeau<div class="form-floating">
132a6bf47aaSNickeau    <input type="password" id="inputPassword" class="form-control" placeholder="$passwordText" required="required" name="p">
133a6bf47aaSNickeau    <label for="inputPassword">$passwordText</label>
134a6bf47aaSNickeau</div>
135a6bf47aaSNickeauEOF;
136a6bf47aaSNickeau                    $newFormContent[] = $passwordFieldHTML;
137a6bf47aaSNickeau                    break;
138a6bf47aaSNickeau                case "r":
139a6bf47aaSNickeau                    $rememberText = $field["_text"];
140a6bf47aaSNickeau                    $rememberValue = $field["value"];
141a6bf47aaSNickeau                    $rememberMeHtml = <<<EOF
142a6bf47aaSNickeau<div class="checkbox rememberMe">
143a6bf47aaSNickeau    <label><input type="checkbox" id="remember__me" name="r" value="$rememberValue"> $rememberText</label>
144a6bf47aaSNickeau</div>
145a6bf47aaSNickeauEOF;
146a6bf47aaSNickeau                    $newFormContent[] = $rememberMeHtml;
147a6bf47aaSNickeau                    break;
148a6bf47aaSNickeau                default:
149a6bf47aaSNickeau                    $tag = self::TAG;
150a6bf47aaSNickeau                    LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
151a6bf47aaSNickeau
152a6bf47aaSNickeau
153a6bf47aaSNickeau            }
154a6bf47aaSNickeau        }
155a6bf47aaSNickeau
156a6bf47aaSNickeau
157a6bf47aaSNickeau        $registerHtml = action_plugin_combo_registration::getRegisterLinkAndParagraph();
158a6bf47aaSNickeau        if (!empty($registerHtml)) {
159a6bf47aaSNickeau            $newFormContent[] = $registerHtml;
160a6bf47aaSNickeau        }
161a6bf47aaSNickeau        $resendPwdHtml = action_plugin_combo_resend::getResendPasswordParagraphWithLinkToFormPage();
162a6bf47aaSNickeau        if (!empty($resendPwdHtml)) {
163a6bf47aaSNickeau            $newFormContent[] = $resendPwdHtml;
164a6bf47aaSNickeau        }
165a6bf47aaSNickeau
166a6bf47aaSNickeau        /**
167a6bf47aaSNickeau         * Set the new in place of the old one
168a6bf47aaSNickeau         */
169a6bf47aaSNickeau        $form->_content = $newFormContent;
170a6bf47aaSNickeau
171a6bf47aaSNickeau        return true;
172a6bf47aaSNickeau
173a6bf47aaSNickeau
174a6bf47aaSNickeau    }
175a6bf47aaSNickeau
176*c3437056SNickeau    /** @noinspection PhpUnused */
177*c3437056SNickeau    function handle_login_html_new(&$event, $param)
178*c3437056SNickeau    {
179*c3437056SNickeau        // does not fire for now
180*c3437056SNickeau        $data = $event->data;
181*c3437056SNickeau    }
182a6bf47aaSNickeau
183a6bf47aaSNickeau    /**
184a6bf47aaSNickeau     * Login
185a6bf47aaSNickeau     * @return string
186a6bf47aaSNickeau     */
187a6bf47aaSNickeau    public static function getLoginParagraphWithLinkToFormPage()
188a6bf47aaSNickeau    {
189a6bf47aaSNickeau
190a6bf47aaSNickeau        $loginPwLink = (new Login())->asHtmlLink('', false);
191a6bf47aaSNickeau        global $lang;
192a6bf47aaSNickeau        $loginText = $lang['btn_login'];
193a6bf47aaSNickeau        return <<<EOF
194a6bf47aaSNickeau<p class="login">$loginText ? : $loginPwLink</p>
195a6bf47aaSNickeauEOF;
196a6bf47aaSNickeau
197a6bf47aaSNickeau    }
198a6bf47aaSNickeau}
199a6bf47aaSNickeau
200