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) { 43338dbf1cSMichael Große if($namespace[$current_ns_depth] != $id[$current_ns_depth]) { 44f576111dSAndreas Gohr // not a match 45338dbf1cSMichael Große $matching = false; 46f576111dSAndreas Gohr break; 47f576111dSAndreas Gohr } 48338dbf1cSMichael Große $current_ns_depth += 1; 49f576111dSAndreas Gohr } 50338dbf1cSMichael Große if($matching) { return true; } // a match 51f576111dSAndreas Gohr } 52f576111dSAndreas Gohr return false; 53f576111dSAndreas Gohr } 54f576111dSAndreas Gohr 55889aa2d2SMichael Große /** 56889aa2d2SMichael Große * check if given $dir contains a valid namespace or is contained in a valid namespace 57889aa2d2SMichael Große * 58889aa2d2SMichael Große * @param $valid_namespaces_list 59889aa2d2SMichael Große * @param $dir 60889aa2d2SMichael Große * 61889aa2d2SMichael Große * @return bool 62889aa2d2SMichael Große */ 63889aa2d2SMichael Große function is_dir_valid($valid_namespaces_list, $dir) { 64889aa2d2SMichael Große $valid_namespaces_list = preg_split('/\s+/', $valid_namespaces_list); 65f576111dSAndreas Gohr //if(count($valid) == 0) { return true; }//whole wiki matches 66889aa2d2SMichael Große if((count($valid_namespaces_list)==1) && ($valid_namespaces_list[0]=="")) { return true; }//whole wiki matches 67889aa2d2SMichael Große $dir = trim($dir, ':'); 68889aa2d2SMichael Große $dir = explode(':', $dir); 69f576111dSAndreas Gohr 70f576111dSAndreas Gohr // Check against all possible namespaces 71889aa2d2SMichael Große foreach($valid_namespaces_list as $valid_namespace) { 72889aa2d2SMichael Große $valid_namespace = explode(':', $valid_namespace); 73889aa2d2SMichael Große $current_depth = 0; 74889aa2d2SMichael Große $dir_depth = count($dir); //this is what is different from above! 75889aa2d2SMichael Große $matching = true; 76f576111dSAndreas Gohr 77f576111dSAndreas Gohr // Check each element, untill all elements of $v satisfied 78889aa2d2SMichael Große while($current_depth < $dir_depth) { 79889aa2d2SMichael Große if (empty($valid_namespace[$current_depth])) { 80f576111dSAndreas Gohr break; 81f576111dSAndreas Gohr } 82889aa2d2SMichael Große if($valid_namespace[$current_depth] != $dir[$current_depth]) { 83889aa2d2SMichael Große // not a match 84889aa2d2SMichael Große $matching = false; 85889aa2d2SMichael Große break; 86f576111dSAndreas Gohr } 87889aa2d2SMichael Große $current_depth += 1; 88889aa2d2SMichael Große } 89889aa2d2SMichael Große if($matching) { return true; } // a match 90f576111dSAndreas Gohr } 91f576111dSAndreas Gohr return false; 92f576111dSAndreas Gohr } 93f576111dSAndreas Gohr 941794c5faSDominik Eckelmann function canApprove() { 951794c5faSDominik Eckelmann global $INFO; 961794c5faSDominik Eckelmann global $ID; 971794c5faSDominik Eckelmann 981794c5faSDominik Eckelmann if (!$this->in_namespace($this->getConf('apr_namespaces'), $ID)) { 991794c5faSDominik Eckelmann return false; 1001794c5faSDominik Eckelmann } 1011794c5faSDominik Eckelmann 1021794c5faSDominik Eckelmann return ($INFO['perm'] >= AUTH_DELETE); 1031794c5faSDominik Eckelmann } 1041794c5faSDominik Eckelmann 10581e0fa51SDominik Eckelmann function getRevision($id = null) { 10681e0fa51SDominik Eckelmann global $REV; 10781e0fa51SDominik Eckelmann if (isset($REV) && !empty($REV)) { 10881e0fa51SDominik Eckelmann return $REV; 1091794c5faSDominik Eckelmann } 11081e0fa51SDominik Eckelmann $meta = $this->getMeta($id); 111*7b3337ecSLouis Ouellet if($meta){ 11281e0fa51SDominik Eckelmann if (isset($meta['last_change']['date'])) { 11381e0fa51SDominik Eckelmann return $meta['last_change']['date']; 11481e0fa51SDominik Eckelmann } 115*7b3337ecSLouis Ouellet if (isset($meta['date']['modified'])) { 11681e0fa51SDominik Eckelmann return $meta['date']['modified']; 1171794c5faSDominik Eckelmann } 118*7b3337ecSLouis Ouellet } 119*7b3337ecSLouis 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) { 3145eecc2e6SDominik Eckelmann if (!$this->isHidden($id)) { 3152b00c146SDominik Eckelmann return false; 3162b00c146SDominik Eckelmann } 3172b00c146SDominik Eckelmann 3185eecc2e6SDominik Eckelmann if ($id == null) { 3192b00c146SDominik Eckelmann global $ID; 3205eecc2e6SDominik Eckelmann $id = $ID; 3215eecc2e6SDominik Eckelmann } 3225eecc2e6SDominik Eckelmann 323c2a737a8SDominik Eckelmann $allowedGroups = array_filter(explode(' ', trim($this->getConf('author groups')))); 324c2a737a8SDominik Eckelmann if (empty($allowedGroups)) { 3255eecc2e6SDominik Eckelmann return auth_quickaclcheck($id) < AUTH_EDIT; 326c2a737a8SDominik Eckelmann } 327c2a737a8SDominik Eckelmann 3284bb31febSLouis Ouellet if (!isset($_SERVER['REMOTE_USER'])) { 329c2a737a8SDominik Eckelmann return true; 330c2a737a8SDominik Eckelmann } 331c2a737a8SDominik Eckelmann 332c2a737a8SDominik Eckelmann global $USERINFO; 333c2a737a8SDominik Eckelmann foreach ($allowedGroups as $allowedGroup) { 334c2a737a8SDominik Eckelmann $allowedGroup = trim($allowedGroup); 335c2a737a8SDominik Eckelmann if (in_array($allowedGroup, $USERINFO['grps'])) { 336c2a737a8SDominik Eckelmann return false; 337c2a737a8SDominik Eckelmann } 338c2a737a8SDominik Eckelmann } 339c2a737a8SDominik Eckelmann return true; 340c2a737a8SDominik Eckelmann } 341d9258364SDominik Eckelmann 34203cac644SChristopher Smith function isActive($id = null) { 34303cac644SChristopher Smith if ($id == null) { 344d9258364SDominik Eckelmann global $ID; 34503cac644SChristopher Smith $id = $ID; 34603cac644SChristopher Smith } 34703cac644SChristopher Smith if (!$this->in_namespace($this->getConf('apr_namespaces'), $id)) { 348d9258364SDominik Eckelmann return false; 349d9258364SDominik Eckelmann } 350d9258364SDominik Eckelmann 351d9258364SDominik Eckelmann $no_apr_namespaces = $this->getConf('no_apr_namespaces'); 352d9258364SDominik Eckelmann if (!empty($no_apr_namespaces)) { 35303cac644SChristopher Smith if ($this->in_namespace($no_apr_namespaces, $id)) { 354d9258364SDominik Eckelmann return false; 355d9258364SDominik Eckelmann } 356d9258364SDominik Eckelmann } 357d9258364SDominik Eckelmann return true; 358d9258364SDominik Eckelmann } 359bfc3639fSMichael Große 360bfc3639fSMichael Große /** 361bfc3639fSMichael Große * Create absolute diff-link between the two given revisions 362bfc3639fSMichael Große * 363bfc3639fSMichael Große * @param string $id 364bfc3639fSMichael Große * @param int $rev1 365bfc3639fSMichael Große * @param int $rev2 366bfc3639fSMichael Große * @return string Diff-Link or empty string if $rev1 == $rev2 367bfc3639fSMichael Große */ 368bfc3639fSMichael Große public function getDifflink($id, $rev1, $rev2) { 369bfc3639fSMichael Große if($rev1 == $rev2) { 370bfc3639fSMichael Große return ''; 371bfc3639fSMichael Große } 372bfc3639fSMichael Große $params = 'do=diff,rev2[0]=' . $rev1 . ',rev2[1]=' . $rev2 . ',difftype=sidebyside'; 373bfc3639fSMichael Große $difflink = wl($id, $params,true,'&'); 374bfc3639fSMichael Große return $difflink; 375bfc3639fSMichael Große } 376bfc3639fSMichael Große 3779eaf4fb5SMichael Große function getPagesFromNamespace($namespace) { 3789eaf4fb5SMichael Große global $conf; 3799eaf4fb5SMichael Große $dir = $conf['datadir'] . '/' . str_replace(':', '/', $namespace); 3809eaf4fb5SMichael Große $pages = array(); 3819eaf4fb5SMichael Große search($pages, $dir, array($this,'_search_helper'), array($namespace, $this->getConf('apr_namespaces'), 3829eaf4fb5SMichael Große $this->getConf('no_apr_namespaces'))); 3839eaf4fb5SMichael Große return $pages; 3849eaf4fb5SMichael Große } 3859eaf4fb5SMichael Große 3869eaf4fb5SMichael Große /** 3879eaf4fb5SMichael Große * search callback function 3889eaf4fb5SMichael Große * 3899eaf4fb5SMichael Große * filter out pages which can't be approved by the current user 3909eaf4fb5SMichael Große * then check if they need approving 3919eaf4fb5SMichael Große */ 3929eaf4fb5SMichael Große function _search_helper(&$data, $base, $file, $type, $lvl, $opts) { 3939eaf4fb5SMichael Große $ns = $opts[0]; 3949eaf4fb5SMichael Große $valid_ns = $opts[1]; 3959eaf4fb5SMichael Große $invalid_ns = $opts[2]; 3969eaf4fb5SMichael Große 3979eaf4fb5SMichael Große if ($type == 'd') { 3989eaf4fb5SMichael Große return $this->is_dir_valid($valid_ns, $ns . ':' . str_replace('/', ':', $file)); 3999eaf4fb5SMichael Große } 4009eaf4fb5SMichael Große 4019eaf4fb5SMichael Große if (!preg_match('#\.txt$#', $file)) { 4029eaf4fb5SMichael Große return false; 4039eaf4fb5SMichael Große } 4049eaf4fb5SMichael Große 4059eaf4fb5SMichael Große $id = pathID($ns . $file); 4069eaf4fb5SMichael Große if (!empty($valid_ns) && !$this->in_namespace($valid_ns, $id)) { 4079eaf4fb5SMichael Große return false; 4089eaf4fb5SMichael Große } 4099eaf4fb5SMichael Große 4109eaf4fb5SMichael Große if (!empty($invalid_ns) && $this->in_namespace($invalid_ns, $id)) { 4119eaf4fb5SMichael Große return false; 4129eaf4fb5SMichael Große } 4139eaf4fb5SMichael Große 4149eaf4fb5SMichael Große if (auth_quickaclcheck($id) < AUTH_DELETE) { 4159eaf4fb5SMichael Große return false; 4169eaf4fb5SMichael Große } 4179eaf4fb5SMichael Große 4189eaf4fb5SMichael Große $meta = $this->getMeta($id); 4199eaf4fb5SMichael Große if ($this->isCurrentRevisionApproved($id)) { 4209eaf4fb5SMichael Große 4219eaf4fb5SMichael Große // Already approved 4229eaf4fb5SMichael Große return false; 4239eaf4fb5SMichael Große } 4249eaf4fb5SMichael Große 4259eaf4fb5SMichael Große $data[] = array($id, $meta['approval'], $meta['last_change']['date']); 4269eaf4fb5SMichael Große return false; 4279eaf4fb5SMichael Große } 4289eaf4fb5SMichael Große 4299d4b9aa0SMichael Große public function removeSubnamespacePages ($pages, $namespace) { 4309d4b9aa0SMichael Große $cleanpages = array(); 4319d4b9aa0SMichael Große foreach ($pages as $page) { 4329d4b9aa0SMichael Große if (getNS($page[0]) == $namespace) { 4339d4b9aa0SMichael Große $cleanpages[] = $page; 4349d4b9aa0SMichael Große } 4359d4b9aa0SMichael Große } 4369d4b9aa0SMichael Große return $cleanpages; 4379d4b9aa0SMichael Große } 4389d4b9aa0SMichael Große 439f576111dSAndreas Gohr} 440