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 * @return int sort number in admin menu 181b552e87SSzymon Olewniczak */ 191b552e87SSzymon Olewniczak public function getMenuSort() 201b552e87SSzymon Olewniczak { 211b552e87SSzymon Olewniczak return 1; 221b552e87SSzymon Olewniczak } 231b552e87SSzymon Olewniczak 24086ec97fSSzymon Olewniczak protected function getPages() { 25086ec97fSSzymon Olewniczak global $conf; 26086ec97fSSzymon Olewniczak $datadir = $conf['datadir']; 27086ec97fSSzymon Olewniczak if (substr($datadir, -1) != '/') { 28086ec97fSSzymon Olewniczak $datadir .= '/'; 29086ec97fSSzymon Olewniczak } 30086ec97fSSzymon Olewniczak 31086ec97fSSzymon Olewniczak $directory = new RecursiveDirectoryIterator($datadir, FilesystemIterator::SKIP_DOTS); 32086ec97fSSzymon Olewniczak $iterator = new RecursiveIteratorIterator($directory); 33086ec97fSSzymon Olewniczak 34086ec97fSSzymon Olewniczak $pages = []; 357e838775SSzymon Olewniczak /** @var SplFileInfo $fileinfo */ 36086ec97fSSzymon Olewniczak foreach ($iterator as $fileinfo) { 37086ec97fSSzymon Olewniczak if (!$fileinfo->isFile()) continue; 38086ec97fSSzymon Olewniczak 397e838775SSzymon Olewniczak $path = $fileinfo->getPathname(); 40086ec97fSSzymon Olewniczak //remove .txt 417e838775SSzymon Olewniczak $id = str_replace('/', ':', substr($path, strlen($datadir), -4)); 427e838775SSzymon Olewniczak $pages[] = $id; 43086ec97fSSzymon Olewniczak } 44086ec97fSSzymon Olewniczak 45086ec97fSSzymon Olewniczak return $pages; 46086ec97fSSzymon Olewniczak } 47086ec97fSSzymon Olewniczak 480c60a293SSzymon Olewniczak protected function updatePage(helper_plugin_sqlite $sqlite, helper_plugin_approve $helper) 49086ec97fSSzymon Olewniczak { 507e838775SSzymon Olewniczak //clean current settings 510c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM page'); 52b1ff32a1SSzymon Olewniczak 53b1ff32a1SSzymon Olewniczak $wikiPages = $this->getPages(); 540c60a293SSzymon Olewniczak $no_apr_namespace = $helper->no_apr_namespace($sqlite); 550c60a293SSzymon Olewniczak $weighted_assignments = $helper->weighted_assignments($sqlite); 56b1ff32a1SSzymon Olewniczak foreach ($wikiPages as $id) { 570c60a293SSzymon Olewniczak if ($helper->isPageAssigned($sqlite, $id, $approver, $weighted_assignments)) { 58b1ff32a1SSzymon Olewniczak $data = [ 59b1ff32a1SSzymon Olewniczak 'page' => $id, 600c60a293SSzymon Olewniczak 'hidden' => $helper->in_hidden_namespace($sqlite, $id, $no_apr_namespace) ? '1' : '0' 61b1ff32a1SSzymon Olewniczak ]; 6207b13373SSzymon Olewniczak if (!blank($approver)) { 632ce523c6SSzymon Olewniczak $data['approver'] = $approver; 64b1ff32a1SSzymon Olewniczak } 650c60a293SSzymon Olewniczak $sqlite->storeEntry('page', $data); 667e838775SSzymon Olewniczak } 677e838775SSzymon Olewniczak } 68086ec97fSSzymon Olewniczak } 69086ec97fSSzymon Olewniczak 701b552e87SSzymon Olewniczak /** 711b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 721b552e87SSzymon Olewniczak */ 731b552e87SSzymon Olewniczak public function handle() 741b552e87SSzymon Olewniczak { 75086ec97fSSzymon Olewniczak global $ID; 761b552e87SSzymon Olewniczak /* @var Input */ 771b552e87SSzymon Olewniczak global $INPUT; 781b552e87SSzymon Olewniczak 790c60a293SSzymon Olewniczak try { 800c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 810c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 820c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 830c60a293SSzymon Olewniczak } catch (Exception $e) { 840c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 850c60a293SSzymon Olewniczak return; 860c60a293SSzymon Olewniczak } 870c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 880c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 890c60a293SSzymon Olewniczak 90086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 91086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 92086ec97fSSzymon Olewniczak //insert empty string as NULL 93086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 940c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 950c60a293SSzymon Olewniczak $this->updatePage($sqlite, $helper); 96086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 97b1ff32a1SSzymon Olewniczak $data = [ 98b1ff32a1SSzymon Olewniczak 'namespace' => $assignment['assign'] 99b1ff32a1SSzymon Olewniczak ]; 1002ce523c6SSzymon Olewniczak if (!blank($assignment['approver'])) { 1012ce523c6SSzymon Olewniczak $data['approver'] = $assignment['approver']; 102*91f47af0SErik Inge Bolsø } else if (!blank($assignment['approver_fb'])) { 103*91f47af0SErik Inge Bolsø $data['approver'] = $assignment['approver_fb']; 1041b552e87SSzymon Olewniczak } 1050c60a293SSzymon Olewniczak $sqlite->storeEntry('maintainer', $data); 106b1ff32a1SSzymon Olewniczak 1070c60a293SSzymon Olewniczak $this->updatePage($sqlite, $helper); 1081b552e87SSzymon Olewniczak } 109086ec97fSSzymon Olewniczak 110086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1111b552e87SSzymon Olewniczak } 1121b552e87SSzymon Olewniczak } 1131b552e87SSzymon Olewniczak 1141b552e87SSzymon Olewniczak /** 1151b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1161b552e87SSzymon Olewniczak */ 1171b552e87SSzymon Olewniczak public function html() 1181b552e87SSzymon Olewniczak { 1191b552e87SSzymon Olewniczak global $ID; 1207e838775SSzymon Olewniczak /* @var DokuWiki_Auth_Plugin $auth */ 121086ec97fSSzymon Olewniczak global $auth; 1221b552e87SSzymon Olewniczak 1230c60a293SSzymon Olewniczak try { 1240c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 1250c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 1260c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 1270c60a293SSzymon Olewniczak } catch (Exception $e) { 1280c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 1290c60a293SSzymon Olewniczak return; 1300c60a293SSzymon Olewniczak } 1310c60a293SSzymon Olewniczak 1320c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT * FROM maintainer ORDER BY namespace'); 1330c60a293SSzymon Olewniczak $assignments = $sqlite->res2arr($res); 1341b552e87SSzymon Olewniczak 135086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1361b552e87SSzymon Olewniczak 137086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 138086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 139086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 140086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 141086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1421b552e87SSzymon Olewniczak 143086ec97fSSzymon Olewniczak // header 144086ec97fSSzymon Olewniczak echo '<tr>'; 145086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 1462ce523c6SSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_approver').'</th>'; 147086ec97fSSzymon Olewniczak echo '<th></th>'; 148086ec97fSSzymon Olewniczak echo '</tr>'; 1491b552e87SSzymon Olewniczak 150086ec97fSSzymon Olewniczak // existing assignments 151086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 152086ec97fSSzymon Olewniczak $id = $assignment['id']; 153086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 1542ce523c6SSzymon Olewniczak $approver = $assignment['approver'] ? $assignment['approver'] : '---'; 1551b552e87SSzymon Olewniczak 156086ec97fSSzymon Olewniczak $link = wl( 157086ec97fSSzymon Olewniczak $ID, array( 1581b552e87SSzymon Olewniczak 'do' => 'admin', 159086ec97fSSzymon Olewniczak 'page' => 'approve', 160086ec97fSSzymon Olewniczak 'action' => 'delete', 161086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 162086ec97fSSzymon Olewniczak 'assignment[id]' => $id 163086ec97fSSzymon Olewniczak ) 164086ec97fSSzymon Olewniczak ); 1651b552e87SSzymon Olewniczak 166086ec97fSSzymon Olewniczak echo '<tr>'; 167086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 1682ce523c6SSzymon Olewniczak $user = $auth->getUserData($approver); 169c7d53eabSSzymon Olewniczak if ($user) { 170c7d53eabSSzymon Olewniczak echo '<td>' . hsc($user['name']) . '</td>'; 171c7d53eabSSzymon Olewniczak } else { 1722ce523c6SSzymon Olewniczak echo '<td>' . hsc($approver) . '</td>'; 173c7d53eabSSzymon Olewniczak } 174086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 175086ec97fSSzymon Olewniczak echo '</tr>'; 1761b552e87SSzymon Olewniczak } 1771b552e87SSzymon Olewniczak 178086ec97fSSzymon Olewniczak // new assignment form 179086ec97fSSzymon Olewniczak echo '<tr>'; 180086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 181086ec97fSSzymon Olewniczak echo '<td>'; 1826dbb709bSSzymon Olewniczak if ($auth->canDo('getUsers')) { 1832ce523c6SSzymon Olewniczak echo '<select name="assignment[approver]">'; 184086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 185*91f47af0SErik Inge Bolsø if ($auth->canDo('getGroups')) { 186*91f47af0SErik Inge Bolsø foreach($auth->retrieveGroups() as $group) { 187*91f47af0SErik Inge Bolsø echo '<option value="@' . hsc($group) . '">' . '@' . hsc($group) . '</option>'; 188*91f47af0SErik Inge Bolsø } 189*91f47af0SErik Inge Bolsø } 190086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 191086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 1921b552e87SSzymon Olewniczak } 193086ec97fSSzymon Olewniczak echo '</select>'; 194*91f47af0SErik Inge Bolsø // in case your auth plugin can do groups, but not list them (like the default one), 195*91f47af0SErik Inge Bolsø // leave a text field as backup 196*91f47af0SErik Inge Bolsø echo '<input name="assignment[approver_fb]">'; 1976dbb709bSSzymon Olewniczak } else { 1986dbb709bSSzymon Olewniczak echo '<input name="assignment[approver]">'; 1996dbb709bSSzymon Olewniczak } 200086ec97fSSzymon Olewniczak echo '</td>'; 2016dbb709bSSzymon Olewniczak 202086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 203086ec97fSSzymon Olewniczak echo '</tr>'; 2041b552e87SSzymon Olewniczak 205086ec97fSSzymon Olewniczak echo '</table>'; 2061b552e87SSzymon Olewniczak } 2071b552e87SSzymon Olewniczak} 2081b552e87SSzymon Olewniczak 2091b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 210