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(); 17*37748cd8SNickeaurequire_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 */ 54a6bf47aaSNickeau // $controller->register_hook('FORM_LOGIN_OUTPUT', 'BEFORE', $this, 'handle_login_html', 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 176a6bf47aaSNickeau 177a6bf47aaSNickeau /** 178a6bf47aaSNickeau * Login 179a6bf47aaSNickeau * @return string 180a6bf47aaSNickeau */ 181a6bf47aaSNickeau public static function getLoginParagraphWithLinkToFormPage() 182a6bf47aaSNickeau { 183a6bf47aaSNickeau 184a6bf47aaSNickeau $loginPwLink = (new Login())->asHtmlLink('', false); 185a6bf47aaSNickeau global $lang; 186a6bf47aaSNickeau $loginText = $lang['btn_login']; 187a6bf47aaSNickeau return <<<EOF 188a6bf47aaSNickeau<p class="login">$loginText ? : $loginPwLink</p> 189a6bf47aaSNickeauEOF; 190a6bf47aaSNickeau 191a6bf47aaSNickeau } 192a6bf47aaSNickeau} 193a6bf47aaSNickeau 194