144f1f9b5SMiloš Kozák<?php 244f1f9b5SMiloš Kozák /* 344f1f9b5SMiloš Kozák * plugin should use this method to register its handlers 444f1f9b5SMiloš Kozák * with the dokuwiki's event controller 5*481efa08SHahn Axel (hahn) * 6*481efa08SHahn Axel (hahn) * 2025-06-05 axel replace deprecated JSON object; short array syntax 744f1f9b5SMiloš Kozák */ 844f1f9b5SMiloš Kozák 9fbe2d53dSMiloš Kozák if(!defined('DOKU_INC')) die(); 1044f1f9b5SMiloš Kozák 1144f1f9b5SMiloš Kozák 1244f1f9b5SMiloš Kozák class action_plugin_drawio extends DokuWiki_Action_Plugin { 1344f1f9b5SMiloš Kozák 1444f1f9b5SMiloš Kozák public function register(Doku_Event_Handler $controller) { 1580eec5ffSSoarinferret $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'addjsinfo'); 1644f1f9b5SMiloš Kozák $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this,'_ajax_call'); 173ec92d39SMiloš Kozák // $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_button', array ()); 1844f1f9b5SMiloš Kozák } 1944f1f9b5SMiloš Kozák 203ec92d39SMiloš Kozák // function insert_button(Doku_Event $event, $param) { 213ec92d39SMiloš Kozák // $event->data[] = array ( 223ec92d39SMiloš Kozák // 'type' => 'format', 233ec92d39SMiloš Kozák // 'title' => $this->getLang('abutton'), 243ec92d39SMiloš Kozák // 'icon' => '../../plugins/drawio/icon.png', 253ec92d39SMiloš Kozák // 'open' => '<abutton>', 263ec92d39SMiloš Kozák // 'close' => '', 273ec92d39SMiloš Kozák // 'block' => false, 283ec92d39SMiloš Kozák // ); 293ec92d39SMiloš Kozák // } 303ec92d39SMiloš Kozák 3144f1f9b5SMiloš Kozák /** 3280eec5ffSSoarinferret * add drawio config options to jsinfo 3380eec5ffSSoarinferret */ 3480eec5ffSSoarinferret 3580eec5ffSSoarinferret function addjsinfo($event, $params){ 3680eec5ffSSoarinferret global $JSINFO; 37*481efa08SHahn Axel (hahn) $JSINFO['plugin_drawio'] = [ 38449a9069SDonCarlosGraz 'zIndex' => $this->getConf('zIndex'), 39327e99acSVincent Voisin 'url' => $this->getConf('url'), 40e93440f3SVincent Voisin 'toolbar_possible_extension' => array_map('trim', explode(",",$this->getConf('toolbar_possible_extension'))) 41*481efa08SHahn Axel (hahn) ]; 4280eec5ffSSoarinferret } 4380eec5ffSSoarinferret 4480eec5ffSSoarinferret /** 4544f1f9b5SMiloš Kozák * handle ajax requests 4644f1f9b5SMiloš Kozák */ 4744f1f9b5SMiloš Kozák function _ajax_call(Doku_Event $event, $param) { 4844f1f9b5SMiloš Kozák if ($event->data !== 'plugin_drawio') { 4944f1f9b5SMiloš Kozák return; 5044f1f9b5SMiloš Kozák } 5144f1f9b5SMiloš Kozák //no other ajax call handlers needed 5244f1f9b5SMiloš Kozák $event->stopPropagation(); 5344f1f9b5SMiloš Kozák $event->preventDefault(); 5444f1f9b5SMiloš Kozák 5544f1f9b5SMiloš Kozák //e.g. access additional request variables 5679393f15SAlexBlack788 global $conf, $lang; 5744f1f9b5SMiloš Kozák global $INPUT; //available since release 2012-10-13 "Adora Belle" 5844f1f9b5SMiloš Kozák $name = $INPUT->str('imageName'); 593ec92d39SMiloš Kozák $action = $INPUT->str('action'); 6044f1f9b5SMiloš Kozák 617d211016SVincent Voisin $suffix = strpos($action, "draft_") === 0 ? '.draft':''; 621be14990SMiloš Kozák $media_id = $name . $suffix; 6379393f15SAlexBlack788 $media_id = cleanID($media_id); 6479393f15SAlexBlack788 $fl = mediaFN($media_id); 6579393f15SAlexBlack788 6679393f15SAlexBlack788 // Get user info 6779393f15SAlexBlack788 global $USERINFO; 6879393f15SAlexBlack788 global $INPUT; 6979393f15SAlexBlack788 global $INFO; 7079393f15SAlexBlack788 7179393f15SAlexBlack788 $user = $INPUT->server->str('REMOTE_USER'); 7279393f15SAlexBlack788 $groups = (array) $USERINFO['grps']; 7379393f15SAlexBlack788 $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE); 7479393f15SAlexBlack788 $id = cleanID($name); 7579393f15SAlexBlack788 7679393f15SAlexBlack788 // Check ACL 7779393f15SAlexBlack788 $auth = auth_aclcheck($id, $user, $groups); 7879393f15SAlexBlack788 $access_granted = ($auth >= $auth_ow); 7979393f15SAlexBlack788 8079393f15SAlexBlack788 // AJAX request 8179393f15SAlexBlack788 if ($action == 'get_auth') 8279393f15SAlexBlack788 { 83*481efa08SHahn Axel (hahn) echo json_encode($access_granted); 8479393f15SAlexBlack788 return; 8544f1f9b5SMiloš Kozák } 8679393f15SAlexBlack788 ; 8779393f15SAlexBlack788 if (!$access_granted) 88*481efa08SHahn Axel (hahn) return [$lang['media_perm_upload'], 0]; 8944f1f9b5SMiloš Kozák 9079393f15SAlexBlack788 io_makeFileDir($fl); 913ec92d39SMiloš Kozák if($action == 'save'){ 9279393f15SAlexBlack788 9379393f15SAlexBlack788 $old = @filemtime($fl); 9479393f15SAlexBlack788 if(!file_exists(mediaFN($media_id, $old)) && file_exists($fl)) { 9579393f15SAlexBlack788 // add old revision to the attic if missing 9679393f15SAlexBlack788 media_saveOldRevision($media_id); 9779393f15SAlexBlack788 } 9879393f15SAlexBlack788 $filesize_old = file_exists($fl) ? filesize($fl) : 0; 9979393f15SAlexBlack788 10079393f15SAlexBlack788 // prepare directory 10179393f15SAlexBlack788 io_createNamespace($media_id, 'media'); 10279393f15SAlexBlack788 10344f1f9b5SMiloš Kozák // Write content to file 1043ec92d39SMiloš Kozák $content = $INPUT->str('content'); 10544f1f9b5SMiloš Kozák $base64data = explode(",", $content)[1]; 10679393f15SAlexBlack788 //$whandle = fopen($file_path,'w'); 10779393f15SAlexBlack788 $whandle = fopen($fl, 'w'); 10844f1f9b5SMiloš Kozák fwrite($whandle,base64_decode($base64data)); 10944f1f9b5SMiloš Kozák fclose($whandle); 11044f1f9b5SMiloš Kozák 11179393f15SAlexBlack788 @clearstatcache(true, $fl); 11279393f15SAlexBlack788 $new = @filemtime($fl); 11379393f15SAlexBlack788 chmod($fl, $conf['fmode']); 11479393f15SAlexBlack788 11579393f15SAlexBlack788 // Add to log 11679393f15SAlexBlack788 $filesize_new = filesize($fl); 11779393f15SAlexBlack788 $sizechange = $filesize_new - $filesize_old; 11879393f15SAlexBlack788 if ($filesize_old != 0) { 11979393f15SAlexBlack788 addMediaLogEntry($new, $media_id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange); 12079393f15SAlexBlack788 } else { 12179393f15SAlexBlack788 addMediaLogEntry($new, $media_id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange); 12279393f15SAlexBlack788 } 12379393f15SAlexBlack788 } 1247d211016SVincent Voisin if($action == 'get_png'){ 125b83afe30SMiloš Kozák if (!file_exists($fl)) return; 126b83afe30SMiloš Kozák // Return image in the base64 for draw.io 127b83afe30SMiloš Kozák header('Content-Type: application/json'); 128b83afe30SMiloš Kozák //$fc = file_get_contents($file_path); 129b83afe30SMiloš Kozák $fc = file_get_contents($fl); 130*481efa08SHahn Axel (hahn) echo json_encode(["content" => "data:image/png;base64,".base64_encode($fc)]); 131b83afe30SMiloš Kozák } 1327d211016SVincent Voisin if($action == 'get_svg'){ 1337d211016SVincent Voisin if (!file_exists($fl)) return; 1347d211016SVincent Voisin // Return image in the base64 for draw.io 1357d211016SVincent Voisin header('Content-Type: application/json'); 1367d211016SVincent Voisin //$fc = file_get_contents($file_path); 1377d211016SVincent Voisin $fc = file_get_contents($fl); 138*481efa08SHahn Axel (hahn) echo json_encode(["content" => "data:image/svg+xml;base64,".base64_encode($fc)]); 1397d211016SVincent Voisin } 140b83afe30SMiloš Kozák 141b83afe30SMiloš Kozák // Draft section 1421be14990SMiloš Kozák if($action == 'draft_save'){ 1431be14990SMiloš Kozák // prepare directory 1441be14990SMiloš Kozák io_createNamespace($media_id, 'media'); 1451be14990SMiloš Kozák 1460c7dc9c8SMiloš Kozák // Format content of draft file 1471be14990SMiloš Kozák $content = $INPUT->str('content'); 1480c7dc9c8SMiloš Kozák 1490c7dc9c8SMiloš Kozák // Write content to file 1501be14990SMiloš Kozák $whandle = fopen($fl, 'w'); 1510c7dc9c8SMiloš Kozák fwrite($whandle, $content); 1521be14990SMiloš Kozák fclose($whandle); 1531be14990SMiloš Kozák } 1541be14990SMiloš Kozák if($action == 'draft_rm'){ 1551be14990SMiloš Kozák unlink($fl); 1561be14990SMiloš Kozák } 1571be14990SMiloš Kozák if($action == 'draft_get'){ 1581be14990SMiloš Kozák header('Content-Type: application/json'); 1591be14990SMiloš Kozák if (file_exists($fl)){ 1600c7dc9c8SMiloš Kozák echo file_get_contents($fl); 1611be14990SMiloš Kozák }else { 162*481efa08SHahn Axel (hahn) echo json_encode(["content" => "NaN"]); 1631be14990SMiloš Kozák } 1641be14990SMiloš Kozák } 16544f1f9b5SMiloš Kozák } 16644f1f9b5SMiloš Kozák } 167