xref: /plugin/skillforge/action.php (revision 1729dd472fd5524951126802d13bd2e76b84b680)
1*1729dd47SHenrik Yllemo<?php
2*1729dd47SHenrik Yllemoif (!defined('DOKU_INC')) die();
3*1729dd47SHenrik Yllemo
4*1729dd47SHenrik Yllemo/**
5*1729dd47SHenrik Yllemo * Handles SkillForge downloads outside the admin dispatcher.
6*1729dd47SHenrik Yllemo *
7*1729dd47SHenrik Yllemo * DokuWiki's admin pages can redirect or re-render before a binary download is
8*1729dd47SHenrik Yllemo * sent, especially on compact/on-a-stick installs. A dedicated action avoids
9*1729dd47SHenrik Yllemo * that path completely:
10*1729dd47SHenrik Yllemo *   doku.php?id=start&do=skillforge_download&sf_file=...zip&sectok=...
11*1729dd47SHenrik Yllemo */
12*1729dd47SHenrik Yllemoclass action_plugin_skillforge extends DokuWiki_Action_Plugin {
13*1729dd47SHenrik Yllemo    public function register(Doku_Event_Handler $controller) {
14*1729dd47SHenrik Yllemo        $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'handleDownload');
15*1729dd47SHenrik Yllemo    }
16*1729dd47SHenrik Yllemo
17*1729dd47SHenrik Yllemo    public function handleDownload(Doku_Event $event, $param) {
18*1729dd47SHenrik Yllemo        if (!isset($_REQUEST['do']) || !in_array($_REQUEST['do'], array('skillforge_download', 'skillforge_download_current'), true)) return;
19*1729dd47SHenrik Yllemo
20*1729dd47SHenrik Yllemo        if (!auth_isadmin()) {
21*1729dd47SHenrik Yllemo            http_status(403);
22*1729dd47SHenrik Yllemo            echo 'SkillForge download denied.';
23*1729dd47SHenrik Yllemo            exit;
24*1729dd47SHenrik Yllemo        }
25*1729dd47SHenrik Yllemo
26*1729dd47SHenrik Yllemo        if (!checkSecurityToken()) {
27*1729dd47SHenrik Yllemo            http_status(403);
28*1729dd47SHenrik Yllemo            echo 'SkillForge download denied: invalid security token.';
29*1729dd47SHenrik Yllemo            exit;
30*1729dd47SHenrik Yllemo        }
31*1729dd47SHenrik Yllemo
32*1729dd47SHenrik Yllemo        /** @var helper_plugin_skillforge $helper */
33*1729dd47SHenrik Yllemo        $helper = plugin_load('helper', 'skillforge');
34*1729dd47SHenrik Yllemo        if (!$helper) {
35*1729dd47SHenrik Yllemo            http_status(500);
36*1729dd47SHenrik Yllemo            echo 'SkillForge helper could not be loaded.';
37*1729dd47SHenrik Yllemo            exit;
38*1729dd47SHenrik Yllemo        }
39*1729dd47SHenrik Yllemo
40*1729dd47SHenrik Yllemo        try {
41*1729dd47SHenrik Yllemo            if ($_REQUEST['do'] === 'skillforge_download_current') {
42*1729dd47SHenrik Yllemo                global $ID;
43*1729dd47SHenrik Yllemo                $page = isset($_REQUEST['sf_page']) ? $_REQUEST['sf_page'] : $ID;
44*1729dd47SHenrik Yllemo                $result = $helper->exportPage($page);
45*1729dd47SHenrik Yllemo                $helper->sendDownload($result['name']);
46*1729dd47SHenrik Yllemo                return;
47*1729dd47SHenrik Yllemo            }
48*1729dd47SHenrik Yllemo
49*1729dd47SHenrik Yllemo            $name = isset($_REQUEST['sf_file']) ? $_REQUEST['sf_file'] : '';
50*1729dd47SHenrik Yllemo            $helper->sendDownload($name);
51*1729dd47SHenrik Yllemo        } catch (Exception $e) {
52*1729dd47SHenrik Yllemo            http_status(404);
53*1729dd47SHenrik Yllemo            echo 'SkillForge download failed: ' . hsc($e->getMessage());
54*1729dd47SHenrik Yllemo            exit;
55*1729dd47SHenrik Yllemo        }
56*1729dd47SHenrik Yllemo    }
57*1729dd47SHenrik Yllemo}
58