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