Failed Conditions
Push — adminEvent ( 64cdf7 )
by Andreas
16:16
created

inc/Ui/Admin.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace dokuwiki\Ui;
3
4
/**
5
 * Class Admin
6
 *
7
 * Displays the Admin screen
8
 *
9
 * @package dokuwiki\Ui
10
 * @author Andreas Gohr <[email protected]>
11
 * @author Håkan Sandell <[email protected]>
12
 */
13
class Admin extends Ui {
14
15
    protected $forAdmins = array('usermanager', 'acl', 'extension', 'config', 'styling');
16
    protected $forManagers = array('revert', 'popularity');
17
    /** @var array[] */
18
    protected $menu;
19
20
    /**
21
     * Display the UI element
22
     *
23
     * @return void
24
     */
25
    public function show() {
26
        $this->menu = $this->getPluginList();
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->getPluginList() of type array<string,array,{"adm...rray","other":"array"}> is incompatible with the declared type array<integer,array> of property $menu.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
27
        echo '<div class="ui-admin">';
28
        echo p_locale_xhtml('admin');
29
        $this->showSecurityCheck();
30
        $this->showMenu('admin');
31
        $this->showMenu('manager');
32
        $this->showVersion();
33
        $this->showMenu('other');
34
        echo '</div>';
35
    }
36
37
    /**
38
     * Show the given menu of available plugins
39
     *
40
     * @param string $type admin|manager|other
41
     */
42
    protected function showMenu($type) {
43
        if (!$this->menu[$type]) return;
44
45
        if ($type === 'other') {
46
            echo p_locale_xhtml('adminplugins');
47
            $class = 'admin_plugins';
48
        } else {
49
            $class = 'admin_tasks';
50
        }
51
52
        echo "<ul class=\"$class\">";
53
        foreach ($this->menu[$type] as $item) {
54
            $this->showMenuItem($item);
55
        }
56
        echo '</ul>';
57
    }
58
59
    /**
60
     * Display the DokuWiki version
61
     */
62
    protected function showVersion() {
63
        echo '<div id="admin__version">';
64
        echo getVersion();
65
        echo '</div>';
66
    }
67
68
    /**
69
     * data security check
70
     *
71
     * simple check if the 'savedir' is relative and accessible when appended to DOKU_URL
72
     *
73
     * it verifies either:
74
     *   'savedir' has been moved elsewhere, or
75
     *   has protection to prevent the webserver serving files from it
76
     */
77
    protected function showSecurityCheck() {
78
        global $conf;
79
        if(substr($conf['savedir'], 0, 2) !== './') return;
80
        echo '<a style="border:none; float:right;"
81
                href="http://www.dokuwiki.org/security#web_access_security">
82
                <img src="' . DOKU_URL . $conf['savedir'] .
83
                '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png" 
84
                alt="Your data directory seems to be protected properly."
85
                onerror="this.parentNode.style.display=\'none\'" /></a>';
86
    }
87
88
    /**
89
     * Display a single Admin menu item
90
     *
91
     * @param array $item
92
     */
93
    protected function showMenuItem($item) {
94
        global $ID;
95
        if(blank($item['prompt'])) return;
96
        echo '<li><div class="li">';
97
        echo '<a href="' . wl($ID, 'do=admin&amp;page=' . $item['plugin']) . '">';
98
        echo '<span class="icon">';
99
        echo inlineSVG($item['icon']);
100
        echo '</span>';
101
        echo '<span class="prompt">';
102
        echo $item['prompt'];
103
        echo '</span>';
104
        echo '</a>';
105
        echo '</div></li>';
106
    }
107
108
    /**
109
     * Build  list of admin functions from the plugins that handle them
110
     *
111
     * Checks the current permissions to decide on manager or admin plugins
112
     *
113
     * @return array list of plugins with their properties
114
     */
115
    protected function getPluginList() {
116
        global $conf;
117
118
        $pluginlist = plugin_list('admin');
119
        $menu = ['admin' => [], 'manager' => [], 'other' => []];
120
121
        foreach($pluginlist as $p) {
122
            /** @var \DokuWiki_Admin_Plugin $obj */
123
            if (($obj = plugin_load('admin', $p)) === null) continue;
124
125
            // check permissions
126
            if (!$obj->isAccessibleByCurrentUser()) continue;
127
128
            if (in_array($p, $this->forAdmins, true)) {
129
                $type = 'admin';
130
            } elseif (in_array($p, $this->forManagers, true)){
131
                $type = 'manager';
132
            } else {
133
                $type = 'other';
134
            }
135
136
            $menu[$type][$p] = array(
137
                'plugin' => $p,
138
                'prompt' => $obj->getMenuText($conf['lang']),
139
                'icon' => $obj->getMenuIcon(),
140
                'sort' => $obj->getMenuSort(),
141
            );
142
        }
143
144
        // sort by name, then sort
145
        uasort($menu['admin'], [$this, 'menuSort']);
146
        uasort($menu['manager'], [$this, 'menuSort']);
147
        uasort($menu['other'], [$this, 'menuSort']);
148
149
        return $menu;
150
    }
151
152
    /**
153
     * Custom sorting for admin menu
154
     *
155
     * We sort alphabetically first, then by sort value
156
     *
157
     * @param array $a
158
     * @param array $b
159
     * @return int
160
     */
161
    protected function menuSort ($a, $b) {
162
        $strcmp = strcasecmp($a['prompt'], $b['prompt']);
163
        if($strcmp != 0) return $strcmp;
164
        if($a['sort'] === $b['sort']) return 0;
165
        return ($a['sort'] < $b['sort']) ? -1 : 1;
166
    }
167
}
168