1*eb872c2aStomLin1998567<?php 2*eb872c2aStomLin1998567if (!defined('DOKU_INC')) die(); 3*eb872c2aStomLin1998567 4*eb872c2aStomLin1998567/** 5*eb872c2aStomLin1998567 * PASSWD Plugin: Renders a password-protected section with captcha verification. 6*eb872c2aStomLin1998567 * 7*eb872c2aStomLin1998567 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 8*eb872c2aStomLin1998567 * @author tomLin1998567 9*eb872c2aStomLin1998567 */ 10*eb872c2aStomLin1998567class syntax_plugin_passwd extends DokuWiki_Syntax_Plugin 11*eb872c2aStomLin1998567{ 12*eb872c2aStomLin1998567 public function getType() 13*eb872c2aStomLin1998567 { 14*eb872c2aStomLin1998567 return 'protected'; 15*eb872c2aStomLin1998567 } 16*eb872c2aStomLin1998567 17*eb872c2aStomLin1998567 public function getPType() 18*eb872c2aStomLin1998567 { 19*eb872c2aStomLin1998567 return 'block'; 20*eb872c2aStomLin1998567 } 21*eb872c2aStomLin1998567 22*eb872c2aStomLin1998567 public function getSort() 23*eb872c2aStomLin1998567 { 24*eb872c2aStomLin1998567 return 150; 25*eb872c2aStomLin1998567 } 26*eb872c2aStomLin1998567 27*eb872c2aStomLin1998567 public function connectTo($mode) 28*eb872c2aStomLin1998567 { 29*eb872c2aStomLin1998567 $this->Lexer->addSpecialPattern( 30*eb872c2aStomLin1998567 '<passwd\b[^>]*?>[\s\S]*?<\/passwd>', 31*eb872c2aStomLin1998567 $mode, 32*eb872c2aStomLin1998567 'plugin_passwd' 33*eb872c2aStomLin1998567 ); 34*eb872c2aStomLin1998567 } 35*eb872c2aStomLin1998567 36*eb872c2aStomLin1998567 public function handle($match, $state, $pos, Doku_Handler $handler) 37*eb872c2aStomLin1998567 { 38*eb872c2aStomLin1998567 if (!preg_match('/^<passwd\b([^>]*?)>([\s\S]*?)<\/passwd>$/s', $match, $m)) { 39*eb872c2aStomLin1998567 return false; 40*eb872c2aStomLin1998567 } 41*eb872c2aStomLin1998567 42*eb872c2aStomLin1998567 $attrStr = $m[1]; 43*eb872c2aStomLin1998567 $content = $m[2]; 44*eb872c2aStomLin1998567 45*eb872c2aStomLin1998567 $attrs = array( 46*eb872c2aStomLin1998567 'password' => '', 47*eb872c2aStomLin1998567 'prompt' => $this->getConf('prompt_text'), 48*eb872c2aStomLin1998567 'btn' => $this->getConf('btn_text'), 49*eb872c2aStomLin1998567 'error' => $this->getConf('error_text'), 50*eb872c2aStomLin1998567 ); 51*eb872c2aStomLin1998567 52*eb872c2aStomLin1998567 if (preg_match('/password="([^"]+)"/i', $attrStr, $p)) $attrs['password'] = $p[1]; 53*eb872c2aStomLin1998567 if (preg_match('/prompt="([^"]+)"/i', $attrStr, $p)) $attrs['prompt'] = $p[1]; 54*eb872c2aStomLin1998567 if (preg_match('/btn="([^"]+)"/i', $attrStr, $p)) $attrs['btn'] = $p[1]; 55*eb872c2aStomLin1998567 if (preg_match('/error="([^"]+)"/i', $attrStr, $p)) $attrs['error'] = $p[1]; 56*eb872c2aStomLin1998567 57*eb872c2aStomLin1998567 $attrs['content'] = $content; 58*eb872c2aStomLin1998567 return $attrs; 59*eb872c2aStomLin1998567 } 60*eb872c2aStomLin1998567 61*eb872c2aStomLin1998567 public function render($mode, Doku_Renderer $renderer, $data) 62*eb872c2aStomLin1998567 { 63*eb872c2aStomLin1998567 if ($mode != 'xhtml' || !$data) return false; 64*eb872c2aStomLin1998567 65*eb872c2aStomLin1998567 static $idx = 0; 66*eb872c2aStomLin1998567 $myIdx = $idx++; 67*eb872c2aStomLin1998567 68*eb872c2aStomLin1998567 $out = '<div class="passwd_block" data-idx="' . $myIdx . '">'; 69*eb872c2aStomLin1998567 $out .= '<form class="passwd_form">'; 70*eb872c2aStomLin1998567 $out .= '<p class="passwd_prompt">' . hsc($data['prompt']) . '</p>'; 71*eb872c2aStomLin1998567 $out .= '<div class="passwd_input_wrapper">'; 72*eb872c2aStomLin1998567 $out .= '<input type="password" name="passwd" class="passwd_input" placeholder="Enter password">'; 73*eb872c2aStomLin1998567 $out .= '<button type="button" class="passwd_toggle" onclick="passwd_toggle(this)" title="Show password"></button>'; 74*eb872c2aStomLin1998567 $out .= '</div>'; 75*eb872c2aStomLin1998567 // Error message between input and button 76*eb872c2aStomLin1998567 $out .= '<span class="passwd_error" style="display:none">' . hsc($data['error']) . '</span>'; 77*eb872c2aStomLin1998567 // Captcha placeholder — empty by design. A fresh captcha is fetched 78*eb872c2aStomLin1998567 // via AJAX on page load so cached HTML never contains stale tokens. 79*eb872c2aStomLin1998567 $out .= '<div class="passwd_captcha"></div>'; 80*eb872c2aStomLin1998567 $out .= '<button type="submit" class="passwd_btn">' . hsc($data['btn']) . '</button>'; 81*eb872c2aStomLin1998567 $out .= '</form>'; 82*eb872c2aStomLin1998567 $out .= '<div class="passwd_content" style="display:none"></div>'; 83*eb872c2aStomLin1998567 $out .= '</div>'; 84*eb872c2aStomLin1998567 85*eb872c2aStomLin1998567 $renderer->doc .= $out; 86*eb872c2aStomLin1998567 return true; 87*eb872c2aStomLin1998567 } 88*eb872c2aStomLin1998567} 89