xref: /plugin/approve/admin.php (revision 3e6f089e9bbe1776341c5c83a51cd0835b622ee1)
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'];
10291f47af0SErik Inge Bolsø                } else if (!blank($assignment['approver_fb'])) {
10391f47af0SErik 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>';
18591f47af0SErik Inge Bolsø            if ($auth->canDo('getGroups')) {
18691f47af0SErik Inge Bolsø                foreach($auth->retrieveGroups() as $group) {
18791f47af0SErik Inge Bolsø                    echo '<option value="@' . hsc($group) . '">' . '@' . hsc($group) . '</option>';
18891f47af0SErik Inge Bolsø                }
18991f47af0SErik 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>';
19491f47af0SErik Inge Bolsø            // in case your auth plugin can do groups, but not list them (like the default one),
19591f47af0SErik Inge Bolsø            // leave a text field as backup
196*3e6f089eSSzymon Olewniczak            if (!$auth->canDo('getGroups')) {
197*3e6f089eSSzymon Olewniczak                echo '<input name="assignment[approver_fb]" id="plugin__approve_group_input">';
198*3e6f089eSSzymon Olewniczak            }
1996dbb709bSSzymon Olewniczak        } else {
2006dbb709bSSzymon Olewniczak            echo '<input name="assignment[approver]">';
2016dbb709bSSzymon Olewniczak        }
202086ec97fSSzymon Olewniczak        echo '</td>';
2036dbb709bSSzymon Olewniczak
204086ec97fSSzymon Olewniczak        echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>';
205086ec97fSSzymon Olewniczak        echo '</tr>';
2061b552e87SSzymon Olewniczak
207086ec97fSSzymon Olewniczak        echo '</table>';
2081b552e87SSzymon Olewniczak    }
2091b552e87SSzymon Olewniczak}
2101b552e87SSzymon Olewniczak
2111b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et:
212