[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Ui/ -> Admin.php (source)

   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 <andi@splitbrain.org>
  11   * @author HÃ¥kan Sandell <hakan.sandell@home.se>
  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();
  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          $img = DOKU_URL . $conf['savedir'] .
  81              '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png';
  82          echo '<a style="border:none; float:right;"
  83                  href="http://www.dokuwiki.org/security#web_access_security">
  84                  <img src="' . $img . '" 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\Extension\AdminPlugin $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  }