17d559c7fSBen Coburn<?php 27d559c7fSBen Coburn/** 37d559c7fSBen Coburn * Changelog handling functions 47d559c7fSBen Coburn * 57d559c7fSBen Coburn * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 67d559c7fSBen Coburn * @author Andreas Gohr <andi@splitbrain.org> 77d559c7fSBen Coburn */ 87d559c7fSBen Coburn 9ebf1501fSBen Coburn// Constants for known core changelog line types. 10ebf1501fSBen Coburn// Use these in place of string literals for more readable code. 11ebf1501fSBen Coburndefine('DOKU_CHANGE_TYPE_CREATE', 'C'); 12ebf1501fSBen Coburndefine('DOKU_CHANGE_TYPE_EDIT', 'E'); 13ebf1501fSBen Coburndefine('DOKU_CHANGE_TYPE_MINOR_EDIT', 'e'); 14ebf1501fSBen Coburndefine('DOKU_CHANGE_TYPE_DELETE', 'D'); 15ebf1501fSBen Coburndefine('DOKU_CHANGE_TYPE_REVERT', 'R'); 16ebf1501fSBen Coburn 177d559c7fSBen Coburn/** 187d559c7fSBen Coburn * parses a changelog line into it's components 197d559c7fSBen Coburn * 207d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 214f1e2cb3SGerrit Uitslag * 224f1e2cb3SGerrit Uitslag * @param string $line changelog line 234f1e2cb3SGerrit Uitslag * @return array|bool parsed line or false 247d559c7fSBen Coburn */ 257d559c7fSBen Coburnfunction parseChangelogLine($line) { 26ac3ed4afSGerrit Uitslag $line = rtrim($line, "\n"); 277d559c7fSBen Coburn $tmp = explode("\t", $line); 287d559c7fSBen Coburn if ($tmp!==false && count($tmp)>1) { 297d559c7fSBen Coburn $info = array(); 30e16d739eSBen Coburn $info['date'] = (int)$tmp[0]; // unix timestamp 317d559c7fSBen Coburn $info['ip'] = $tmp[1]; // IPv4 address (127.0.0.1) 327d559c7fSBen Coburn $info['type'] = $tmp[2]; // log line type 337d559c7fSBen Coburn $info['id'] = $tmp[3]; // page id 347d559c7fSBen Coburn $info['user'] = $tmp[4]; // user name 357d559c7fSBen Coburn $info['sum'] = $tmp[5]; // edit summary (or action reason) 36ac3ed4afSGerrit Uitslag $info['extra'] = $tmp[6]; // extra data (varies by line type) 37ac3ed4afSGerrit Uitslag if(isset($tmp[7]) && $tmp[7] !== '') { //last item has line-end|| 38ac3ed4afSGerrit Uitslag $info['sizechange'] = (int) $tmp[7]; 39ac3ed4afSGerrit Uitslag } else { 40ac3ed4afSGerrit Uitslag $info['sizechange'] = null; 41ac3ed4afSGerrit Uitslag } 427d559c7fSBen Coburn return $info; 43ac3ed4afSGerrit Uitslag } else { 44ac3ed4afSGerrit Uitslag return false; 45ac3ed4afSGerrit Uitslag } 467d559c7fSBen Coburn} 477d559c7fSBen Coburn 487d559c7fSBen Coburn/** 497d559c7fSBen Coburn * Add's an entry to the changelog and saves the metadata for the page 507d559c7fSBen Coburn * 51a365baeeSDominik Eckelmann * @param int $date Timestamp of the change 52a365baeeSDominik Eckelmann * @param String $id Name of the affected page 53a365baeeSDominik Eckelmann * @param String $type Type of the change see DOKU_CHANGE_TYPE_* 54a365baeeSDominik Eckelmann * @param String $summary Summary of the change 55a365baeeSDominik Eckelmann * @param mixed $extra In case of a revert the revision (timestmp) of the reverted page 56a365baeeSDominik Eckelmann * @param array $flags Additional flags in a key value array. 574f1e2cb3SGerrit Uitslag * Available flags: 58a365baeeSDominik Eckelmann * - ExternalEdit - mark as an external edit. 59ac3ed4afSGerrit Uitslag * @param null|int $sizechange Change of filesize 60a365baeeSDominik Eckelmann * 617d559c7fSBen Coburn * @author Andreas Gohr <andi@splitbrain.org> 627d559c7fSBen Coburn * @author Esther Brunner <wikidesign@gmail.com> 637d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 647d559c7fSBen Coburn */ 65ac3ed4afSGerrit Uitslagfunction addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){ 667d559c7fSBen Coburn global $conf, $INFO; 67585bf44eSChristopher Smith /** @var Input $INPUT */ 68585bf44eSChristopher Smith global $INPUT; 697d559c7fSBen Coburn 705aa52fafSBen Coburn // check for special flags as keys 715aa52fafSBen Coburn if (!is_array($flags)) { $flags = array(); } 725aa52fafSBen Coburn $flagExternalEdit = isset($flags['ExternalEdit']); 735aa52fafSBen Coburn 747d559c7fSBen Coburn $id = cleanid($id); 757d559c7fSBen Coburn $file = wikiFN($id); 767d559c7fSBen Coburn $created = @filectime($file); 77ebf1501fSBen Coburn $minor = ($type===DOKU_CHANGE_TYPE_MINOR_EDIT); 78ebf1501fSBen Coburn $wasRemoved = ($type===DOKU_CHANGE_TYPE_DELETE); 797d559c7fSBen Coburn 807d559c7fSBen Coburn if(!$date) $date = time(); //use current time if none supplied 812f9daf16SAndreas Gohr $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1'; 82585bf44eSChristopher Smith $user = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):''; 83ac3ed4afSGerrit Uitslag if($sizechange === null) { 84ac3ed4afSGerrit Uitslag $sizechange = ''; 85ac3ed4afSGerrit Uitslag } else { 86ac3ed4afSGerrit Uitslag $sizechange = (int) $sizechange; 87ac3ed4afSGerrit Uitslag } 887d559c7fSBen Coburn 897d559c7fSBen Coburn $strip = array("\t", "\n"); 907d559c7fSBen Coburn $logline = array( 917d559c7fSBen Coburn 'date' => $date, 927d559c7fSBen Coburn 'ip' => $remote, 937d559c7fSBen Coburn 'type' => str_replace($strip, '', $type), 947d559c7fSBen Coburn 'id' => $id, 957d559c7fSBen Coburn 'user' => $user, 96*8cbc5ee8SAndreas Gohr 'sum' => \dokuwiki\Utf8\PhpString::substr(str_replace($strip, '', $summary), 0, 255), 97ac3ed4afSGerrit Uitslag 'extra' => str_replace($strip, '', $extra), 98ac3ed4afSGerrit Uitslag 'sizechange' => $sizechange 997d559c7fSBen Coburn ); 1007d559c7fSBen Coburn 101fed2ee90SGerrit Uitslag $wasCreated = ($type===DOKU_CHANGE_TYPE_CREATE); 102fed2ee90SGerrit Uitslag $wasReverted = ($type===DOKU_CHANGE_TYPE_REVERT); 1037d559c7fSBen Coburn // update metadata 1047d559c7fSBen Coburn if (!$wasRemoved) { 1053d1f9ec3SMichael Klier $oldmeta = p_read_metadata($id); 1067d559c7fSBen Coburn $meta = array(); 10764159a61SAndreas Gohr if ($wasCreated && empty($oldmeta['persistent']['date']['created'])){ 10864159a61SAndreas Gohr // newly created 1097d559c7fSBen Coburn $meta['date']['created'] = $created; 110a8e72133SAndreas Gohr if ($user){ 111a8e72133SAndreas Gohr $meta['creator'] = $INFO['userinfo']['name']; 112a8e72133SAndreas Gohr $meta['user'] = $user; 113a8e72133SAndreas Gohr } 11464159a61SAndreas Gohr } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) { 11564159a61SAndreas Gohr // re-created / restored 1163d1f9ec3SMichael Klier $meta['date']['created'] = $oldmeta['persistent']['date']['created']; 1173d1f9ec3SMichael Klier $meta['date']['modified'] = $created; // use the files ctime here 1183d1f9ec3SMichael Klier $meta['creator'] = $oldmeta['persistent']['creator']; 1193d1f9ec3SMichael Klier if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name']; 1207d559c7fSBen Coburn } elseif (!$minor) { // non-minor modification 1217d559c7fSBen Coburn $meta['date']['modified'] = $date; 1227d559c7fSBen Coburn if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name']; 1237d559c7fSBen Coburn } 1247d559c7fSBen Coburn $meta['last_change'] = $logline; 125ee4d22e0SChristopher Smith p_set_metadata($id, $meta); 1267d559c7fSBen Coburn } 1277d559c7fSBen Coburn 1287d559c7fSBen Coburn // add changelog lines 1297d559c7fSBen Coburn $logline = implode("\t", $logline)."\n"; 1307d559c7fSBen Coburn io_saveFile(metaFN($id,'.changes'),$logline,true); //page changelog 1317d559c7fSBen Coburn io_saveFile($conf['changelog'],$logline,true); //global changelog cache 1327d559c7fSBen Coburn} 1337d559c7fSBen Coburn 1347d559c7fSBen Coburn/** 13599c8d7f2Smichael * Add's an entry to the media changelog 13699c8d7f2Smichael * 13799c8d7f2Smichael * @author Michael Hamann <michael@content-space.de> 13899c8d7f2Smichael * @author Andreas Gohr <andi@splitbrain.org> 13999c8d7f2Smichael * @author Esther Brunner <wikidesign@gmail.com> 14099c8d7f2Smichael * @author Ben Coburn <btcoburn@silicodon.net> 1414f1e2cb3SGerrit Uitslag * 1424f1e2cb3SGerrit Uitslag * @param int $date Timestamp of the change 1434f1e2cb3SGerrit Uitslag * @param String $id Name of the affected page 1444f1e2cb3SGerrit Uitslag * @param String $type Type of the change see DOKU_CHANGE_TYPE_* 1454f1e2cb3SGerrit Uitslag * @param String $summary Summary of the change 1464f1e2cb3SGerrit Uitslag * @param mixed $extra In case of a revert the revision (timestmp) of the reverted page 1474f1e2cb3SGerrit Uitslag * @param array $flags Additional flags in a key value array. 1484f1e2cb3SGerrit Uitslag * Available flags: 1494f1e2cb3SGerrit Uitslag * - (none, so far) 150ac3ed4afSGerrit Uitslag * @param null|int $sizechange Change of filesize 15199c8d7f2Smichael */ 15264159a61SAndreas Gohrfunction addMediaLogEntry( 15364159a61SAndreas Gohr $date, 15464159a61SAndreas Gohr $id, 15564159a61SAndreas Gohr $type=DOKU_CHANGE_TYPE_EDIT, 15664159a61SAndreas Gohr $summary='', 15764159a61SAndreas Gohr $extra='', 15864159a61SAndreas Gohr $flags=null, 15964159a61SAndreas Gohr $sizechange = null) 16064159a61SAndreas Gohr{ 161de3eb1d7SAdrian Lang global $conf; 162585bf44eSChristopher Smith /** @var Input $INPUT */ 163585bf44eSChristopher Smith global $INPUT; 16499c8d7f2Smichael 16599c8d7f2Smichael $id = cleanid($id); 16699c8d7f2Smichael 16799c8d7f2Smichael if(!$date) $date = time(); //use current time if none supplied 1682f9daf16SAndreas Gohr $remote = clientIP(true); 169585bf44eSChristopher Smith $user = $INPUT->server->str('REMOTE_USER'); 170ac3ed4afSGerrit Uitslag if($sizechange === null) { 171ac3ed4afSGerrit Uitslag $sizechange = ''; 172ac3ed4afSGerrit Uitslag } else { 173ac3ed4afSGerrit Uitslag $sizechange = (int) $sizechange; 174ac3ed4afSGerrit Uitslag } 17599c8d7f2Smichael 17699c8d7f2Smichael $strip = array("\t", "\n"); 17799c8d7f2Smichael $logline = array( 17899c8d7f2Smichael 'date' => $date, 17999c8d7f2Smichael 'ip' => $remote, 18099c8d7f2Smichael 'type' => str_replace($strip, '', $type), 18199c8d7f2Smichael 'id' => $id, 18299c8d7f2Smichael 'user' => $user, 183*8cbc5ee8SAndreas Gohr 'sum' => \dokuwiki\Utf8\PhpString::substr(str_replace($strip, '', $summary), 0, 255), 184ac3ed4afSGerrit Uitslag 'extra' => str_replace($strip, '', $extra), 185ac3ed4afSGerrit Uitslag 'sizechange' => $sizechange 18699c8d7f2Smichael ); 18799c8d7f2Smichael 18899c8d7f2Smichael // add changelog lines 18999c8d7f2Smichael $logline = implode("\t", $logline)."\n"; 19099c8d7f2Smichael io_saveFile($conf['media_changelog'],$logline,true); //global media changelog cache 191e4f389efSKate Arzamastseva io_saveFile(mediaMetaFN($id,'.changes'),$logline,true); //media file's changelog 19299c8d7f2Smichael} 19399c8d7f2Smichael 19499c8d7f2Smichael/** 1957d559c7fSBen Coburn * returns an array of recently changed files using the 1967d559c7fSBen Coburn * changelog 1977d559c7fSBen Coburn * 1987d559c7fSBen Coburn * The following constants can be used to control which changes are 1997d559c7fSBen Coburn * included. Add them together as needed. 2007d559c7fSBen Coburn * 2017d559c7fSBen Coburn * RECENTS_SKIP_DELETED - don't include deleted pages 2027d559c7fSBen Coburn * RECENTS_SKIP_MINORS - don't include minor changes 2037d559c7fSBen Coburn * RECENTS_SKIP_SUBSPACES - don't include subspaces 2040b926329SKate Arzamastseva * RECENTS_MEDIA_CHANGES - return media changes instead of page changes 2050b926329SKate Arzamastseva * RECENTS_MEDIA_PAGES_MIXED - return both media changes and page changes 2067d559c7fSBen Coburn * 2077d559c7fSBen Coburn * @param int $first number of first entry returned (for paginating 2087d559c7fSBen Coburn * @param int $num return $num entries 2097d559c7fSBen Coburn * @param string $ns restrict to given namespace 21059f20ea3SMichael Hamann * @param int $flags see above 21159f20ea3SMichael Hamann * @return array recently changed files 2127d559c7fSBen Coburn * 2137d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 21429778747SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 2157d559c7fSBen Coburn */ 2167d559c7fSBen Coburnfunction getRecents($first,$num,$ns='',$flags=0){ 2177d559c7fSBen Coburn global $conf; 2187d559c7fSBen Coburn $recent = array(); 2197d559c7fSBen Coburn $count = 0; 2207d559c7fSBen Coburn 2217d559c7fSBen Coburn if(!$num) 2227d559c7fSBen Coburn return $recent; 2237d559c7fSBen Coburn 2247d559c7fSBen Coburn // read all recent changes. (kept short) 2250b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) { 22699c8d7f2Smichael $lines = @file($conf['media_changelog']); 22799c8d7f2Smichael } else { 22876d47b34SDavid Lorentsen $lines = @file($conf['changelog']); 22999c8d7f2Smichael } 2301b266025SPhy if (!is_array($lines)) { 2311b266025SPhy $lines = array(); 2321b266025SPhy } 23329778747SKate Arzamastseva $lines_position = count($lines)-1; 23459f20ea3SMichael Hamann $media_lines_position = 0; 23559f20ea3SMichael Hamann $media_lines = array(); 23629778747SKate Arzamastseva 2370b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_PAGES_MIXED) { 23829778747SKate Arzamastseva $media_lines = @file($conf['media_changelog']); 2391b266025SPhy if (!is_array($media_lines)) { 2401b266025SPhy $media_lines = array(); 2411b266025SPhy } 24229778747SKate Arzamastseva $media_lines_position = count($media_lines)-1; 24329778747SKate Arzamastseva } 24429778747SKate Arzamastseva 24529778747SKate Arzamastseva $seen = array(); // caches seen lines, _handleRecent() skips them 2467d559c7fSBen Coburn 2477d559c7fSBen Coburn // handle lines 2480b926329SKate Arzamastseva while ($lines_position >= 0 || (($flags & RECENTS_MEDIA_PAGES_MIXED) && $media_lines_position >=0)) { 24929778747SKate Arzamastseva if (empty($rec) && $lines_position >= 0) { 2501d901ab2SAndreas Gohr $rec = _handleRecent(@$lines[$lines_position], $ns, $flags, $seen); 25129778747SKate Arzamastseva if (!$rec) { 25229778747SKate Arzamastseva $lines_position --; 25329778747SKate Arzamastseva continue; 25429778747SKate Arzamastseva } 25529778747SKate Arzamastseva } 2560b926329SKate Arzamastseva if (($flags & RECENTS_MEDIA_PAGES_MIXED) && empty($media_rec) && $media_lines_position >= 0) { 25764159a61SAndreas Gohr $media_rec = _handleRecent( 25864159a61SAndreas Gohr @$media_lines[$media_lines_position], 25964159a61SAndreas Gohr $ns, 26064159a61SAndreas Gohr $flags | RECENTS_MEDIA_CHANGES, 26164159a61SAndreas Gohr $seen 26264159a61SAndreas Gohr ); 26329778747SKate Arzamastseva if (!$media_rec) { 26429778747SKate Arzamastseva $media_lines_position --; 26529778747SKate Arzamastseva continue; 26629778747SKate Arzamastseva } 26729778747SKate Arzamastseva } 2680b926329SKate Arzamastseva if (($flags & RECENTS_MEDIA_PAGES_MIXED) && @$media_rec['date'] >= @$rec['date']) { 26929778747SKate Arzamastseva $media_lines_position--; 27029778747SKate Arzamastseva $x = $media_rec; 271b5941dfaSKate Arzamastseva $x['media'] = true; 27229778747SKate Arzamastseva $media_rec = false; 27329778747SKate Arzamastseva } else { 27429778747SKate Arzamastseva $lines_position--; 27529778747SKate Arzamastseva $x = $rec; 276421ec38eSKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) $x['media'] = true; 27729778747SKate Arzamastseva $rec = false; 27829778747SKate Arzamastseva } 2797d559c7fSBen Coburn if(--$first >= 0) continue; // skip first entries 28029778747SKate Arzamastseva $recent[] = $x; 2817d559c7fSBen Coburn $count++; 2827d559c7fSBen Coburn // break when we have enough entries 2837d559c7fSBen Coburn if($count >= $num){ break; } 2847d559c7fSBen Coburn } 2857d559c7fSBen Coburn return $recent; 2867d559c7fSBen Coburn} 2877d559c7fSBen Coburn 2887d559c7fSBen Coburn/** 28999c8d7f2Smichael * returns an array of files changed since a given time using the 29099c8d7f2Smichael * changelog 29199c8d7f2Smichael * 29299c8d7f2Smichael * The following constants can be used to control which changes are 29399c8d7f2Smichael * included. Add them together as needed. 29499c8d7f2Smichael * 29599c8d7f2Smichael * RECENTS_SKIP_DELETED - don't include deleted pages 29699c8d7f2Smichael * RECENTS_SKIP_MINORS - don't include minor changes 29799c8d7f2Smichael * RECENTS_SKIP_SUBSPACES - don't include subspaces 2980b926329SKate Arzamastseva * RECENTS_MEDIA_CHANGES - return media changes instead of page changes 29999c8d7f2Smichael * 30099c8d7f2Smichael * @param int $from date of the oldest entry to return 30199c8d7f2Smichael * @param int $to date of the newest entry to return (for pagination, optional) 30299c8d7f2Smichael * @param string $ns restrict to given namespace (optional) 30359f20ea3SMichael Hamann * @param int $flags see above (optional) 30459f20ea3SMichael Hamann * @return array of files 30599c8d7f2Smichael * 30699c8d7f2Smichael * @author Michael Hamann <michael@content-space.de> 30799c8d7f2Smichael * @author Ben Coburn <btcoburn@silicodon.net> 30899c8d7f2Smichael */ 30999c8d7f2Smichaelfunction getRecentsSince($from,$to=null,$ns='',$flags=0){ 31099c8d7f2Smichael global $conf; 31199c8d7f2Smichael $recent = array(); 31299c8d7f2Smichael 31399c8d7f2Smichael if($to && $to < $from) 31499c8d7f2Smichael return $recent; 31599c8d7f2Smichael 31699c8d7f2Smichael // read all recent changes. (kept short) 3170b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) { 31899c8d7f2Smichael $lines = @file($conf['media_changelog']); 31999c8d7f2Smichael } else { 32099c8d7f2Smichael $lines = @file($conf['changelog']); 32199c8d7f2Smichael } 322e920a0a1SAndreas Gohr if(!$lines) return $recent; 32399c8d7f2Smichael 32499c8d7f2Smichael // we start searching at the end of the list 32599c8d7f2Smichael $lines = array_reverse($lines); 32699c8d7f2Smichael 32799c8d7f2Smichael // handle lines 32899c8d7f2Smichael $seen = array(); // caches seen lines, _handleRecent() skips them 32999c8d7f2Smichael 33099c8d7f2Smichael foreach($lines as $line){ 33199c8d7f2Smichael $rec = _handleRecent($line, $ns, $flags, $seen); 33299c8d7f2Smichael if($rec !== false) { 33399c8d7f2Smichael if ($rec['date'] >= $from) { 33499c8d7f2Smichael if (!$to || $rec['date'] <= $to) { 33599c8d7f2Smichael $recent[] = $rec; 33699c8d7f2Smichael } 33799c8d7f2Smichael } else { 33899c8d7f2Smichael break; 33999c8d7f2Smichael } 34099c8d7f2Smichael } 34199c8d7f2Smichael } 34299c8d7f2Smichael 34399c8d7f2Smichael return array_reverse($recent); 34499c8d7f2Smichael} 34599c8d7f2Smichael 34699c8d7f2Smichael/** 3477d559c7fSBen Coburn * Internal function used by getRecents 3487d559c7fSBen Coburn * 3497d559c7fSBen Coburn * don't call directly 3507d559c7fSBen Coburn * 3517d559c7fSBen Coburn * @see getRecents() 3527d559c7fSBen Coburn * @author Andreas Gohr <andi@splitbrain.org> 3537d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3544f1e2cb3SGerrit Uitslag * 3554f1e2cb3SGerrit Uitslag * @param string $line changelog line 3564f1e2cb3SGerrit Uitslag * @param string $ns restrict to given namespace 3574f1e2cb3SGerrit Uitslag * @param int $flags flags to control which changes are included 3584f1e2cb3SGerrit Uitslag * @param array $seen listing of seen pages 3594f1e2cb3SGerrit Uitslag * @return array|bool false or array with info about a change 3607d559c7fSBen Coburn */ 36199c8d7f2Smichaelfunction _handleRecent($line,$ns,$flags,&$seen){ 3627d559c7fSBen Coburn if(empty($line)) return false; //skip empty lines 3637d559c7fSBen Coburn 3647d559c7fSBen Coburn // split the line into parts 3657d559c7fSBen Coburn $recent = parseChangelogLine($line); 3667d559c7fSBen Coburn if ($recent===false) { return false; } 3677d559c7fSBen Coburn 3687d559c7fSBen Coburn // skip seen ones 3697d559c7fSBen Coburn if(isset($seen[$recent['id']])) return false; 3707d559c7fSBen Coburn 3717d559c7fSBen Coburn // skip minors 372ebf1501fSBen Coburn if($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT && ($flags & RECENTS_SKIP_MINORS)) return false; 3737d559c7fSBen Coburn 3747d559c7fSBen Coburn // remember in seen to skip additional sights 3757d559c7fSBen Coburn $seen[$recent['id']] = 1; 3767d559c7fSBen Coburn 3777d559c7fSBen Coburn // check if it's a hidden page 3787d559c7fSBen Coburn if(isHiddenPage($recent['id'])) return false; 3797d559c7fSBen Coburn 3807d559c7fSBen Coburn // filter namespace 3817d559c7fSBen Coburn if (($ns) && (strpos($recent['id'],$ns.':') !== 0)) return false; 3827d559c7fSBen Coburn 3837d559c7fSBen Coburn // exclude subnamespaces 3847d559c7fSBen Coburn if (($flags & RECENTS_SKIP_SUBSPACES) && (getNS($recent['id']) != $ns)) return false; 3857d559c7fSBen Coburn 3867d559c7fSBen Coburn // check ACL 38742025dfdSMichael Hamann if ($flags & RECENTS_MEDIA_CHANGES) { 38842025dfdSMichael Hamann $recent['perms'] = auth_quickaclcheck(getNS($recent['id']).':*'); 38942025dfdSMichael Hamann } else { 39099c8d7f2Smichael $recent['perms'] = auth_quickaclcheck($recent['id']); 39142025dfdSMichael Hamann } 39299c8d7f2Smichael if ($recent['perms'] < AUTH_READ) return false; 3937d559c7fSBen Coburn 3947d559c7fSBen Coburn // check existance 3951d901ab2SAndreas Gohr if($flags & RECENTS_SKIP_DELETED){ 39642025dfdSMichael Hamann $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id'])); 39779e79377SAndreas Gohr if(!file_exists($fn)) return false; 3981d901ab2SAndreas Gohr } 3997d559c7fSBen Coburn 4007d559c7fSBen Coburn return $recent; 4017d559c7fSBen Coburn} 402