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