xref: /plugin/publish/helper.php (revision 8f0861d948fb317faa9969b4af5bb317a0a11d2d)
1f576111dSAndreas Gohr<?php
2f576111dSAndreas Gohr/**
3f576111dSAndreas Gohr * DokuWiki Plugin publish (Helper Component)
4f576111dSAndreas Gohr *
5f576111dSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6f576111dSAndreas Gohr * @author  Jarrod Lowe <dokuwiki@rrod.net>
7f576111dSAndreas Gohr * @author  Andreas Gohr <gohr@cosmocode.de>
8f576111dSAndreas Gohr */
9f576111dSAndreas Gohr
10f576111dSAndreas Gohr// must be run within Dokuwiki
11f576111dSAndreas Gohrif (!defined('DOKU_INC')) die();
12f576111dSAndreas Gohr
13f576111dSAndreas Gohrclass helper_plugin_publish extends DokuWiki_Plugin {
14f576111dSAndreas Gohr
151794c5faSDominik Eckelmann    private $sortedApprovedRevisions = null;
161794c5faSDominik Eckelmann
173a8f43c6SMichael Große    /**
183a8f43c6SMichael Große     * checks if an id is within one of the namespaces in $namespace_list
193a8f43c6SMichael Große     *
203a8f43c6SMichael Große     * @param string $namespace_list
213a8f43c6SMichael Große     * @param string $id
223a8f43c6SMichael Große     *
233a8f43c6SMichael Große     * @return bool
243a8f43c6SMichael Große     */
25338dbf1cSMichael Große    function in_namespace($namespace_list, $id) {
26f576111dSAndreas Gohr        // PHP apparantly does not have closures -
27f576111dSAndreas Gohr        // so we will parse $valid ourselves. Wasteful.
28338dbf1cSMichael Große        $namespace_list = preg_split('/\s+/', $namespace_list);
29f576111dSAndreas Gohr        //if(count($valid) == 0) { return true; }//whole wiki matches
30338dbf1cSMichael Große        if((count($namespace_list)==1) and ($namespace_list[0]=="")) { return true; }//whole wiki matches
31338dbf1cSMichael Große        $id = trim($id, ':');
32338dbf1cSMichael Große        $id = explode(':', $id);
33f576111dSAndreas Gohr
34f576111dSAndreas Gohr        // Check against all possible namespaces
35338dbf1cSMichael Große        foreach($namespace_list as $namespace) {
36338dbf1cSMichael Große            $namespace = explode(':', $namespace);
37338dbf1cSMichael Große            $current_ns_depth = 0;
38338dbf1cSMichael Große            $total_ns_depth = count($namespace);
39338dbf1cSMichael Große            $matching = true;
40f576111dSAndreas Gohr
41f576111dSAndreas Gohr            // Check each element, untill all elements of $v satisfied
42338dbf1cSMichael Große            while($current_ns_depth < $total_ns_depth) {
43*8f0861d9SAndreas Gohr                if(
44*8f0861d9SAndreas Gohr                    !isset($id[$current_ns_depth]) ||
45*8f0861d9SAndreas Gohr                    !isset($namespace[$current_ns_depth]) ||
46*8f0861d9SAndreas Gohr                    $namespace[$current_ns_depth] != $id[$current_ns_depth]
47*8f0861d9SAndreas Gohr                ) {
48f576111dSAndreas Gohr                    // not a match
49338dbf1cSMichael Große                    $matching = false;
50f576111dSAndreas Gohr                    break;
51f576111dSAndreas Gohr                }
52338dbf1cSMichael Große                $current_ns_depth += 1;
53f576111dSAndreas Gohr            }
54338dbf1cSMichael Große            if($matching) { return true; } // a match
55f576111dSAndreas Gohr        }
56f576111dSAndreas Gohr        return false;
57f576111dSAndreas Gohr    }
58f576111dSAndreas Gohr
59889aa2d2SMichael Große    /**
60889aa2d2SMichael Große     * check if given $dir contains a valid namespace or is contained in a valid namespace
61889aa2d2SMichael Große     *
62889aa2d2SMichael Große     * @param $valid_namespaces_list
63889aa2d2SMichael Große     * @param $dir
64889aa2d2SMichael Große     *
65889aa2d2SMichael Große     * @return bool
66889aa2d2SMichael Große     */
67889aa2d2SMichael Große    function is_dir_valid($valid_namespaces_list, $dir) {
68889aa2d2SMichael Große        $valid_namespaces_list = preg_split('/\s+/', $valid_namespaces_list);
69f576111dSAndreas Gohr        //if(count($valid) == 0) { return true; }//whole wiki matches
70889aa2d2SMichael Große        if((count($valid_namespaces_list)==1) && ($valid_namespaces_list[0]=="")) { return true; }//whole wiki matches
71889aa2d2SMichael Große        $dir = trim($dir, ':');
72889aa2d2SMichael Große        $dir = explode(':', $dir);
73f576111dSAndreas Gohr
74f576111dSAndreas Gohr        // Check against all possible namespaces
75889aa2d2SMichael Große        foreach($valid_namespaces_list as $valid_namespace) {
76889aa2d2SMichael Große            $valid_namespace = explode(':', $valid_namespace);
77889aa2d2SMichael Große            $current_depth = 0;
78889aa2d2SMichael Große            $dir_depth = count($dir); //this is what is different from above!
79889aa2d2SMichael Große            $matching = true;
80f576111dSAndreas Gohr
81f576111dSAndreas Gohr            // Check each element, untill all elements of $v satisfied
82889aa2d2SMichael Große            while($current_depth < $dir_depth) {
83889aa2d2SMichael Große                if (empty($valid_namespace[$current_depth])) {
84f576111dSAndreas Gohr                    break;
85f576111dSAndreas Gohr                }
86889aa2d2SMichael Große                if($valid_namespace[$current_depth] != $dir[$current_depth]) {
87889aa2d2SMichael Große                    // not a match
88889aa2d2SMichael Große                    $matching = false;
89889aa2d2SMichael Große                    break;
90f576111dSAndreas Gohr                }
91889aa2d2SMichael Große                $current_depth += 1;
92889aa2d2SMichael Große            }
93889aa2d2SMichael Große            if($matching) { return true; } // a match
94f576111dSAndreas Gohr        }
95f576111dSAndreas Gohr        return false;
96f576111dSAndreas Gohr    }
97f576111dSAndreas Gohr
981794c5faSDominik Eckelmann    function canApprove() {
991794c5faSDominik Eckelmann        global $INFO;
1001794c5faSDominik Eckelmann        global $ID;
1011794c5faSDominik Eckelmann
1021794c5faSDominik Eckelmann        if (!$this->in_namespace($this->getConf('apr_namespaces'), $ID)) {
1031794c5faSDominik Eckelmann            return false;
1041794c5faSDominik Eckelmann        }
1051794c5faSDominik Eckelmann
1061794c5faSDominik Eckelmann        return ($INFO['perm'] >= AUTH_DELETE);
1071794c5faSDominik Eckelmann    }
1081794c5faSDominik Eckelmann
10981e0fa51SDominik Eckelmann    function getRevision($id = null) {
11081e0fa51SDominik Eckelmann        global $REV;
11181e0fa51SDominik Eckelmann        if (isset($REV) && !empty($REV)) {
11281e0fa51SDominik Eckelmann            return $REV;
1131794c5faSDominik Eckelmann        }
11481e0fa51SDominik Eckelmann        $meta = $this->getMeta($id);
1157b3337ecSLouis Ouellet        if($meta){
116*8f0861d9SAndreas Gohr            if(isset($meta['last_change']['date'])) return $meta['last_change']['date'];
117*8f0861d9SAndreas Gohr            if(isset($meta['date']['modified'])) return $meta['date']['modified'];
1187b3337ecSLouis Ouellet        }
1197b3337ecSLouis Ouellet        return 0;
120b725e838SLouis Ouellet    }
1211794c5faSDominik Eckelmann
12214c32fa0SDominik Eckelmann    function getApprovals($id = null) {
12314c32fa0SDominik Eckelmann        $meta = $this->getMeta($id);
12481e0fa51SDominik Eckelmann        if (!isset($meta['approval'])) {
1251794c5faSDominik Eckelmann            return array();
1261794c5faSDominik Eckelmann        }
12781e0fa51SDominik Eckelmann        $approvals = $meta['approval'];
1284e55e2a1SDominik Eckelmann        if (!is_array($approvals)) {
1294e55e2a1SDominik Eckelmann            return array();
1304e55e2a1SDominik Eckelmann        }
1311794c5faSDominik Eckelmann        return $approvals;
1321794c5faSDominik Eckelmann    }
1331794c5faSDominik Eckelmann
13414c32fa0SDominik Eckelmann    function getMeta($id = null) {
13514c32fa0SDominik Eckelmann        global $ID;
13614c32fa0SDominik Eckelmann        global $INFO;
13771b30300SAndreas Gohr
13871b30300SAndreas Gohr        if ($id === null) $id = $ID;
13971b30300SAndreas Gohr
14071b30300SAndreas Gohr        if($ID === $id && $INFO['meta']) {
1411317c887SDominik Eckelmann            $meta = $INFO['meta'];
14214c32fa0SDominik Eckelmann        } else {
1431317c887SDominik Eckelmann            $meta = p_get_metadata($id);
14414c32fa0SDominik Eckelmann        }
1451317c887SDominik Eckelmann
1461317c887SDominik Eckelmann        $this->checkApprovalFormat($meta, $id);
1471317c887SDominik Eckelmann
1481317c887SDominik Eckelmann        return $meta;
1491317c887SDominik Eckelmann    }
1501317c887SDominik Eckelmann
1511317c887SDominik Eckelmann    function checkApprovalFormat($meta, $id) {
1521317c887SDominik Eckelmann        if (isset($meta['approval_version']) && $meta['approval_version'] >= 2) {
1531317c887SDominik Eckelmann            return;
1541317c887SDominik Eckelmann        }
1551317c887SDominik Eckelmann
1561317c887SDominik Eckelmann        if (!$this->hasApprovals($meta)) {
1571317c887SDominik Eckelmann            return;
1581317c887SDominik Eckelmann        }
1591317c887SDominik Eckelmann
1601317c887SDominik Eckelmann        $approvals = $meta['approval'];
1611317c887SDominik Eckelmann        foreach (array_keys($approvals) as $approvedId) {
1621317c887SDominik Eckelmann            $keys = array_keys($approvals[$approvedId]);
1631317c887SDominik Eckelmann
1641317c887SDominik Eckelmann            if (is_array($approvals[$approvedId][$keys[0]])) {
1651317c887SDominik Eckelmann                continue; // current format
1661317c887SDominik Eckelmann            }
1671317c887SDominik Eckelmann
1681317c887SDominik Eckelmann            $newEntry = $approvals[$approvedId];
1691317c887SDominik Eckelmann            if (count($newEntry) !== 3) {
1701317c887SDominik Eckelmann                //continue; // some messed up format...
1711317c887SDominik Eckelmann            }
1721317c887SDominik Eckelmann            $newEntry[] = intval($approvedId); // revision is the time of page edit
1731317c887SDominik Eckelmann
1741317c887SDominik Eckelmann            $approvals[$approvedId] = array();
1751317c887SDominik Eckelmann            $approvals[$approvedId][$newEntry[0]] = $newEntry;
1761317c887SDominik Eckelmann        }
1771317c887SDominik Eckelmann        p_set_metadata($id, array('approval' => $approvals), true, true);
1781317c887SDominik Eckelmann        p_set_metadata($id, array('approval_version' => 2), true, true);
1791317c887SDominik Eckelmann    }
1801317c887SDominik Eckelmann
1811317c887SDominik Eckelmann    function hasApprovals($meta) {
1821317c887SDominik Eckelmann        return isset($meta['approval']) && !empty($meta['approval']);
18314c32fa0SDominik Eckelmann    }
18414c32fa0SDominik Eckelmann
1851794c5faSDominik Eckelmann    function getApprovalsOnRevision($revision) {
1861794c5faSDominik Eckelmann        $approvals = $this->getApprovals();
1871794c5faSDominik Eckelmann
1881794c5faSDominik Eckelmann        if (isset($approvals[$revision])) {
1891794c5faSDominik Eckelmann            return $approvals[$revision];
1901794c5faSDominik Eckelmann        }
1911794c5faSDominik Eckelmann        return array();
1921794c5faSDominik Eckelmann    }
1931794c5faSDominik Eckelmann
1945eecc2e6SDominik Eckelmann    function getSortedApprovedRevisions($id = null) {
1955eecc2e6SDominik Eckelmann        if ($id === null) {
1965eecc2e6SDominik Eckelmann            global $ID;
1975eecc2e6SDominik Eckelmann            $id = $ID;
1981794c5faSDominik Eckelmann        }
1995eecc2e6SDominik Eckelmann
2005eecc2e6SDominik Eckelmann        static $sortedApprovedRevisions = array();
2015eecc2e6SDominik Eckelmann        if (!isset($sortedApprovedRevisions[$id])) {
2025eecc2e6SDominik Eckelmann            $approvals = $this->getApprovals($id);
2035eecc2e6SDominik Eckelmann            krsort($approvals);
2045eecc2e6SDominik Eckelmann            $sortedApprovedRevisions[$id] = $approvals;
2055eecc2e6SDominik Eckelmann        }
2065eecc2e6SDominik Eckelmann
2075eecc2e6SDominik Eckelmann        return $sortedApprovedRevisions[$id];
2081794c5faSDominik Eckelmann    }
2091794c5faSDominik Eckelmann
21014c32fa0SDominik Eckelmann    function isRevisionApproved($revision, $id = null) {
21114c32fa0SDominik Eckelmann        $approvals = $this->getApprovals($id);
2121794c5faSDominik Eckelmann        if (!isset($approvals[$revision])) {
2131794c5faSDominik Eckelmann            return false;
2141794c5faSDominik Eckelmann        }
2151794c5faSDominik Eckelmann        return (count($approvals[$revision]) >= $this->getConf('number_of_approved'));
2161794c5faSDominik Eckelmann    }
2171794c5faSDominik Eckelmann
21881e0fa51SDominik Eckelmann    function isCurrentRevisionApproved($id = null) {
21981e0fa51SDominik Eckelmann        return $this->isRevisionApproved($this->getRevision($id), $id);
2201794c5faSDominik Eckelmann    }
2211794c5faSDominik Eckelmann
2225eecc2e6SDominik Eckelmann    function getLatestApprovedRevision($id = null) {
2235eecc2e6SDominik Eckelmann        $approvals = $this->getSortedApprovedRevisions($id);
2241794c5faSDominik Eckelmann        foreach ($approvals as $revision => $ignored) {
2255eecc2e6SDominik Eckelmann            if ($this->isRevisionApproved($revision, $id)) {
2261794c5faSDominik Eckelmann                return $revision;
2271794c5faSDominik Eckelmann            }
2281794c5faSDominik Eckelmann        }
2291794c5faSDominik Eckelmann        return 0;
2301794c5faSDominik Eckelmann    }
2311794c5faSDominik Eckelmann
2321794c5faSDominik Eckelmann    function getLastestRevision() {
2331794c5faSDominik Eckelmann        global $INFO;
2341794c5faSDominik Eckelmann        return $INFO['meta']['date']['modified'];
2351794c5faSDominik Eckelmann    }
2361794c5faSDominik Eckelmann
2371794c5faSDominik Eckelmann    function getApprovalDate() {
2381794c5faSDominik Eckelmann        if (!$this->isCurrentRevisionApproved()) {
2391794c5faSDominik Eckelmann            return -1;
2401794c5faSDominik Eckelmann        }
2411794c5faSDominik Eckelmann
2421794c5faSDominik Eckelmann        $approvals = $this->getApprovalsOnRevision($this->getRevision());
2431794c5faSDominik Eckelmann        uasort($approvals, array(&$this, 'cmpApprovals'));
2441794c5faSDominik Eckelmann        $keys = array_keys($approvals);
2451794c5faSDominik Eckelmann        return $approvals[$keys[$this->getConf('number_of_approved') -1]][3];
2461794c5faSDominik Eckelmann
2471794c5faSDominik Eckelmann    }
2481794c5faSDominik Eckelmann
2491794c5faSDominik Eckelmann    function cmpApprovals($left, $right) {
2501794c5faSDominik Eckelmann        if ($left[3] == $right[3]) {
2511794c5faSDominik Eckelmann            return 0;
2521794c5faSDominik Eckelmann        }
2531794c5faSDominik Eckelmann        return ($left[3] < $right[3]) ? -1 : 1;
2541794c5faSDominik Eckelmann    }
2551794c5faSDominik Eckelmann
2561794c5faSDominik Eckelmann    function getApprovers() {
2571794c5faSDominik Eckelmann        $approvers = $this->getApprovalsOnRevision($this->getRevision());
2581317c887SDominik Eckelmann        if (count($approvers) === 0) {
2591317c887SDominik Eckelmann            return;
2601317c887SDominik Eckelmann        }
2611317c887SDominik Eckelmann
2621794c5faSDominik Eckelmann        $result = array();
2631794c5faSDominik Eckelmann        foreach ($approvers as $approver) {
2641794c5faSDominik Eckelmann            $result[] = editorinfo($this->getApproverName($approver));
2651794c5faSDominik Eckelmann        }
2661794c5faSDominik Eckelmann        return $result;
2671794c5faSDominik Eckelmann    }
2681794c5faSDominik Eckelmann
2691794c5faSDominik Eckelmann    function getApproverName($approver) {
2701794c5faSDominik Eckelmann        if ($approver[1]) {
2711794c5faSDominik Eckelmann            return $approver[1];
2721794c5faSDominik Eckelmann        }
2731794c5faSDominik Eckelmann        if ($approver[2]) {
2741794c5faSDominik Eckelmann            return $approver[2];
2751794c5faSDominik Eckelmann        }
2761794c5faSDominik Eckelmann        return $approver[0];
2771794c5faSDominik Eckelmann    }
2781794c5faSDominik Eckelmann
2791794c5faSDominik Eckelmann    function getPreviousApprovedRevision() {
2801794c5faSDominik Eckelmann        $currentRevision = $this->getRevision();
2811794c5faSDominik Eckelmann        $approvals = $this->getSortedApprovedRevisions();
2821794c5faSDominik Eckelmann        foreach ($approvals as $revision => $ignored) {
2831794c5faSDominik Eckelmann            if ($revision >= $currentRevision) {
2841794c5faSDominik Eckelmann                continue;
2851794c5faSDominik Eckelmann            }
2861794c5faSDominik Eckelmann            if ($this->isRevisionApproved($revision)) {
2871794c5faSDominik Eckelmann                return $revision;
2881794c5faSDominik Eckelmann            }
2891794c5faSDominik Eckelmann        }
2901794c5faSDominik Eckelmann        return 0;
2911794c5faSDominik Eckelmann    }
2921794c5faSDominik Eckelmann
2935eecc2e6SDominik Eckelmann    function isHidden($id = null) {
294c2a737a8SDominik Eckelmann        if (!$this->getConf('hide drafts')) {
295c2a737a8SDominik Eckelmann            return false;
296c2a737a8SDominik Eckelmann        }
297a178f455SRené Corinth
298a178f455SRené Corinth        // needs to check if the actual namespace belongs to the apr_namespaces
29903cac644SChristopher Smith        if ($id == null) {
300cf46f4c9SRené Corinth            global $ID;
30103cac644SChristopher Smith            $id = $ID;
30203cac644SChristopher Smith        }
30303cac644SChristopher Smith        if (!$this->isActive($id)) {
304a178f455SRené Corinth            return false;
305a178f455SRené Corinth        }
306a178f455SRené Corinth
3075eecc2e6SDominik Eckelmann        if ($this->getLatestApprovedRevision($id)) {
308c2a737a8SDominik Eckelmann            return false;
309c2a737a8SDominik Eckelmann        }
3102b00c146SDominik Eckelmann        return true;
3112b00c146SDominik Eckelmann    }
312c2a737a8SDominik Eckelmann
3135eecc2e6SDominik Eckelmann    function isHiddenForUser($id = null) {
3144aab27f5SLouis Ouellet        global $INPUT;
3155eecc2e6SDominik Eckelmann        if (!$this->isHidden($id)) {
3162b00c146SDominik Eckelmann            return false;
3172b00c146SDominik Eckelmann        }
3182b00c146SDominik Eckelmann
3195eecc2e6SDominik Eckelmann        if ($id == null) {
3202b00c146SDominik Eckelmann            global $ID;
3215eecc2e6SDominik Eckelmann            $id = $ID;
3225eecc2e6SDominik Eckelmann        }
3235eecc2e6SDominik Eckelmann
324c2a737a8SDominik Eckelmann        $allowedGroups = array_filter(explode(' ', trim($this->getConf('author groups'))));
325c2a737a8SDominik Eckelmann        if (empty($allowedGroups)) {
3265eecc2e6SDominik Eckelmann            return auth_quickaclcheck($id) < AUTH_EDIT;
327c2a737a8SDominik Eckelmann        }
328c2a737a8SDominik Eckelmann
329f87359fcSLouis Ouellet        if (!$INPUT->server->has('REMOTE_USER')) {
330c2a737a8SDominik Eckelmann            return true;
331c2a737a8SDominik Eckelmann        }
332c2a737a8SDominik Eckelmann
333c2a737a8SDominik Eckelmann        global $USERINFO;
334c2a737a8SDominik Eckelmann        foreach ($allowedGroups as $allowedGroup) {
335c2a737a8SDominik Eckelmann            $allowedGroup = trim($allowedGroup);
336c2a737a8SDominik Eckelmann            if (in_array($allowedGroup, $USERINFO['grps'])) {
337c2a737a8SDominik Eckelmann                return false;
338c2a737a8SDominik Eckelmann            }
339c2a737a8SDominik Eckelmann        }
340c2a737a8SDominik Eckelmann        return true;
341c2a737a8SDominik Eckelmann    }
342d9258364SDominik Eckelmann
34303cac644SChristopher Smith    function isActive($id = null) {
34403cac644SChristopher Smith        if ($id == null) {
345d9258364SDominik Eckelmann            global $ID;
34603cac644SChristopher Smith            $id = $ID;
34703cac644SChristopher Smith        }
34803cac644SChristopher Smith        if (!$this->in_namespace($this->getConf('apr_namespaces'), $id)) {
349d9258364SDominik Eckelmann            return false;
350d9258364SDominik Eckelmann        }
351d9258364SDominik Eckelmann
352d9258364SDominik Eckelmann        $no_apr_namespaces = $this->getConf('no_apr_namespaces');
353d9258364SDominik Eckelmann        if (!empty($no_apr_namespaces)) {
35403cac644SChristopher Smith            if ($this->in_namespace($no_apr_namespaces, $id)) {
355d9258364SDominik Eckelmann                return false;
356d9258364SDominik Eckelmann            }
357d9258364SDominik Eckelmann        }
358d9258364SDominik Eckelmann        return true;
359d9258364SDominik Eckelmann    }
360bfc3639fSMichael Große
361bfc3639fSMichael Große    /**
362bfc3639fSMichael Große     * Create absolute diff-link between the two given revisions
363bfc3639fSMichael Große     *
364bfc3639fSMichael Große     * @param string $id
365bfc3639fSMichael Große     * @param int $rev1
366bfc3639fSMichael Große     * @param int $rev2
367bfc3639fSMichael Große     * @return string Diff-Link or empty string if $rev1 == $rev2
368bfc3639fSMichael Große     */
369bfc3639fSMichael Große    public function getDifflink($id, $rev1, $rev2) {
370bfc3639fSMichael Große        if($rev1 == $rev2) {
371bfc3639fSMichael Große            return '';
372bfc3639fSMichael Große        }
373bfc3639fSMichael Große        $params = 'do=diff,rev2[0]=' . $rev1 . ',rev2[1]=' . $rev2 . ',difftype=sidebyside';
374bfc3639fSMichael Große        $difflink = wl($id, $params,true,'&');
375bfc3639fSMichael Große        return $difflink;
376bfc3639fSMichael Große    }
377bfc3639fSMichael Große
3789eaf4fb5SMichael Große    function getPagesFromNamespace($namespace) {
3799eaf4fb5SMichael Große        global $conf;
3809eaf4fb5SMichael Große        $dir = $conf['datadir'] . '/' . str_replace(':', '/', $namespace);
3819eaf4fb5SMichael Große        $pages = array();
3829eaf4fb5SMichael Große        search($pages, $dir, array($this,'_search_helper'), array($namespace, $this->getConf('apr_namespaces'),
3839eaf4fb5SMichael Große                                                                  $this->getConf('no_apr_namespaces')));
3849eaf4fb5SMichael Große        return $pages;
3859eaf4fb5SMichael Große    }
3869eaf4fb5SMichael Große
3879eaf4fb5SMichael Große    /**
3889eaf4fb5SMichael Große     * search callback function
3899eaf4fb5SMichael Große     *
3909eaf4fb5SMichael Große     * filter out pages which can't be approved by the current user
3919eaf4fb5SMichael Große     * then check if they need approving
3929eaf4fb5SMichael Große     */
3939eaf4fb5SMichael Große    function _search_helper(&$data, $base, $file, $type, $lvl, $opts) {
3949eaf4fb5SMichael Große        $ns = $opts[0];
3959eaf4fb5SMichael Große        $valid_ns = $opts[1];
3969eaf4fb5SMichael Große        $invalid_ns = $opts[2];
3979eaf4fb5SMichael Große
3989eaf4fb5SMichael Große        if ($type == 'd') {
3999eaf4fb5SMichael Große            return $this->is_dir_valid($valid_ns, $ns . ':' . str_replace('/', ':', $file));
4009eaf4fb5SMichael Große        }
4019eaf4fb5SMichael Große
4029eaf4fb5SMichael Große        if (!preg_match('#\.txt$#', $file)) {
4039eaf4fb5SMichael Große            return false;
4049eaf4fb5SMichael Große        }
4059eaf4fb5SMichael Große
4069eaf4fb5SMichael Große        $id = pathID($ns . $file);
4079eaf4fb5SMichael Große        if (!empty($valid_ns) && !$this->in_namespace($valid_ns, $id)) {
4089eaf4fb5SMichael Große            return false;
4099eaf4fb5SMichael Große        }
4109eaf4fb5SMichael Große
4119eaf4fb5SMichael Große        if (!empty($invalid_ns) && $this->in_namespace($invalid_ns, $id)) {
4129eaf4fb5SMichael Große            return false;
4139eaf4fb5SMichael Große        }
4149eaf4fb5SMichael Große
4159eaf4fb5SMichael Große        if (auth_quickaclcheck($id) < AUTH_DELETE) {
4169eaf4fb5SMichael Große            return false;
4179eaf4fb5SMichael Große        }
4189eaf4fb5SMichael Große
4199eaf4fb5SMichael Große        $meta = $this->getMeta($id);
4209eaf4fb5SMichael Große        if ($this->isCurrentRevisionApproved($id)) {
4219eaf4fb5SMichael Große
4229eaf4fb5SMichael Große            // Already approved
4239eaf4fb5SMichael Große            return false;
4249eaf4fb5SMichael Große        }
4259eaf4fb5SMichael Große
4269eaf4fb5SMichael Große        $data[] = array($id, $meta['approval'], $meta['last_change']['date']);
4279eaf4fb5SMichael Große        return false;
4289eaf4fb5SMichael Große    }
4299eaf4fb5SMichael Große
4309d4b9aa0SMichael Große    public function removeSubnamespacePages ($pages, $namespace) {
4319d4b9aa0SMichael Große        $cleanpages = array();
4329d4b9aa0SMichael Große        foreach ($pages as $page) {
4339d4b9aa0SMichael Große            if (getNS($page[0]) == $namespace) {
4349d4b9aa0SMichael Große                $cleanpages[] = $page;
4359d4b9aa0SMichael Große            }
4369d4b9aa0SMichael Große        }
4379d4b9aa0SMichael Große        return $cleanpages;
4389d4b9aa0SMichael Große    }
4399d4b9aa0SMichael Große
440f576111dSAndreas Gohr}
441