1 <?php
2 
3 /**
4  * Utilities for handling plugins
5  *
6  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7  * @author     Andreas Gohr <andi@splitbrain.org>
8  */
9 
10 // plugin related constants
11 use dokuwiki\Extension\AdminPlugin;
12 use dokuwiki\Extension\PluginController;
13 use dokuwiki\Extension\PluginInterface;
14 
15 if (!defined('DOKU_PLUGIN'))  define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
16 // note that only [a-z0-9]+ is officially supported,
17 // this is only to support plugins that don't follow these conventions, too
18 if (!defined('DOKU_PLUGIN_NAME_REGEX')) define('DOKU_PLUGIN_NAME_REGEX', '[a-zA-Z0-9\x7f-\xff]+');
19 
20 /**
21  * Original plugin functions, remain for backwards compatibility
22  */
23 
24 /**
25  * Return list of available plugins
26  *
27  * @param string $type type of plugins; empty string for all
28  * @param bool $all; true to retrieve all, false to retrieve only enabled plugins
29  * @return array with plugin names or plugin component names
30  */
31 function plugin_list($type = '', $all = false)
32 {
33     /** @var $plugin_controller PluginController */
34     global $plugin_controller;
35     $plugins = $plugin_controller->getList($type, $all);
36     sort($plugins, SORT_NATURAL | SORT_FLAG_CASE);
37     return $plugins;
38 }
39 
40 /**
41  * Returns plugin object
42  * Returns only new instances of a plugin when $new is true or if plugin is not Singleton,
43  * otherwise an already loaded instance.
44  *
45  * @param  $type     string type of plugin to load
46  * @param  $name     string name of the plugin to load
47  * @param  $new      bool   true to return a new instance of the plugin, false to use an already loaded instance
48  * @param  $disabled bool   true to load even disabled plugins
49  * @return PluginInterface|null  the plugin object or null on failure
50  */
51 function plugin_load($type, $name, $new = false, $disabled = false)
52 {
53     /** @var $plugin_controller PluginController */
54     global $plugin_controller;
55     return $plugin_controller->load($type, $name, $new, $disabled);
56 }
57 
58 /**
59  * Whether plugin is disabled
60  *
61  * @param string $plugin name of plugin
62  * @return bool true disabled, false enabled
63  */
64 function plugin_isdisabled($plugin)
65 {
66     /** @var $plugin_controller PluginController */
67     global $plugin_controller;
68     return !$plugin_controller->isEnabled($plugin);
69 }
70 
71 /**
72  * Enable the plugin
73  *
74  * @param string $plugin name of plugin
75  * @return bool true saving succeed, false saving failed
76  */
77 function plugin_enable($plugin)
78 {
79     /** @var $plugin_controller PluginController */
80     global $plugin_controller;
81     return $plugin_controller->enable($plugin);
82 }
83 
84 /**
85  * Disable the plugin
86  *
87  * @param string $plugin name of plugin
88  * @return bool  true saving succeed, false saving failed
89  */
90 function plugin_disable($plugin)
91 {
92     /** @var $plugin_controller PluginController */
93     global $plugin_controller;
94     return $plugin_controller->disable($plugin);
95 }
96 
97 /**
98  * Returns directory name of plugin
99  *
100  * @param string $plugin name of plugin
101  * @return string name of directory
102  * @deprecated 2018-07-20
103  */
104 function plugin_directory($plugin)
105 {
106     dbg_deprecated('$plugin directly');
107     return $plugin;
108 }
109 
110 /**
111  * Returns cascade of the config files
112  *
113  * @return array with arrays of plugin configs
114  */
115 function plugin_getcascade()
116 {
117     /** @var $plugin_controller PluginController */
118     global $plugin_controller;
119     return $plugin_controller->getCascade();
120 }
121 
122 
123 /**
124  * Return the currently operating admin plugin or null
125  * if not on an admin plugin page
126  *
127  * @return Doku_Plugin_Admin
128  */
129 function plugin_getRequestAdminPlugin()
130 {
131     static $admin_plugin = false;
132     global $ACT,$INPUT,$INFO;
133 
134     if ($admin_plugin === false) {
135         if (($ACT == 'admin') && ($page = $INPUT->str('page', '', true)) != '') {
136             $pluginlist = plugin_list('admin');
137             if (in_array($page, $pluginlist)) {
138                 // attempt to load the plugin
139                 /** @var $admin_plugin AdminPlugin */
140                 $admin_plugin = plugin_load('admin', $page);
141                 // verify
142                 if ($admin_plugin && !$admin_plugin->isAccessibleByCurrentUser()) {
143                     $admin_plugin = null;
144                     $INPUT->remove('page');
145                     msg('For admins only', -1);
146                 }
147             }
148         }
149     }
150 
151     return $admin_plugin;
152 }
153