summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/helper/actionscript.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/helper/actionscript.php')
-rw-r--r--platform/www/lib/plugins/bureaucracy/helper/actionscript.php62
1 files changed, 62 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/helper/actionscript.php b/platform/www/lib/plugins/bureaucracy/helper/actionscript.php
new file mode 100644
index 0000000..f308721
--- /dev/null
+++ b/platform/www/lib/plugins/bureaucracy/helper/actionscript.php
@@ -0,0 +1,62 @@
+<?php
+
+class helper_plugin_bureaucracy_actionscript extends helper_plugin_bureaucracy_action {
+
+ protected $scriptNamePattern = '/^[_a-zA-Z0-9]+\.php$/';
+
+ /**
+ * @inheritDoc
+ * @throws \InvalidArgumentException
+ */
+ public function run($fields, $thanks, $argv) {
+ if (count($argv) < 1) {
+ throw new InvalidArgumentException('The "script"-action expects exactly 1 argument: the script name.');
+ }
+
+ $scriptName = $argv[0];
+
+ if (!$this->validateScriptName($scriptName)) {
+ $cleanedScriptName = hsc($scriptName);
+ throw new InvalidArgumentException("The supplied scriptname \"<code>$cleanedScriptName</code>\" is invalid! It must conform to <code>{hsc($this->scriptNamePattern)}</code>!");
+ }
+
+ $path = DOKU_CONF . 'plugin/bureaucracy/' . $scriptName;
+
+ if (!file_exists($path)) {
+ $shortPath = 'conf/plugin/bureaucracy/' . $scriptName;
+ throw new InvalidArgumentException("Script <code>$shortPath</code> doesn't exist!");
+ }
+
+ require $path;
+
+ $classFragment = substr($scriptName, 0, strpos($scriptName, '.'));
+ $className = 'helper_plugin_bureaucracy_handler_' . $classFragment;
+
+ $deprecatedClassName = 'bureaucracy_handler_' . $classFragment;
+ if (!class_exists($className) && class_exists($deprecatedClassName)) {
+ msg("Please change this script's class-name to <code>$className</code>.
+Your current scheme <code>$deprecatedClassName</code> is deprecated and will stop working in the future.", 2);
+ $className = $deprecatedClassName;
+ }
+
+ /** @var dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface $handler */
+ $handler = new $className;
+
+ if (!is_a($handler, dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface::class)) {
+ throw new InvalidArgumentException('The handler must implement the interface <code>dokuwiki\\plugin\\bureaucracy\\interfaces\\bureaucracy_handler_interface</code> !');
+ }
+
+ return $handler->handleData($fields, $thanks);
+ }
+
+ /**
+ * @param $scriptName
+ *
+ * @return bool
+ */
+ protected function validateScriptName($scriptName) {
+ $valid = preg_match($this->scriptNamePattern, $scriptName);
+ return $valid === 1;
+ }
+
+}