xref: /plugin/diagrams/action/mediafile.php (revision 0e8c676d43af9323e66c3e8f386c1b5f978b7ba1)
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