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