xref: /plugin/drawio/action.php (revision 481efa08c0c1e3f8650f78ebee78a9ca969f029b) !
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