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 { 807e838775SSzymon Olewniczak //clean current settings 817e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM page'); 82*b1ff32a1SSzymon Olewniczak 83*b1ff32a1SSzymon Olewniczak $wikiPages = $this->getPages(); 847e838775SSzymon Olewniczak $no_apr_namespace = $this->helper()->no_apr_namespace(); 85*b1ff32a1SSzymon Olewniczak $weighted_assignments = $this->helper()->weighted_assignments(); 86*b1ff32a1SSzymon Olewniczak foreach ($wikiPages as $id) { 87*b1ff32a1SSzymon Olewniczak if ($this->helper()->isPageAssigned($id, $maintainer, $weighted_assignments)) { 88*b1ff32a1SSzymon Olewniczak $data = [ 89*b1ff32a1SSzymon Olewniczak 'page' => $id, 90*b1ff32a1SSzymon Olewniczak 'hidden' => $this->helper()->in_hidden_namespace($id, $no_apr_namespace) ? '1' : '0' 91*b1ff32a1SSzymon Olewniczak ]; 92*b1ff32a1SSzymon Olewniczak if (!blank($maintainer)) { 93*b1ff32a1SSzymon Olewniczak $data['maintainer'] = $maintainer; 94*b1ff32a1SSzymon Olewniczak } 95*b1ff32a1SSzymon Olewniczak $this->sqlite()->storeEntry('page', $data); 967e838775SSzymon Olewniczak } 977e838775SSzymon Olewniczak } 987e838775SSzymon Olewniczak 99*b1ff32a1SSzymon Olewniczak// $weighted_assignments = $this->helper()->weighted_assignments(); 100*b1ff32a1SSzymon Olewniczak// 101*b1ff32a1SSzymon Olewniczak// $approvePages = []; 102*b1ff32a1SSzymon Olewniczak// $wikiPages = $this->getPages(); 103*b1ff32a1SSzymon Olewniczak// foreach ($weighted_assignments as $assignment) { 104*b1ff32a1SSzymon Olewniczak// $ns = ltrim($assignment['namespace'], ':'); 105*b1ff32a1SSzymon Olewniczak// $maintainer = $assignment['maintainer']; 106*b1ff32a1SSzymon Olewniczak// if (substr($ns, -2) == '**') { 107*b1ff32a1SSzymon Olewniczak// //remove '**' 108*b1ff32a1SSzymon Olewniczak// $ns = substr($ns, 0, -2); 109*b1ff32a1SSzymon Olewniczak// foreach ($wikiPages as $id) { 110*b1ff32a1SSzymon Olewniczak// if (substr($id, 0, strlen($ns)) == $ns) { 111*b1ff32a1SSzymon Olewniczak// $approvePages[$id] = $maintainer; 112*b1ff32a1SSzymon Olewniczak// } 113*b1ff32a1SSzymon Olewniczak// } 114*b1ff32a1SSzymon Olewniczak// } elseif (substr($ns, -1) == '*') { 115*b1ff32a1SSzymon Olewniczak// //remove '*' 116*b1ff32a1SSzymon Olewniczak// $ns = substr($ns, 0, -1); 117*b1ff32a1SSzymon Olewniczak// foreach ($wikiPages as $id) { 118*b1ff32a1SSzymon Olewniczak// $noNS = substr($id, strlen($id)); 119*b1ff32a1SSzymon Olewniczak// if (strpos($noNS, ':') === FALSE && 120*b1ff32a1SSzymon Olewniczak// substr($id, 0, strlen($ns)) == $ns) { 121*b1ff32a1SSzymon Olewniczak// $approvePages[$id] = $maintainer; 122*b1ff32a1SSzymon Olewniczak// } 123*b1ff32a1SSzymon Olewniczak// } 124*b1ff32a1SSzymon Olewniczak// } else { 125*b1ff32a1SSzymon Olewniczak// $approvePages[$ns] = $maintainer; 126*b1ff32a1SSzymon Olewniczak// } 127*b1ff32a1SSzymon Olewniczak// } 128*b1ff32a1SSzymon Olewniczak// 129*b1ff32a1SSzymon Olewniczak// //clean current settings 130*b1ff32a1SSzymon Olewniczak// $this->sqlite()->query('DELETE FROM page'); 131*b1ff32a1SSzymon Olewniczak// $no_apr_namespace = $this->helper()->no_apr_namespace(); 132*b1ff32a1SSzymon Olewniczak// foreach ($approvePages as $id => $maintainer) { 133*b1ff32a1SSzymon Olewniczak// $data = [ 134*b1ff32a1SSzymon Olewniczak// 'page' => $id, 135*b1ff32a1SSzymon Olewniczak// 'hidden' => $this->helper()->in_hidden_namespace($id, $no_apr_namespace) 136*b1ff32a1SSzymon Olewniczak// ]; 137*b1ff32a1SSzymon Olewniczak// if (!blank($maintainer)) { 138*b1ff32a1SSzymon Olewniczak// $data['maintainer'] = $maintainer; 139*b1ff32a1SSzymon Olewniczak// } 140*b1ff32a1SSzymon Olewniczak// $this->sqlite()->storeEntry('page', $data); 141*b1ff32a1SSzymon Olewniczak// } 142*b1ff32a1SSzymon Olewniczak 143086ec97fSSzymon Olewniczak } 144086ec97fSSzymon Olewniczak 1451b552e87SSzymon Olewniczak /** 1461b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 1471b552e87SSzymon Olewniczak */ 1481b552e87SSzymon Olewniczak public function handle() 1491b552e87SSzymon Olewniczak { 150086ec97fSSzymon Olewniczak global $ID; 151086ec97fSSzymon Olewniczak 1521b552e87SSzymon Olewniczak /* @var Input */ 1531b552e87SSzymon Olewniczak global $INPUT; 1541b552e87SSzymon Olewniczak 155086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 156086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 157086ec97fSSzymon Olewniczak //insert empty string as NULL 158086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 1597e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 160086ec97fSSzymon Olewniczak $this->updatePage(); 161086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 162*b1ff32a1SSzymon Olewniczak $data = [ 163*b1ff32a1SSzymon Olewniczak 'namespace' => $assignment['assign'] 164*b1ff32a1SSzymon Olewniczak ]; 165*b1ff32a1SSzymon Olewniczak if (!blank($assignment['maintainer'])) { 166*b1ff32a1SSzymon Olewniczak $data['maintainer'] = $assignment['maintainer']; 1671b552e87SSzymon Olewniczak } 168*b1ff32a1SSzymon Olewniczak $this->sqlite()->storeEntry('maintainer', $data); 169*b1ff32a1SSzymon Olewniczak 170086ec97fSSzymon Olewniczak $this->updatePage(); 1711b552e87SSzymon Olewniczak } 172086ec97fSSzymon Olewniczak 173086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1741b552e87SSzymon Olewniczak } 1751b552e87SSzymon Olewniczak } 1761b552e87SSzymon Olewniczak 1771b552e87SSzymon Olewniczak /** 1781b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1791b552e87SSzymon Olewniczak */ 1801b552e87SSzymon Olewniczak public function html() 1811b552e87SSzymon Olewniczak { 1821b552e87SSzymon Olewniczak global $ID; 1837e838775SSzymon Olewniczak /* @var DokuWiki_Auth_Plugin $auth */ 184086ec97fSSzymon Olewniczak global $auth; 1851b552e87SSzymon Olewniczak 186086ec97fSSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer'); 187086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 1881b552e87SSzymon Olewniczak 189086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1901b552e87SSzymon Olewniczak 191086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 192086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 193086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 194086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 195086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1961b552e87SSzymon Olewniczak 197086ec97fSSzymon Olewniczak // header 198086ec97fSSzymon Olewniczak echo '<tr>'; 199086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 200086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_maintainer').'</th>'; 201086ec97fSSzymon Olewniczak echo '<th></th>'; 202086ec97fSSzymon Olewniczak echo '</tr>'; 2031b552e87SSzymon Olewniczak 204086ec97fSSzymon Olewniczak // existing assignments 205086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 206086ec97fSSzymon Olewniczak $id = $assignment['id']; 207086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 208086ec97fSSzymon Olewniczak $maintainer = $assignment['maintainer'] ? $assignment['maintainer'] : '---'; 2091b552e87SSzymon Olewniczak 210086ec97fSSzymon Olewniczak $link = wl( 211086ec97fSSzymon Olewniczak $ID, array( 2121b552e87SSzymon Olewniczak 'do' => 'admin', 213086ec97fSSzymon Olewniczak 'page' => 'approve', 214086ec97fSSzymon Olewniczak 'action' => 'delete', 215086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 216086ec97fSSzymon Olewniczak 'assignment[id]' => $id 217086ec97fSSzymon Olewniczak ) 218086ec97fSSzymon Olewniczak ); 2191b552e87SSzymon Olewniczak 220086ec97fSSzymon Olewniczak echo '<tr>'; 221086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 222c7d53eabSSzymon Olewniczak $user = $auth->getUserData($maintainer); 223c7d53eabSSzymon Olewniczak if ($user) { 224c7d53eabSSzymon Olewniczak echo '<td>' . hsc($user['name']) . '</td>'; 225c7d53eabSSzymon Olewniczak } else { 226086ec97fSSzymon Olewniczak echo '<td>' . hsc($maintainer) . '</td>'; 227c7d53eabSSzymon Olewniczak } 228086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 229086ec97fSSzymon Olewniczak echo '</tr>'; 2301b552e87SSzymon Olewniczak } 2311b552e87SSzymon Olewniczak 232086ec97fSSzymon Olewniczak // new assignment form 233086ec97fSSzymon Olewniczak echo '<tr>'; 234086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 235086ec97fSSzymon Olewniczak echo '<td>'; 236086ec97fSSzymon Olewniczak echo '<select name="assignment[maintainer]">'; 237086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 238086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 239086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 2401b552e87SSzymon Olewniczak } 241086ec97fSSzymon Olewniczak echo '</select>'; 242086ec97fSSzymon Olewniczak echo '</td>'; 243086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 244086ec97fSSzymon Olewniczak echo '</tr>'; 2451b552e87SSzymon Olewniczak 246086ec97fSSzymon Olewniczak echo '</table>'; 2471b552e87SSzymon Olewniczak } 2481b552e87SSzymon Olewniczak} 2491b552e87SSzymon Olewniczak 2501b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 251