xref: /plugin/passwd/syntax.php (revision eb872c2a652d2b4294f9c5ebca2ba18675c61627)
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