Failed Conditions
Pull Request — psr2 (#2426)
by Andreas
09:22 queued 06:07
created

inc/Ui/Admin.php (2 issues)

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 $menu;
16
17
    /**
18
     * Display the UI element
19
     *
20
     * @return void
21
     */
22
    public function show() {
23
        $this->menu = $this->getPluginList();
24
        echo '<div class="ui-admin">';
25
        echo p_locale_xhtml('admin');
26
        $this->showSecurityCheck();
27
        $this->showAdminMenu();
28
        $this->showManagerMenu();
29
        $this->showVersion();
30
        $this->showPluginMenu();
31
        echo '</div>';
32
    }
33
34
    /**
35
     * Display the standard admin tasks
36
     */
37
    protected function showAdminMenu() {
38
        /** @var \dokuwiki\Extension\AuthPlugin $auth */
39
        global $auth;
40
        global $INFO;
41
42
        if(!$INFO['isadmin']) return;
43
44
        // user manager only if the auth backend supports it
45
        if(!$auth || !$auth->canDo('getUsers') ) {
46
            if(isset($this->menu['usermanager'])) unset($this->menu['usermanager']);
47
        }
48
49
        echo '<ul class="admin_tasks">';
50
        foreach(array('usermanager','acl', 'extension', 'config', 'styling') as $plugin) {
51
            if(!isset($this->menu[$plugin])) continue;
52
            $this->showMenuItem($this->menu[$plugin]);
53
            unset($this->menu[$plugin]);
54
        }
55
        echo '</ul>';
56
    }
57
58
    /**
59
     * Display the standard manager tasks
60
     */
61
    protected function showManagerMenu() {
62
        echo '<ul class="admin_tasks">';
63
        foreach(array('revert','popularity') as $plugin) {
64
            if(!isset($this->menu[$plugin])) continue;
65
            $this->showMenuItem($this->menu[$plugin]);
66
            unset($this->menu[$plugin]);
67
        }
68
        echo '</ul>';
69
    }
70
71
    /**
72
     * Display all the remaining plugins
73
     */
74
    protected function showPluginMenu() {
75
        if(!count($this->menu)) return;
76
        echo p_locale_xhtml('adminplugins');
77
        echo '<ul class="admin_plugins">';
78
        foreach ($this->menu as $item) {
79
            $this->showMenuItem($item);
80
        }
81
        echo '</ul>';
82
    }
83
84
    /**
85
     * Display the DokuWiki version
86
     */
87
    protected function showVersion() {
88
        echo '<div id="admin__version">';
89
        echo getVersion();
90
        echo '</div>';
91
    }
92
93
    /**
94
     * data security check
95
     *
96
     * simple check if the 'savedir' is relative and accessible when appended to DOKU_URL
97
     *
98
     * it verifies either:
99
     *   'savedir' has been moved elsewhere, or
100
     *   has protection to prevent the webserver serving files from it
101
     */
102
    protected function showSecurityCheck() {
103
        global $conf;
104
        if(substr($conf['savedir'], 0, 2) !== './') return;
105
        $img = DOKU_URL . $conf['savedir'] .
106
            '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png';
107
        echo '<a style="border:none; float:right;"
108
                href="http://www.dokuwiki.org/security#web_access_security">
109
                <img src="' . $img . '" alt="Your data directory seems to be protected properly."
110
                onerror="this.parentNode.style.display=\'none\'" /></a>';
111
    }
112
113
    /**
114
     * Display a single Admin menu item
115
     *
116
     * @param array $item
117
     */
118
    protected function showMenuItem($item) {
119
        global $ID;
120
        if(blank($item['prompt'])) return;
121
        echo '<li><div class="li">';
122
        echo '<a href="' . wl($ID, 'do=admin&amp;page=' . $item['plugin']) . '">';
123
        echo '<span class="icon">';
124
        echo inlineSVG($item['icon']);
125
        echo '</span>';
126
        echo '<span class="prompt">';
127
        echo $item['prompt'];
128
        echo '</span>';
129
        echo '</a>';
130
        echo '</div></li>';
131
    }
132
133
    /**
134
     * Build  list of admin functions from the plugins that handle them
135
     *
136
     * Checks the current permissions to decide on manager or admin plugins
137
     *
138
     * @return array list of plugins with their properties
139
     */
140
    protected function getPluginList() {
141
        global $INFO;
142
        global $conf;
143
144
        $pluginlist = plugin_list('admin');
0 ignored issues
show
Deprecated Code introduced by
The function plugin_list() has been deprecated with message: 2018-07-20

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
145
        $menu = array();
146
        foreach($pluginlist as $p) {
147
            /** @var \dokuwiki\Extension\AdminPlugin $obj */
148
            if(($obj = plugin_load('admin', $p)) === null) continue;
0 ignored issues
show
Deprecated Code introduced by
The function plugin_load() has been deprecated with message: 2018-07-20 we will probably keep this around for a long time though

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
149
150
            // check permissions
151
            if($obj->forAdminOnly() && !$INFO['isadmin']) continue;
152
153
            $menu[$p] = array(
154
                'plugin' => $p,
155
                'prompt' => $obj->getMenuText($conf['lang']),
156
                'icon' => $obj->getMenuIcon(),
157
                'sort' => $obj->getMenuSort(),
158
            );
159
        }
160
161
        // sort by name, then sort
162
        uasort(
163
            $menu,
164
            function ($a, $b) {
165
                $strcmp = strcasecmp($a['prompt'], $b['prompt']);
166
                if($strcmp != 0) return $strcmp;
167
                if($a['sort'] == $b['sort']) return 0;
168
                return ($a['sort'] < $b['sort']) ? -1 : 1;
169
            }
170
        );
171
172
        return $menu;
173
    }
174
175
}
176