11b552e87SSzymon Olewniczak<?php 21b552e87SSzymon Olewniczak/** 31b552e87SSzymon Olewniczak * DokuWiki Plugin watchcycle (Admin Component) 41b552e87SSzymon Olewniczak * 51b552e87SSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 61b552e87SSzymon Olewniczak * @author Szymon Olewniczak <dokuwiki@cosmocode.de> 71b552e87SSzymon Olewniczak */ 81b552e87SSzymon Olewniczak 91b552e87SSzymon Olewniczak// must be run within Dokuwiki 101b552e87SSzymon Olewniczakif (!defined('DOKU_INC')) { 111b552e87SSzymon Olewniczak die(); 121b552e87SSzymon Olewniczak} 131b552e87SSzymon Olewniczak 141b552e87SSzymon Olewniczakclass admin_plugin_approve extends DokuWiki_Admin_Plugin 151b552e87SSzymon Olewniczak{ 161b552e87SSzymon Olewniczak 171b552e87SSzymon Olewniczak /** @var helper_plugin_sqlite */ 181b552e87SSzymon Olewniczak protected $sqlite; 191b552e87SSzymon Olewniczak 201b552e87SSzymon Olewniczak /** @var helper_plugin_approve */ 211b552e87SSzymon Olewniczak protected $helper; 221b552e87SSzymon Olewniczak 231b552e87SSzymon Olewniczak /** 241b552e87SSzymon Olewniczak * @return helper_plugin_sqlite 251b552e87SSzymon Olewniczak */ 261b552e87SSzymon Olewniczak protected function sqlite() { 271b552e87SSzymon Olewniczak if (!$this->sqlite) { 281b552e87SSzymon Olewniczak /** @var helper_plugin_approve_db $db_helper */ 291b552e87SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 301b552e87SSzymon Olewniczak $this->sqlite = $db_helper->getDB(); 311b552e87SSzymon Olewniczak } 321b552e87SSzymon Olewniczak return $this->sqlite; 331b552e87SSzymon Olewniczak } 341b552e87SSzymon Olewniczak 351b552e87SSzymon Olewniczak /** 361b552e87SSzymon Olewniczak * @return helper_plugin_approve 371b552e87SSzymon Olewniczak */ 381b552e87SSzymon Olewniczak protected function helper() { 391b552e87SSzymon Olewniczak if (!$this->helper) { 401b552e87SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 411b552e87SSzymon Olewniczak $this->helper = $helper; 421b552e87SSzymon Olewniczak } 431b552e87SSzymon Olewniczak return $this->helper; 441b552e87SSzymon Olewniczak } 451b552e87SSzymon Olewniczak 461b552e87SSzymon Olewniczak /** 471b552e87SSzymon Olewniczak * @return int sort number in admin menu 481b552e87SSzymon Olewniczak */ 491b552e87SSzymon Olewniczak public function getMenuSort() 501b552e87SSzymon Olewniczak { 511b552e87SSzymon Olewniczak return 1; 521b552e87SSzymon Olewniczak } 531b552e87SSzymon Olewniczak 54086ec97fSSzymon Olewniczak protected function getPages() { 55086ec97fSSzymon Olewniczak global $conf; 56086ec97fSSzymon Olewniczak $datadir = $conf['datadir']; 57086ec97fSSzymon Olewniczak if (substr($datadir, -1) != '/') { 58086ec97fSSzymon Olewniczak $datadir .= '/'; 59086ec97fSSzymon Olewniczak } 60086ec97fSSzymon Olewniczak 61086ec97fSSzymon Olewniczak $directory = new RecursiveDirectoryIterator($datadir, FilesystemIterator::SKIP_DOTS); 62086ec97fSSzymon Olewniczak $iterator = new RecursiveIteratorIterator($directory); 63086ec97fSSzymon Olewniczak 64086ec97fSSzymon Olewniczak $pages = []; 657e838775SSzymon Olewniczak /** @var SplFileInfo $fileinfo */ 66086ec97fSSzymon Olewniczak foreach ($iterator as $fileinfo) { 67086ec97fSSzymon Olewniczak if (!$fileinfo->isFile()) continue; 68086ec97fSSzymon Olewniczak 697e838775SSzymon Olewniczak $path = $fileinfo->getPathname(); 70086ec97fSSzymon Olewniczak //remove .txt 717e838775SSzymon Olewniczak $id = str_replace('/', ':', substr($path, strlen($datadir), -4)); 727e838775SSzymon Olewniczak $pages[] = $id; 73086ec97fSSzymon Olewniczak } 74086ec97fSSzymon Olewniczak 75086ec97fSSzymon Olewniczak return $pages; 76086ec97fSSzymon Olewniczak } 77086ec97fSSzymon Olewniczak 78086ec97fSSzymon Olewniczak protected function updatePage() 79086ec97fSSzymon Olewniczak { 80086ec97fSSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer'); 81086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 82086ec97fSSzymon Olewniczak 83086ec97fSSzymon Olewniczak $weighted_assigments = []; 84086ec97fSSzymon Olewniczak foreach ($assignments as $assignment) { 85086ec97fSSzymon Olewniczak $ns = $assignment['namespace']; 86086ec97fSSzymon Olewniczak //more general namespaces are overridden by more specific ones. 87086ec97fSSzymon Olewniczak if (substr($ns, -1) == '*') { 88086ec97fSSzymon Olewniczak $weight = substr_count($ns, ':'); 89086ec97fSSzymon Olewniczak } else { 90086ec97fSSzymon Olewniczak $weight = PHP_INT_MAX; 91086ec97fSSzymon Olewniczak } 92086ec97fSSzymon Olewniczak 93086ec97fSSzymon Olewniczak $assignment['weight'] = $weight; 94086ec97fSSzymon Olewniczak $weighted_assigments[] = $assignment; 95086ec97fSSzymon Olewniczak } 96086ec97fSSzymon Olewniczak array_multisort(array_column($weighted_assigments, 'weight'), $weighted_assigments); 97086ec97fSSzymon Olewniczak 987e838775SSzymon Olewniczak $approvePages = []; 99086ec97fSSzymon Olewniczak $wikiPages = $this->getPages(); 100086ec97fSSzymon Olewniczak foreach ($weighted_assigments as $assignment) { 1017e838775SSzymon Olewniczak $ns = ltrim($assignment['namespace'], ':'); 102086ec97fSSzymon Olewniczak $maintainer = $assignment['maintainer']; 103086ec97fSSzymon Olewniczak if (substr($ns, -2) == '**') { 104086ec97fSSzymon Olewniczak //remove '**' 105086ec97fSSzymon Olewniczak $ns = substr($ns, 0, -2); 1067e838775SSzymon Olewniczak foreach ($wikiPages as $id) { 1077e838775SSzymon Olewniczak if (substr($id, 0, strlen($ns)) == $ns) { 1087e838775SSzymon Olewniczak $approvePages[$id] = $maintainer; 109086ec97fSSzymon Olewniczak } 1107e838775SSzymon Olewniczak } 1117e838775SSzymon Olewniczak } elseif (substr($ns, -1) == '*') { 112086ec97fSSzymon Olewniczak //remove '*' 1137e838775SSzymon Olewniczak $ns = substr($ns, 0, -1); 1147e838775SSzymon Olewniczak foreach ($wikiPages as $id) { 1157e838775SSzymon Olewniczak $noNS = substr($id, strlen($id)); 1167e838775SSzymon Olewniczak if (strpos($noNS, ':') === FALSE && 1177e838775SSzymon Olewniczak substr($id, 0, strlen($ns)) == $ns) { 1187e838775SSzymon Olewniczak $approvePages[$id] = $maintainer; 1197e838775SSzymon Olewniczak } 1207e838775SSzymon Olewniczak } 121086ec97fSSzymon Olewniczak } else { 1227e838775SSzymon Olewniczak $approvePages[$ns] = $maintainer; 123086ec97fSSzymon Olewniczak } 124086ec97fSSzymon Olewniczak } 125086ec97fSSzymon Olewniczak 1267e838775SSzymon Olewniczak //clean current settings 1277e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM page'); 1287e838775SSzymon Olewniczak $no_apr_namespace = $this->helper()->no_apr_namespace(); 1297e838775SSzymon Olewniczak foreach ($approvePages as $id => $maintainer) { 1307e838775SSzymon Olewniczak $in_hidden_namespace = $this->helper()->in_hidden_namespace($id, $no_apr_namespace); 1317e838775SSzymon Olewniczak $hidden = $in_hidden_namespace ? '1' : '0'; 1327e838775SSzymon Olewniczak if (blank($maintainer)) { 1337e838775SSzymon Olewniczak $q = 'INSERT INTO page(page,hidden) VALUES (?,?)'; 1347e838775SSzymon Olewniczak $this->sqlite()->query($q, $id, $hidden); 1357e838775SSzymon Olewniczak } else { 1367e838775SSzymon Olewniczak $q = 'INSERT INTO page(page,maintainer,hidden) VALUES (?,?,?)'; 1377e838775SSzymon Olewniczak $this->sqlite()->query($q, $id, $maintainer, $hidden); 1387e838775SSzymon Olewniczak } 1397e838775SSzymon Olewniczak } 1407e838775SSzymon Olewniczak 141086ec97fSSzymon Olewniczak } 142086ec97fSSzymon Olewniczak 1431b552e87SSzymon Olewniczak /** 1441b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 1451b552e87SSzymon Olewniczak */ 1461b552e87SSzymon Olewniczak public function handle() 1471b552e87SSzymon Olewniczak { 148086ec97fSSzymon Olewniczak global $ID; 149086ec97fSSzymon Olewniczak 1501b552e87SSzymon Olewniczak /* @var Input */ 1511b552e87SSzymon Olewniczak global $INPUT; 1521b552e87SSzymon Olewniczak 153086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 154086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 155086ec97fSSzymon Olewniczak //insert empty string as NULL 156086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 1577e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 158086ec97fSSzymon Olewniczak $this->updatePage(); 159086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 160086ec97fSSzymon Olewniczak if (blank($assignment['maintainer'])) { 161086ec97fSSzymon Olewniczak $q = 'INSERT INTO maintainer(namespace) VALUES (?)'; 1627e838775SSzymon Olewniczak $this->sqlite()->query($q, $assignment['assign']); 163086ec97fSSzymon Olewniczak } else { 164086ec97fSSzymon Olewniczak $q = 'INSERT INTO maintainer(namespace,maintainer) VALUES (?,?)'; 1657e838775SSzymon Olewniczak $this->sqlite()->query($q, $assignment['assign'], $assignment['maintainer']); 1661b552e87SSzymon Olewniczak } 167086ec97fSSzymon Olewniczak $this->updatePage(); 1681b552e87SSzymon Olewniczak } 169086ec97fSSzymon Olewniczak 170086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1711b552e87SSzymon Olewniczak } 1721b552e87SSzymon Olewniczak } 1731b552e87SSzymon Olewniczak 1741b552e87SSzymon Olewniczak /** 1751b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1761b552e87SSzymon Olewniczak */ 1771b552e87SSzymon Olewniczak public function html() 1781b552e87SSzymon Olewniczak { 1791b552e87SSzymon Olewniczak global $ID; 1807e838775SSzymon Olewniczak /* @var DokuWiki_Auth_Plugin $auth */ 181086ec97fSSzymon Olewniczak global $auth; 1821b552e87SSzymon Olewniczak 183086ec97fSSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer'); 184086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 1851b552e87SSzymon Olewniczak 186086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1871b552e87SSzymon Olewniczak 188086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 189086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 190086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 191086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 192086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1931b552e87SSzymon Olewniczak 194086ec97fSSzymon Olewniczak // header 195086ec97fSSzymon Olewniczak echo '<tr>'; 196086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 197086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_maintainer').'</th>'; 198086ec97fSSzymon Olewniczak echo '<th></th>'; 199086ec97fSSzymon Olewniczak echo '</tr>'; 2001b552e87SSzymon Olewniczak 201086ec97fSSzymon Olewniczak // existing assignments 202086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 203086ec97fSSzymon Olewniczak $id = $assignment['id']; 204086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 205086ec97fSSzymon Olewniczak $maintainer = $assignment['maintainer'] ? $assignment['maintainer'] : '---'; 2061b552e87SSzymon Olewniczak 207086ec97fSSzymon Olewniczak $link = wl( 208086ec97fSSzymon Olewniczak $ID, array( 2091b552e87SSzymon Olewniczak 'do' => 'admin', 210086ec97fSSzymon Olewniczak 'page' => 'approve', 211086ec97fSSzymon Olewniczak 'action' => 'delete', 212086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 213086ec97fSSzymon Olewniczak 'assignment[id]' => $id 214086ec97fSSzymon Olewniczak ) 215086ec97fSSzymon Olewniczak ); 2161b552e87SSzymon Olewniczak 217086ec97fSSzymon Olewniczak echo '<tr>'; 218086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 219*c7d53eabSSzymon Olewniczak $user = $auth->getUserData($maintainer); 220*c7d53eabSSzymon Olewniczak if ($user) { 221*c7d53eabSSzymon Olewniczak echo '<td>' . hsc($user['name']) . '</td>'; 222*c7d53eabSSzymon Olewniczak } else { 223086ec97fSSzymon Olewniczak echo '<td>' . hsc($maintainer) . '</td>'; 224*c7d53eabSSzymon Olewniczak } 225086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 226086ec97fSSzymon Olewniczak echo '</tr>'; 2271b552e87SSzymon Olewniczak } 2281b552e87SSzymon Olewniczak 229086ec97fSSzymon Olewniczak // new assignment form 230086ec97fSSzymon Olewniczak echo '<tr>'; 231086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 232086ec97fSSzymon Olewniczak echo '<td>'; 233086ec97fSSzymon Olewniczak echo '<select name="assignment[maintainer]">'; 234086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 235086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 236086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 2371b552e87SSzymon Olewniczak } 238086ec97fSSzymon Olewniczak echo '</select>'; 239086ec97fSSzymon Olewniczak echo '</td>'; 240086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 241086ec97fSSzymon Olewniczak echo '</tr>'; 2421b552e87SSzymon Olewniczak 243086ec97fSSzymon Olewniczak echo '</table>'; 2441b552e87SSzymon Olewniczak } 2451b552e87SSzymon Olewniczak} 2461b552e87SSzymon Olewniczak 2471b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 248