xref: /plugin/approve/admin.php (revision b1ff32a17baf1beabefd296a982a636d4e4d64b5)
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