15f757686SAndreas Gohr<?php 25f757686SAndreas Gohr 359e7180eSAndreas Gohruse dokuwiki\plugin\diagrams\Diagrams; 459e7180eSAndreas Gohr 55f757686SAndreas Gohr/** 65f757686SAndreas Gohr * Action component of diagrams plugin 75f757686SAndreas Gohr * 859e7180eSAndreas Gohr * This handles operations related to mediafile based diagrams 959e7180eSAndreas Gohr * 1059e7180eSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 1159e7180eSAndreas Gohr * @author Innovakom + CosmoCode <dokuwiki@cosmocode.de> 125f757686SAndreas Gohr */ 135f757686SAndreas Gohrclass action_plugin_diagrams_mediafile extends DokuWiki_Action_Plugin 145f757686SAndreas Gohr{ 155f757686SAndreas Gohr 1659e7180eSAndreas Gohr /** @var helper_plugin_diagrams */ 1759e7180eSAndreas Gohr protected $helper; 1859e7180eSAndreas Gohr 1959e7180eSAndreas Gohr /** @inheritDoc */ 205f757686SAndreas Gohr public function register(Doku_Event_Handler $controller) 215f757686SAndreas Gohr { 2259e7180eSAndreas Gohr // only register if mediafile mode is enabled 2359e7180eSAndreas Gohr if (!($this->getConf('mode') & Diagrams::MODE_MEDIA)) return; 2459e7180eSAndreas Gohr 255f757686SAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleEditCheck'); 2659e7180eSAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleNamespaceCheck'); 27*0e8c676dSAnna Dabrowska $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleExistsCheck'); 28ca5b8841SAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleIsDiagramCheck'); 2959e7180eSAndreas Gohr $controller->register_hook('MEDIA_SENDFILE', 'BEFORE', $this, 'handleCSP'); 30b7bd8fa5SAnna Dabrowska $controller->register_hook('PLUGIN_MOVE_HANDLERS_REGISTER', 'BEFORE', $this, 'registerMoveHandler'); 3159e7180eSAndreas Gohr 3259e7180eSAndreas Gohr $this->helper = plugin_load('helper', 'diagrams'); 335f757686SAndreas Gohr } 345f757686SAndreas Gohr 35*0e8c676dSAnna Dabrowska public function handleExistsCheck(Doku_Event $event) 36*0e8c676dSAnna Dabrowska { 37*0e8c676dSAnna Dabrowska if ($event->data !== 'plugin_diagrams_mediafile_existscheck') return; 38*0e8c676dSAnna Dabrowska $event->preventDefault(); 39*0e8c676dSAnna Dabrowska $event->stopPropagation(); 40*0e8c676dSAnna Dabrowska 41*0e8c676dSAnna Dabrowska global $INPUT; 42*0e8c676dSAnna Dabrowska $mediaId = $INPUT->str('mediaId'); 43*0e8c676dSAnna Dabrowska 44*0e8c676dSAnna Dabrowska $file = mediaFN($mediaId); 45*0e8c676dSAnna Dabrowska 46*0e8c676dSAnna Dabrowska echo json_encode(file_exists($file)); 47*0e8c676dSAnna Dabrowska } 48*0e8c676dSAnna Dabrowska 495f757686SAndreas Gohr /** 505f757686SAndreas Gohr * Check all supplied diagrams and return only editable diagrams 515f757686SAndreas Gohr * 5259e7180eSAndreas Gohr * @param Doku_Event $event AJAX_CALL_UNKNOWN 535f757686SAndreas Gohr */ 545f757686SAndreas Gohr public function handleEditCheck(Doku_Event $event) 555f757686SAndreas Gohr { 565f757686SAndreas Gohr if ($event->data !== 'plugin_diagrams_mediafile_editcheck') return; 575f757686SAndreas Gohr $event->preventDefault(); 585f757686SAndreas Gohr $event->stopPropagation(); 595f757686SAndreas Gohr 605f757686SAndreas Gohr global $INPUT; 615f757686SAndreas Gohr $diagrams = (array)json_decode($INPUT->str('diagrams')); 625f757686SAndreas Gohr 635f757686SAndreas Gohr $editable = []; 645f757686SAndreas Gohr foreach ($diagrams as $image) { 655f757686SAndreas Gohr $image = cleanID($image); 665f757686SAndreas Gohr $file = mediaFN($image); 675f757686SAndreas Gohr 685f757686SAndreas Gohr if ( 695f757686SAndreas Gohr file_exists($file) && 705f757686SAndreas Gohr auth_quickaclcheck($image) >= AUTH_UPLOAD && 7159e7180eSAndreas Gohr $this->helper->isDiagramFile($file) 725f757686SAndreas Gohr ) { 735f757686SAndreas Gohr $editable[] = $image; 745f757686SAndreas Gohr } 755f757686SAndreas Gohr } 765f757686SAndreas Gohr 775f757686SAndreas Gohr echo json_encode($editable); 785f757686SAndreas Gohr } 795f757686SAndreas Gohr 8059e7180eSAndreas Gohr /** 81ca5b8841SAndreas Gohr * Check if the given media ID is a diagram 82ca5b8841SAndreas Gohr * 83ca5b8841SAndreas Gohr * @param Doku_Event $event AJAX_CALL_UNKNOWN 84ca5b8841SAndreas Gohr */ 85ca5b8841SAndreas Gohr public function handleIsDiagramCheck(Doku_Event $event) 86ca5b8841SAndreas Gohr { 87ca5b8841SAndreas Gohr if ($event->data !== 'plugin_diagrams_mediafile_isdiagramcheck') return; 88ca5b8841SAndreas Gohr $event->preventDefault(); 89ca5b8841SAndreas Gohr $event->stopPropagation(); 90ca5b8841SAndreas Gohr 91ca5b8841SAndreas Gohr global $INPUT; 92ca5b8841SAndreas Gohr $diagram = $INPUT->str('diagram'); 93ca5b8841SAndreas Gohr 94ca5b8841SAndreas Gohr $file = mediaFN(cleanID($diagram)); 95ca5b8841SAndreas Gohr if (!file_exists($file)) { 96ca5b8841SAndreas Gohr http_status(404); 97ca5b8841SAndreas Gohr echo 0; 98ca5b8841SAndreas Gohr return; 99ca5b8841SAndreas Gohr } 100ca5b8841SAndreas Gohr 101ca5b8841SAndreas Gohr if (!$this->helper->isDiagramFile($file)) { 102ca5b8841SAndreas Gohr http_status(403); 103ca5b8841SAndreas Gohr echo 0; 104ca5b8841SAndreas Gohr } 105ca5b8841SAndreas Gohr 106ca5b8841SAndreas Gohr echo 1; 107ca5b8841SAndreas Gohr } 108ca5b8841SAndreas Gohr 109ca5b8841SAndreas Gohr /** 11059e7180eSAndreas Gohr * Check ACL for supplied namespace 11159e7180eSAndreas Gohr * 11259e7180eSAndreas Gohr * @param Doku_Event $event AJAX_CALL_UNKNOWN 11359e7180eSAndreas Gohr */ 11459e7180eSAndreas Gohr public function handleNamespaceCheck(Doku_Event $event) 11559e7180eSAndreas Gohr { 11659e7180eSAndreas Gohr if ($event->data !== 'plugin_diagrams_mediafile_nscheck') return; 11759e7180eSAndreas Gohr $event->preventDefault(); 11859e7180eSAndreas Gohr $event->stopPropagation(); 11959e7180eSAndreas Gohr 12059e7180eSAndreas Gohr global $INPUT; 12159e7180eSAndreas Gohr $ns = $INPUT->str('ns'); 12259e7180eSAndreas Gohr 12359e7180eSAndreas Gohr echo json_encode(auth_quickaclcheck($ns . ':*') >= AUTH_UPLOAD); 12459e7180eSAndreas Gohr } 12559e7180eSAndreas Gohr 12659e7180eSAndreas Gohr /** 12727b2367eSAndreas Gohr * Set custom CSP for SVG diagrams 12859e7180eSAndreas Gohr * 12959e7180eSAndreas Gohr * @param Doku_Event $event MEDIA_SENDFILE 13059e7180eSAndreas Gohr */ 13159e7180eSAndreas Gohr public function handleCSP(Doku_Event $event) 13259e7180eSAndreas Gohr { 13359e7180eSAndreas Gohr if ($event->data['ext'] === 'svg' && $this->helper->isDiagramFile($event->data['file'])) { 13427b2367eSAndreas Gohr $event->data['csp'] = Diagrams::CSP; 13559e7180eSAndreas Gohr } 13659e7180eSAndreas Gohr } 137b7bd8fa5SAnna Dabrowska 138b7bd8fa5SAnna Dabrowska /** 139b7bd8fa5SAnna Dabrowska * Registers our handler with the move plugin 140b7bd8fa5SAnna Dabrowska * 141b7bd8fa5SAnna Dabrowska * @param Doku_Event $event 142b7bd8fa5SAnna Dabrowska * @return void 143b7bd8fa5SAnna Dabrowska */ 144b7bd8fa5SAnna Dabrowska public function registerMoveHandler(Doku_Event $event) 145b7bd8fa5SAnna Dabrowska { 146b7bd8fa5SAnna Dabrowska $event->data['handlers']['diagrams_mediafile'] = [new \syntax_plugin_diagrams_mediafile(), 'handleMove']; 147b7bd8fa5SAnna Dabrowska } 1485f757686SAndreas Gohr} 149