1<?php
2
3class helper_plugin_bureaucracy_actionscript extends helper_plugin_bureaucracy_action {
4
5    protected $scriptNamePattern = '/^[_a-zA-Z0-9]+\.php$/';
6
7    /**
8     * @inheritDoc
9     * @throws \InvalidArgumentException
10     */
11    public function run($fields, $thanks, $argv) {
12        if (count($argv) < 1) {
13            throw new InvalidArgumentException('The "script"-action expects exactly 1 argument: the script name.');
14        }
15
16        $scriptName = $argv[0];
17
18        if (!$this->validateScriptName($scriptName)) {
19            $cleanedScriptName = hsc($scriptName);
20            throw new InvalidArgumentException("The supplied scriptname \"<code>$cleanedScriptName</code>\" is invalid! It must conform to <code>{hsc($this->scriptNamePattern)}</code>!");
21        }
22
23        $path = DOKU_CONF . 'plugin/bureaucracy/' . $scriptName;
24
25        if (!file_exists($path)) {
26            $shortPath = 'conf/plugin/bureaucracy/' . $scriptName;
27            throw new InvalidArgumentException("Script <code>$shortPath</code> doesn't exist!");
28        }
29
30        require $path;
31
32        $classFragment = substr($scriptName, 0, strpos($scriptName, '.'));
33        $className = 'helper_plugin_bureaucracy_handler_' . $classFragment;
34
35        $deprecatedClassName = 'bureaucracy_handler_' . $classFragment;
36        if (!class_exists($className) && class_exists($deprecatedClassName)) {
37            msg("Please change this script's class-name to <code>$className</code>.
38Your current scheme <code>$deprecatedClassName</code> is deprecated and will stop working in the future.", 2);
39            $className = $deprecatedClassName;
40        }
41
42        /** @var dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface $handler */
43        $handler = new $className;
44
45        if (!is_a($handler, dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface::class)) {
46            throw new InvalidArgumentException('The handler must implement the interface <code>dokuwiki\\plugin\\bureaucracy\\interfaces\\bureaucracy_handler_interface</code> !');
47        }
48
49        return $handler->handleData($fields, $thanks);
50    }
51
52    /**
53     * @param $scriptName
54     *
55     * @return bool
56     */
57    protected function validateScriptName($scriptName) {
58        $valid = preg_match($this->scriptNamePattern, $scriptName);
59        return $valid === 1;
60    }
61
62}
63