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 54*086ec97fSSzymon Olewniczak protected function getPages() { 55*086ec97fSSzymon Olewniczak global $conf; 56*086ec97fSSzymon Olewniczak $datadir = $conf['datadir']; 57*086ec97fSSzymon Olewniczak if (substr($datadir, -1) != '/') { 58*086ec97fSSzymon Olewniczak $datadir .= '/'; 59*086ec97fSSzymon Olewniczak } 60*086ec97fSSzymon Olewniczak 61*086ec97fSSzymon Olewniczak $directory = new RecursiveDirectoryIterator($datadir, FilesystemIterator::SKIP_DOTS); 62*086ec97fSSzymon Olewniczak $iterator = new RecursiveIteratorIterator($directory); 63*086ec97fSSzymon Olewniczak 64*086ec97fSSzymon Olewniczak $pages = []; 65*086ec97fSSzymon Olewniczak foreach ($iterator as $fileinfo) { 66*086ec97fSSzymon Olewniczak if (!$fileinfo->isFile()) continue; 67*086ec97fSSzymon Olewniczak 68*086ec97fSSzymon Olewniczak $path = $fileinfo->getPath(); 69*086ec97fSSzymon Olewniczak $ns = str_replace('/', ':', substr($path, strlen($datadir))); 70*086ec97fSSzymon Olewniczak 71*086ec97fSSzymon Olewniczak if (!isset($pages[$ns])) { 72*086ec97fSSzymon Olewniczak $pages[$ns] = []; 73*086ec97fSSzymon Olewniczak } 74*086ec97fSSzymon Olewniczak 75*086ec97fSSzymon Olewniczak //remove .txt 76*086ec97fSSzymon Olewniczak $pages[$ns][] = substr($fileinfo->getFilename(), 0, -4); 77*086ec97fSSzymon Olewniczak } 78*086ec97fSSzymon Olewniczak 79*086ec97fSSzymon Olewniczak 80*086ec97fSSzymon Olewniczak return $pages; 81*086ec97fSSzymon Olewniczak } 82*086ec97fSSzymon Olewniczak 83*086ec97fSSzymon Olewniczak protected function updatePage() 84*086ec97fSSzymon Olewniczak { 85*086ec97fSSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer'); 86*086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 87*086ec97fSSzymon Olewniczak 88*086ec97fSSzymon Olewniczak $weighted_assigments = []; 89*086ec97fSSzymon Olewniczak foreach ($assignments as $assignment) { 90*086ec97fSSzymon Olewniczak $ns = $assignment['namespace']; 91*086ec97fSSzymon Olewniczak //more general namespaces are overridden by more specific ones. 92*086ec97fSSzymon Olewniczak if (substr($ns, -1) == '*') { 93*086ec97fSSzymon Olewniczak $weight = substr_count($ns, ':'); 94*086ec97fSSzymon Olewniczak } else { 95*086ec97fSSzymon Olewniczak $weight = PHP_INT_MAX; 96*086ec97fSSzymon Olewniczak } 97*086ec97fSSzymon Olewniczak 98*086ec97fSSzymon Olewniczak $assignment['weight'] = $weight; 99*086ec97fSSzymon Olewniczak $weighted_assigments[] = $assignment; 100*086ec97fSSzymon Olewniczak } 101*086ec97fSSzymon Olewniczak array_multisort(array_column($weighted_assigments, 'weight'), $weighted_assigments); 102*086ec97fSSzymon Olewniczak 103*086ec97fSSzymon Olewniczak $pages = []; 104*086ec97fSSzymon Olewniczak $wikiPages = $this->getPages(); 105*086ec97fSSzymon Olewniczak foreach ($weighted_assigments as $assignment) { 106*086ec97fSSzymon Olewniczak $ns = $assignment['namespace']; 107*086ec97fSSzymon Olewniczak $maintainer = $assignment['maintainer']; 108*086ec97fSSzymon Olewniczak if (substr($ns, -2) == '**') { 109*086ec97fSSzymon Olewniczak //remove '**' 110*086ec97fSSzymon Olewniczak $ns = substr($ns, 0, -2); 111*086ec97fSSzymon Olewniczak $ns = trim($ns, ':'); 112*086ec97fSSzymon Olewniczak foreach ($wikiPages as $page) { 113*086ec97fSSzymon Olewniczak// if (substr($page, 0, strlen($ns)) === $ns) { 114*086ec97fSSzymon Olewniczak// 115*086ec97fSSzymon Olewniczak// } 116*086ec97fSSzymon Olewniczak } 117*086ec97fSSzymon Olewniczak 118*086ec97fSSzymon Olewniczak } elseif (substr($ns, -2) == '*') { 119*086ec97fSSzymon Olewniczak //remove '*' 120*086ec97fSSzymon Olewniczak $ns = substr($ns, 0, -2); 121*086ec97fSSzymon Olewniczak $ns = trim($ns, ':'); 122*086ec97fSSzymon Olewniczak } else { 123*086ec97fSSzymon Olewniczak $ns = trim($ns, ':'); 124*086ec97fSSzymon Olewniczak $pages[$ns] = $maintainer; 125*086ec97fSSzymon Olewniczak } 126*086ec97fSSzymon Olewniczak } 127*086ec97fSSzymon Olewniczak 128*086ec97fSSzymon Olewniczak return true; 129*086ec97fSSzymon Olewniczak } 130*086ec97fSSzymon Olewniczak 1311b552e87SSzymon Olewniczak /** 1321b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 1331b552e87SSzymon Olewniczak */ 1341b552e87SSzymon Olewniczak public function handle() 1351b552e87SSzymon Olewniczak { 136*086ec97fSSzymon Olewniczak global $ID; 137*086ec97fSSzymon Olewniczak 1381b552e87SSzymon Olewniczak /* @var Input */ 1391b552e87SSzymon Olewniczak global $INPUT; 1401b552e87SSzymon Olewniczak 141*086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 142*086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 143*086ec97fSSzymon Olewniczak //insert empty string as NULL 144*086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 145*086ec97fSSzymon Olewniczak $ok = $this->sqlite()->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 146*086ec97fSSzymon Olewniczak if (!$ok) msg('failed to remove pattern', -1); 1471b552e87SSzymon Olewniczak 148*086ec97fSSzymon Olewniczak $this->updatePage(); 149*086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 150*086ec97fSSzymon Olewniczak if (blank($assignment['maintainer'])) { 151*086ec97fSSzymon Olewniczak $q = 'INSERT INTO maintainer(namespace) VALUES (?)'; 152*086ec97fSSzymon Olewniczak $ok = $this->sqlite()->query($q, $assignment['assign']); 153*086ec97fSSzymon Olewniczak } else { 154*086ec97fSSzymon Olewniczak $q = 'INSERT INTO maintainer(namespace,maintainer) VALUES (?,?)'; 155*086ec97fSSzymon Olewniczak $ok = $this->sqlite()->query($q, $assignment['assign'], $assignment['maintainer']); 1561b552e87SSzymon Olewniczak } 1571b552e87SSzymon Olewniczak 158*086ec97fSSzymon Olewniczak if (!$ok) msg('failed to add pattern', -1); 1591b552e87SSzymon Olewniczak 160*086ec97fSSzymon Olewniczak $this->updatePage(); 1611b552e87SSzymon Olewniczak } 162*086ec97fSSzymon Olewniczak 163*086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1641b552e87SSzymon Olewniczak } 1651b552e87SSzymon Olewniczak } 1661b552e87SSzymon Olewniczak 1671b552e87SSzymon Olewniczak /** 1681b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1691b552e87SSzymon Olewniczak */ 1701b552e87SSzymon Olewniczak public function html() 1711b552e87SSzymon Olewniczak { 1721b552e87SSzymon Olewniczak global $lang; 1731b552e87SSzymon Olewniczak 1741b552e87SSzymon Olewniczak global $ID; 175*086ec97fSSzymon Olewniczak /* @var DokuWiki_Auth_Plugin */ 176*086ec97fSSzymon Olewniczak global $auth; 1771b552e87SSzymon Olewniczak 178*086ec97fSSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer'); 179*086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 1801b552e87SSzymon Olewniczak 181*086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1821b552e87SSzymon Olewniczak 183*086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 184*086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 185*086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 186*086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 187*086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1881b552e87SSzymon Olewniczak 189*086ec97fSSzymon Olewniczak // header 190*086ec97fSSzymon Olewniczak echo '<tr>'; 191*086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 192*086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_maintainer').'</th>'; 193*086ec97fSSzymon Olewniczak echo '<th></th>'; 194*086ec97fSSzymon Olewniczak echo '</tr>'; 1951b552e87SSzymon Olewniczak 196*086ec97fSSzymon Olewniczak // existing assignments 197*086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 198*086ec97fSSzymon Olewniczak $id = $assignment['id']; 199*086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 200*086ec97fSSzymon Olewniczak $maintainer = $assignment['maintainer'] ? $assignment['maintainer'] : '---'; 2011b552e87SSzymon Olewniczak 202*086ec97fSSzymon Olewniczak $link = wl( 203*086ec97fSSzymon Olewniczak $ID, array( 2041b552e87SSzymon Olewniczak 'do' => 'admin', 205*086ec97fSSzymon Olewniczak 'page' => 'approve', 206*086ec97fSSzymon Olewniczak 'action' => 'delete', 207*086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 208*086ec97fSSzymon Olewniczak 'assignment[id]' => $id 209*086ec97fSSzymon Olewniczak ) 210*086ec97fSSzymon Olewniczak ); 2111b552e87SSzymon Olewniczak 212*086ec97fSSzymon Olewniczak echo '<tr>'; 213*086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 214*086ec97fSSzymon Olewniczak echo '<td>' . hsc($maintainer) . '</td>'; 215*086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 216*086ec97fSSzymon Olewniczak echo '</tr>'; 2171b552e87SSzymon Olewniczak } 2181b552e87SSzymon Olewniczak 219*086ec97fSSzymon Olewniczak // new assignment form 220*086ec97fSSzymon Olewniczak echo '<tr>'; 221*086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 222*086ec97fSSzymon Olewniczak echo '<td>'; 223*086ec97fSSzymon Olewniczak echo '<select name="assignment[maintainer]">'; 224*086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 225*086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 226*086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 2271b552e87SSzymon Olewniczak } 228*086ec97fSSzymon Olewniczak echo '</select>'; 229*086ec97fSSzymon Olewniczak echo '</td>'; 230*086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 231*086ec97fSSzymon Olewniczak echo '</tr>'; 2321b552e87SSzymon Olewniczak 233*086ec97fSSzymon Olewniczak echo '</table>'; 2341b552e87SSzymon Olewniczak } 2351b552e87SSzymon Olewniczak} 2361b552e87SSzymon Olewniczak 2371b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 238