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