1*97c734d5Sternite<?php 2*97c734d5Sternite/** 3*97c734d5Sternite * Plugin DokuCrypt2: Enables client side encryption 4*97c734d5Sternite * 5*97c734d5Sternite * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*97c734d5Sternite * @author Scott Moser <smoser@brickies.net>, Maintainer Sherri W. ( contact me at syntaxseed.com) 7*97c734d5Sternite */ 8*97c734d5Sternite 9*97c734d5Sternite// must be run within Dokuwiki 10*97c734d5Sterniteif (!defined('DOKU_INC')) { 11*97c734d5Sternite die(); 12*97c734d5Sternite} 13*97c734d5Sternite 14*97c734d5Sterniteif (!defined('DOKU_PLUGIN')) { 15*97c734d5Sternite define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 16*97c734d5Sternite} 17*97c734d5Sterniterequire_once(DOKU_PLUGIN.'syntax.php'); 18*97c734d5Sternite 19*97c734d5Sternite/** 20*97c734d5Sternite * All DokuWiki plugins to extend the parser/rendering mechanism 21*97c734d5Sternite * need to inherit from this class 22*97c734d5Sternite */ 23*97c734d5Sterniteclass syntax_plugin_dokucrypt2 extends DokuWiki_Syntax_Plugin 24*97c734d5Sternite{ 25*97c734d5Sternite public $curNum=0; 26*97c734d5Sternite public $curLock=0; 27*97c734d5Sternite /** 28*97c734d5Sternite * return some info 29*97c734d5Sternite */ 30*97c734d5Sternite public function getInfo() 31*97c734d5Sternite { 32*97c734d5Sternite return array( 33*97c734d5Sternite 'author' => 'Scott Moser, Maintainer Sherri Wheeler', 34*97c734d5Sternite 'email' => 'Twitter @SyntaxSeed or http://SyntaxSeed.com', 35*97c734d5Sternite 'date' => '2024-05-01', 36*97c734d5Sternite 'name' => 'Client Side Encryption Plugin', 37*97c734d5Sternite 'desc' => 'Client side cryptography enabling encrypting blocks of text within a wiki page.', 38*97c734d5Sternite 'url' => 'https://www.dokuwiki.org/plugin:dokucrypt2', 39*97c734d5Sternite ); 40*97c734d5Sternite } 41*97c734d5Sternite 42*97c734d5Sternite public function getType() 43*97c734d5Sternite { 44*97c734d5Sternite return 'protected'; 45*97c734d5Sternite } 46*97c734d5Sternite public function getAllowedTypes() 47*97c734d5Sternite { 48*97c734d5Sternite return array(); 49*97c734d5Sternite } 50*97c734d5Sternite public function getSort() 51*97c734d5Sternite { 52*97c734d5Sternite return 999; 53*97c734d5Sternite } 54*97c734d5Sternite public function connectTo($mode) 55*97c734d5Sternite { 56*97c734d5Sternite $this->Lexer->addEntryPattern( 57*97c734d5Sternite '<ENCRYPTED.*?>(?=.*?</ENCRYPTED>)', 58*97c734d5Sternite $mode, 59*97c734d5Sternite 'plugin_dokucrypt2' 60*97c734d5Sternite ); 61*97c734d5Sternite } 62*97c734d5Sternite public function postConnect() 63*97c734d5Sternite { 64*97c734d5Sternite $this->Lexer->addExitPattern('</ENCRYPTED>', 'plugin_dokucrypt2'); 65*97c734d5Sternite } 66*97c734d5Sternite 67*97c734d5Sternite /** 68*97c734d5Sternite * Handle the match 69*97c734d5Sternite */ 70*97c734d5Sternite public function handle($match, $state, $pos, Doku_Handler $handler) 71*97c734d5Sternite { 72*97c734d5Sternite switch ($state) { 73*97c734d5Sternite case DOKU_LEXER_ENTER: 74*97c734d5Sternite // parse something like <ENCRYPTED> or <ENCRYPTED LOCK=foo> 75*97c734d5Sternite $attr=array( "lock" => "default", "collapsed" => "1" ); 76*97c734d5Sternite if (($x=strpos($match, "LOCK="))!==false) { 77*97c734d5Sternite $x+=strlen("LOCK="); 78*97c734d5Sternite if (($end=strpos($match, " ", $x))!==false) { 79*97c734d5Sternite $len=$end-$x; 80*97c734d5Sternite } else { 81*97c734d5Sternite $len=-1; 82*97c734d5Sternite } 83*97c734d5Sternite $attr["lock"]=substr($match, $x, $len); 84*97c734d5Sternite } 85*97c734d5Sternite if (($x=strpos($match, "COLLAPSED="))!==false) { 86*97c734d5Sternite $x+=strlen("COLLAPSED="); 87*97c734d5Sternite if (($end=strpos($match, " ", $x))!==false) { 88*97c734d5Sternite $len=$end-$x; 89*97c734d5Sternite } else { 90*97c734d5Sternite $len=-1; 91*97c734d5Sternite } 92*97c734d5Sternite $attr["collapsed"]=substr($match, $x, $len); 93*97c734d5Sternite } 94*97c734d5Sternite return(array($state,$attr)); 95*97c734d5Sternite case DOKU_LEXER_UNMATCHED: return array($state, $match); 96*97c734d5Sternite case DOKU_LEXER_EXIT: return array($state, ''); 97*97c734d5Sternite } 98*97c734d5Sternite return array(); 99*97c734d5Sternite } 100*97c734d5Sternite 101*97c734d5Sternite /** 102*97c734d5Sternite * Create output 103*97c734d5Sternite */ 104*97c734d5Sternite public function render($mode, Doku_Renderer $renderer, $data) 105*97c734d5Sternite { 106*97c734d5Sternite if ($mode == 'xhtml') { 107*97c734d5Sternite list($state, $match) = $data; 108*97c734d5Sternite switch ($state) { 109*97c734d5Sternite case DOKU_LEXER_ENTER: 110*97c734d5Sternite $this->curLock=$match; 111*97c734d5Sternite break; 112*97c734d5Sternite case DOKU_LEXER_UNMATCHED: 113*97c734d5Sternite $curid = "crypto_decrypted_" . $this->curNum; 114*97c734d5Sternite 115*97c734d5Sternite $renderer->doc.="<a id='$curid" . "_atag' " . 116*97c734d5Sternite "class='wikilink1 dokucrypt2dec JSnocheck' " . 117*97c734d5Sternite "href=\"javascript:toggleCryptDiv(" . 118*97c734d5Sternite "'$curid','" . $this->curLock["lock"] . "','" . 119*97c734d5Sternite htmlspecialchars(str_replace("\n", "\\n", $match)) . "');\">" . 120*97c734d5Sternite "Decrypt Encrypted Text</a>" . 121*97c734d5Sternite " [<a class='wikilink1 dokucrypt2toggle JSnocheck' " . 122*97c734d5Sternite "href=\"javascript:toggleElemVisibility('$curid');\">" . 123*97c734d5Sternite "Toggle Visible</a>]\n" . 124*97c734d5Sternite "<PRE id='$curid' class='dokucrypt2pre' style=\"" . 125*97c734d5Sternite (($this->curLock["collapsed"] == 1) ? 126*97c734d5Sternite "visibility:hidden;position:absolute;white-space:pre-wrap;word-wrap: break-word;" : 127*97c734d5Sternite "visibility:visible;position:relative;white-space:pre-wrap;word-wrap: break-word;") . 128*97c734d5Sternite "\">". htmlspecialchars($match)."</PRE>"; 129*97c734d5Sternite $this->curNum++; 130*97c734d5Sternite break; 131*97c734d5Sternite case DOKU_LEXER_EXIT: 132*97c734d5Sternite break; 133*97c734d5Sternite } 134*97c734d5Sternite return true; 135*97c734d5Sternite } 136*97c734d5Sternite return false; 137*97c734d5Sternite } 138*97c734d5Sternite} 139