197c734d5Sternite<?php 297c734d5Sternite/** 3*79796825Sternite * Plugin dokucrypt3: Enables client side encryption 497c734d5Sternite * 597c734d5Sternite * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 697c734d5Sternite * @author Scott Moser <smoser@brickies.net>, Maintainer Sherri W. ( contact me at syntaxseed.com) 797c734d5Sternite */ 897c734d5Sternite 997c734d5Sternite// must be run within Dokuwiki 1097c734d5Sterniteif (!defined('DOKU_INC')) { 1197c734d5Sternite die(); 1297c734d5Sternite} 1397c734d5Sternite 1497c734d5Sterniteif (!defined('DOKU_PLUGIN')) { 1597c734d5Sternite define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 1697c734d5Sternite} 1797c734d5Sterniterequire_once(DOKU_PLUGIN.'syntax.php'); 1897c734d5Sternite 1997c734d5Sternite/** 2097c734d5Sternite * All DokuWiki plugins to extend the parser/rendering mechanism 2197c734d5Sternite * need to inherit from this class 2297c734d5Sternite */ 23*79796825Sterniteclass syntax_plugin_dokucrypt3 extends DokuWiki_Syntax_Plugin 2497c734d5Sternite{ 2597c734d5Sternite public $curNum=0; 2697c734d5Sternite public $curLock=0; 2797c734d5Sternite /** 2897c734d5Sternite * return some info 2997c734d5Sternite */ 3097c734d5Sternite public function getInfo() 3197c734d5Sternite { 3297c734d5Sternite return array( 3397c734d5Sternite 'author' => 'Scott Moser, Maintainer Sherri Wheeler', 3497c734d5Sternite 'email' => 'Twitter @SyntaxSeed or http://SyntaxSeed.com', 3597c734d5Sternite 'date' => '2024-05-01', 3697c734d5Sternite 'name' => 'Client Side Encryption Plugin', 3797c734d5Sternite 'desc' => 'Client side cryptography enabling encrypting blocks of text within a wiki page.', 38*79796825Sternite 'url' => 'https://www.dokuwiki.org/plugin:dokucrypt3', 3997c734d5Sternite ); 4097c734d5Sternite } 4197c734d5Sternite 4297c734d5Sternite public function getType() 4397c734d5Sternite { 4497c734d5Sternite return 'protected'; 4597c734d5Sternite } 4697c734d5Sternite public function getAllowedTypes() 4797c734d5Sternite { 4897c734d5Sternite return array(); 4997c734d5Sternite } 5097c734d5Sternite public function getSort() 5197c734d5Sternite { 5297c734d5Sternite return 999; 5397c734d5Sternite } 5497c734d5Sternite public function connectTo($mode) 5597c734d5Sternite { 5697c734d5Sternite $this->Lexer->addEntryPattern( 5797c734d5Sternite '<ENCRYPTED.*?>(?=.*?</ENCRYPTED>)', 5897c734d5Sternite $mode, 59*79796825Sternite 'plugin_dokucrypt3' 6097c734d5Sternite ); 6197c734d5Sternite } 6297c734d5Sternite public function postConnect() 6397c734d5Sternite { 64*79796825Sternite $this->Lexer->addExitPattern('</ENCRYPTED>', 'plugin_dokucrypt3'); 6597c734d5Sternite } 6697c734d5Sternite 6797c734d5Sternite /** 6897c734d5Sternite * Handle the match 6997c734d5Sternite */ 7097c734d5Sternite public function handle($match, $state, $pos, Doku_Handler $handler) 7197c734d5Sternite { 7297c734d5Sternite switch ($state) { 7397c734d5Sternite case DOKU_LEXER_ENTER: 7497c734d5Sternite // parse something like <ENCRYPTED> or <ENCRYPTED LOCK=foo> 7597c734d5Sternite $attr=array( "lock" => "default", "collapsed" => "1" ); 7697c734d5Sternite if (($x=strpos($match, "LOCK="))!==false) { 7797c734d5Sternite $x+=strlen("LOCK="); 7897c734d5Sternite if (($end=strpos($match, " ", $x))!==false) { 7997c734d5Sternite $len=$end-$x; 8097c734d5Sternite } else { 8197c734d5Sternite $len=-1; 8297c734d5Sternite } 8397c734d5Sternite $attr["lock"]=substr($match, $x, $len); 8497c734d5Sternite } 8597c734d5Sternite if (($x=strpos($match, "COLLAPSED="))!==false) { 8697c734d5Sternite $x+=strlen("COLLAPSED="); 8797c734d5Sternite if (($end=strpos($match, " ", $x))!==false) { 8897c734d5Sternite $len=$end-$x; 8997c734d5Sternite } else { 9097c734d5Sternite $len=-1; 9197c734d5Sternite } 9297c734d5Sternite $attr["collapsed"]=substr($match, $x, $len); 9397c734d5Sternite } 9497c734d5Sternite return(array($state,$attr)); 9597c734d5Sternite case DOKU_LEXER_UNMATCHED: return array($state, $match); 9697c734d5Sternite case DOKU_LEXER_EXIT: return array($state, ''); 9797c734d5Sternite } 9897c734d5Sternite return array(); 9997c734d5Sternite } 10097c734d5Sternite 10197c734d5Sternite /** 10297c734d5Sternite * Create output 10397c734d5Sternite */ 10497c734d5Sternite public function render($mode, Doku_Renderer $renderer, $data) 10597c734d5Sternite { 10697c734d5Sternite if ($mode == 'xhtml') { 10797c734d5Sternite list($state, $match) = $data; 10897c734d5Sternite switch ($state) { 10997c734d5Sternite case DOKU_LEXER_ENTER: 11097c734d5Sternite $this->curLock=$match; 11197c734d5Sternite break; 11297c734d5Sternite case DOKU_LEXER_UNMATCHED: 11397c734d5Sternite $curid = "crypto_decrypted_" . $this->curNum; 11497c734d5Sternite 11597c734d5Sternite $renderer->doc.="<a id='$curid" . "_atag' " . 116*79796825Sternite "class='wikilink1 dokucrypt3dec JSnocheck' " . 11797c734d5Sternite "href=\"javascript:toggleCryptDiv(" . 11897c734d5Sternite "'$curid','" . $this->curLock["lock"] . "','" . 11997c734d5Sternite htmlspecialchars(str_replace("\n", "\\n", $match)) . "');\">" . 12097c734d5Sternite "Decrypt Encrypted Text</a>" . 121*79796825Sternite " [<a class='wikilink1 dokucrypt3toggle JSnocheck' " . 12297c734d5Sternite "href=\"javascript:toggleElemVisibility('$curid');\">" . 12397c734d5Sternite "Toggle Visible</a>]\n" . 124*79796825Sternite "<PRE id='$curid' class='dokucrypt3pre' style=\"" . 12597c734d5Sternite (($this->curLock["collapsed"] == 1) ? 12697c734d5Sternite "visibility:hidden;position:absolute;white-space:pre-wrap;word-wrap: break-word;" : 12797c734d5Sternite "visibility:visible;position:relative;white-space:pre-wrap;word-wrap: break-word;") . 12897c734d5Sternite "\">". htmlspecialchars($match)."</PRE>"; 12997c734d5Sternite $this->curNum++; 13097c734d5Sternite break; 13197c734d5Sternite case DOKU_LEXER_EXIT: 13297c734d5Sternite break; 13397c734d5Sternite } 13497c734d5Sternite return true; 13597c734d5Sternite } 13697c734d5Sternite return false; 13797c734d5Sternite } 13897c734d5Sternite} 139