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, 968cbc5ee8SAndreas 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(); 107*bba3d825SAndreas Gohr if ( 108*bba3d825SAndreas Gohr $wasCreated && ( 109*bba3d825SAndreas Gohr empty($oldmeta['persistent']['date']['created']) || 110*bba3d825SAndreas Gohr $oldmeta['persistent']['date']['created'] === $created 111*bba3d825SAndreas Gohr ) 112*bba3d825SAndreas Gohr ){ 11364159a61SAndreas Gohr // newly created 1147d559c7fSBen Coburn $meta['date']['created'] = $created; 115a8e72133SAndreas Gohr if ($user){ 116a8e72133SAndreas Gohr $meta['creator'] = $INFO['userinfo']['name']; 117a8e72133SAndreas Gohr $meta['user'] = $user; 118a8e72133SAndreas Gohr } 11964159a61SAndreas Gohr } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) { 12064159a61SAndreas Gohr // re-created / restored 1213d1f9ec3SMichael Klier $meta['date']['created'] = $oldmeta['persistent']['date']['created']; 1223d1f9ec3SMichael Klier $meta['date']['modified'] = $created; // use the files ctime here 1233d1f9ec3SMichael Klier $meta['creator'] = $oldmeta['persistent']['creator']; 1243d1f9ec3SMichael Klier if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name']; 1257d559c7fSBen Coburn } elseif (!$minor) { // non-minor modification 1267d559c7fSBen Coburn $meta['date']['modified'] = $date; 1277d559c7fSBen Coburn if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name']; 1287d559c7fSBen Coburn } 1297d559c7fSBen Coburn $meta['last_change'] = $logline; 130ee4d22e0SChristopher Smith p_set_metadata($id, $meta); 1317d559c7fSBen Coburn } 1327d559c7fSBen Coburn 1337d559c7fSBen Coburn // add changelog lines 1347d559c7fSBen Coburn $logline = implode("\t", $logline)."\n"; 1357d559c7fSBen Coburn io_saveFile(metaFN($id,'.changes'),$logline,true); //page changelog 1367d559c7fSBen Coburn io_saveFile($conf['changelog'],$logline,true); //global changelog cache 1377d559c7fSBen Coburn} 1387d559c7fSBen Coburn 1397d559c7fSBen Coburn/** 14099c8d7f2Smichael * Add's an entry to the media changelog 14199c8d7f2Smichael * 14299c8d7f2Smichael * @author Michael Hamann <michael@content-space.de> 14399c8d7f2Smichael * @author Andreas Gohr <andi@splitbrain.org> 14499c8d7f2Smichael * @author Esther Brunner <wikidesign@gmail.com> 14599c8d7f2Smichael * @author Ben Coburn <btcoburn@silicodon.net> 1464f1e2cb3SGerrit Uitslag * 1474f1e2cb3SGerrit Uitslag * @param int $date Timestamp of the change 1484f1e2cb3SGerrit Uitslag * @param String $id Name of the affected page 1494f1e2cb3SGerrit Uitslag * @param String $type Type of the change see DOKU_CHANGE_TYPE_* 1504f1e2cb3SGerrit Uitslag * @param String $summary Summary of the change 1514f1e2cb3SGerrit Uitslag * @param mixed $extra In case of a revert the revision (timestmp) of the reverted page 1524f1e2cb3SGerrit Uitslag * @param array $flags Additional flags in a key value array. 1534f1e2cb3SGerrit Uitslag * Available flags: 1544f1e2cb3SGerrit Uitslag * - (none, so far) 155ac3ed4afSGerrit Uitslag * @param null|int $sizechange Change of filesize 15699c8d7f2Smichael */ 15764159a61SAndreas Gohrfunction addMediaLogEntry( 15864159a61SAndreas Gohr $date, 15964159a61SAndreas Gohr $id, 16064159a61SAndreas Gohr $type=DOKU_CHANGE_TYPE_EDIT, 16164159a61SAndreas Gohr $summary='', 16264159a61SAndreas Gohr $extra='', 16364159a61SAndreas Gohr $flags=null, 16464159a61SAndreas Gohr $sizechange = null) 16564159a61SAndreas Gohr{ 166de3eb1d7SAdrian Lang global $conf; 167585bf44eSChristopher Smith /** @var Input $INPUT */ 168585bf44eSChristopher Smith global $INPUT; 16999c8d7f2Smichael 17099c8d7f2Smichael $id = cleanid($id); 17199c8d7f2Smichael 17299c8d7f2Smichael if(!$date) $date = time(); //use current time if none supplied 1732f9daf16SAndreas Gohr $remote = clientIP(true); 174585bf44eSChristopher Smith $user = $INPUT->server->str('REMOTE_USER'); 175ac3ed4afSGerrit Uitslag if($sizechange === null) { 176ac3ed4afSGerrit Uitslag $sizechange = ''; 177ac3ed4afSGerrit Uitslag } else { 178ac3ed4afSGerrit Uitslag $sizechange = (int) $sizechange; 179ac3ed4afSGerrit Uitslag } 18099c8d7f2Smichael 18199c8d7f2Smichael $strip = array("\t", "\n"); 18299c8d7f2Smichael $logline = array( 18399c8d7f2Smichael 'date' => $date, 18499c8d7f2Smichael 'ip' => $remote, 18599c8d7f2Smichael 'type' => str_replace($strip, '', $type), 18699c8d7f2Smichael 'id' => $id, 18799c8d7f2Smichael 'user' => $user, 1888cbc5ee8SAndreas Gohr 'sum' => \dokuwiki\Utf8\PhpString::substr(str_replace($strip, '', $summary), 0, 255), 189ac3ed4afSGerrit Uitslag 'extra' => str_replace($strip, '', $extra), 190ac3ed4afSGerrit Uitslag 'sizechange' => $sizechange 19199c8d7f2Smichael ); 19299c8d7f2Smichael 19399c8d7f2Smichael // add changelog lines 19499c8d7f2Smichael $logline = implode("\t", $logline)."\n"; 19599c8d7f2Smichael io_saveFile($conf['media_changelog'],$logline,true); //global media changelog cache 196e4f389efSKate Arzamastseva io_saveFile(mediaMetaFN($id,'.changes'),$logline,true); //media file's changelog 19799c8d7f2Smichael} 19899c8d7f2Smichael 19999c8d7f2Smichael/** 2007d559c7fSBen Coburn * returns an array of recently changed files using the 2017d559c7fSBen Coburn * changelog 2027d559c7fSBen Coburn * 2037d559c7fSBen Coburn * The following constants can be used to control which changes are 2047d559c7fSBen Coburn * included. Add them together as needed. 2057d559c7fSBen Coburn * 2067d559c7fSBen Coburn * RECENTS_SKIP_DELETED - don't include deleted pages 2077d559c7fSBen Coburn * RECENTS_SKIP_MINORS - don't include minor changes 2087d559c7fSBen Coburn * RECENTS_SKIP_SUBSPACES - don't include subspaces 2090b926329SKate Arzamastseva * RECENTS_MEDIA_CHANGES - return media changes instead of page changes 2100b926329SKate Arzamastseva * RECENTS_MEDIA_PAGES_MIXED - return both media changes and page changes 2117d559c7fSBen Coburn * 2127d559c7fSBen Coburn * @param int $first number of first entry returned (for paginating 2137d559c7fSBen Coburn * @param int $num return $num entries 2147d559c7fSBen Coburn * @param string $ns restrict to given namespace 21559f20ea3SMichael Hamann * @param int $flags see above 21659f20ea3SMichael Hamann * @return array recently changed files 2177d559c7fSBen Coburn * 2187d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 21929778747SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 2207d559c7fSBen Coburn */ 2217d559c7fSBen Coburnfunction getRecents($first,$num,$ns='',$flags=0){ 2227d559c7fSBen Coburn global $conf; 2237d559c7fSBen Coburn $recent = array(); 2247d559c7fSBen Coburn $count = 0; 2257d559c7fSBen Coburn 2267d559c7fSBen Coburn if(!$num) 2277d559c7fSBen Coburn return $recent; 2287d559c7fSBen Coburn 2297d559c7fSBen Coburn // read all recent changes. (kept short) 2300b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) { 23199c8d7f2Smichael $lines = @file($conf['media_changelog']); 23299c8d7f2Smichael } else { 23376d47b34SDavid Lorentsen $lines = @file($conf['changelog']); 23499c8d7f2Smichael } 2351b266025SPhy if (!is_array($lines)) { 2361b266025SPhy $lines = array(); 2371b266025SPhy } 23829778747SKate Arzamastseva $lines_position = count($lines)-1; 23959f20ea3SMichael Hamann $media_lines_position = 0; 24059f20ea3SMichael Hamann $media_lines = array(); 24129778747SKate Arzamastseva 2420b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_PAGES_MIXED) { 24329778747SKate Arzamastseva $media_lines = @file($conf['media_changelog']); 2441b266025SPhy if (!is_array($media_lines)) { 2451b266025SPhy $media_lines = array(); 2461b266025SPhy } 24729778747SKate Arzamastseva $media_lines_position = count($media_lines)-1; 24829778747SKate Arzamastseva } 24929778747SKate Arzamastseva 25029778747SKate Arzamastseva $seen = array(); // caches seen lines, _handleRecent() skips them 2517d559c7fSBen Coburn 2527d559c7fSBen Coburn // handle lines 2530b926329SKate Arzamastseva while ($lines_position >= 0 || (($flags & RECENTS_MEDIA_PAGES_MIXED) && $media_lines_position >=0)) { 25429778747SKate Arzamastseva if (empty($rec) && $lines_position >= 0) { 2551d901ab2SAndreas Gohr $rec = _handleRecent(@$lines[$lines_position], $ns, $flags, $seen); 25629778747SKate Arzamastseva if (!$rec) { 25729778747SKate Arzamastseva $lines_position --; 25829778747SKate Arzamastseva continue; 25929778747SKate Arzamastseva } 26029778747SKate Arzamastseva } 2610b926329SKate Arzamastseva if (($flags & RECENTS_MEDIA_PAGES_MIXED) && empty($media_rec) && $media_lines_position >= 0) { 26264159a61SAndreas Gohr $media_rec = _handleRecent( 26364159a61SAndreas Gohr @$media_lines[$media_lines_position], 26464159a61SAndreas Gohr $ns, 26564159a61SAndreas Gohr $flags | RECENTS_MEDIA_CHANGES, 26664159a61SAndreas Gohr $seen 26764159a61SAndreas Gohr ); 26829778747SKate Arzamastseva if (!$media_rec) { 26929778747SKate Arzamastseva $media_lines_position --; 27029778747SKate Arzamastseva continue; 27129778747SKate Arzamastseva } 27229778747SKate Arzamastseva } 2730b926329SKate Arzamastseva if (($flags & RECENTS_MEDIA_PAGES_MIXED) && @$media_rec['date'] >= @$rec['date']) { 27429778747SKate Arzamastseva $media_lines_position--; 27529778747SKate Arzamastseva $x = $media_rec; 276b5941dfaSKate Arzamastseva $x['media'] = true; 27729778747SKate Arzamastseva $media_rec = false; 27829778747SKate Arzamastseva } else { 27929778747SKate Arzamastseva $lines_position--; 28029778747SKate Arzamastseva $x = $rec; 281421ec38eSKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) $x['media'] = true; 28229778747SKate Arzamastseva $rec = false; 28329778747SKate Arzamastseva } 2847d559c7fSBen Coburn if(--$first >= 0) continue; // skip first entries 28529778747SKate Arzamastseva $recent[] = $x; 2867d559c7fSBen Coburn $count++; 2877d559c7fSBen Coburn // break when we have enough entries 2887d559c7fSBen Coburn if($count >= $num){ break; } 2897d559c7fSBen Coburn } 2907d559c7fSBen Coburn return $recent; 2917d559c7fSBen Coburn} 2927d559c7fSBen Coburn 2937d559c7fSBen Coburn/** 29499c8d7f2Smichael * returns an array of files changed since a given time using the 29599c8d7f2Smichael * changelog 29699c8d7f2Smichael * 29799c8d7f2Smichael * The following constants can be used to control which changes are 29899c8d7f2Smichael * included. Add them together as needed. 29999c8d7f2Smichael * 30099c8d7f2Smichael * RECENTS_SKIP_DELETED - don't include deleted pages 30199c8d7f2Smichael * RECENTS_SKIP_MINORS - don't include minor changes 30299c8d7f2Smichael * RECENTS_SKIP_SUBSPACES - don't include subspaces 3030b926329SKate Arzamastseva * RECENTS_MEDIA_CHANGES - return media changes instead of page changes 30499c8d7f2Smichael * 30599c8d7f2Smichael * @param int $from date of the oldest entry to return 30699c8d7f2Smichael * @param int $to date of the newest entry to return (for pagination, optional) 30799c8d7f2Smichael * @param string $ns restrict to given namespace (optional) 30859f20ea3SMichael Hamann * @param int $flags see above (optional) 30959f20ea3SMichael Hamann * @return array of files 31099c8d7f2Smichael * 31199c8d7f2Smichael * @author Michael Hamann <michael@content-space.de> 31299c8d7f2Smichael * @author Ben Coburn <btcoburn@silicodon.net> 31399c8d7f2Smichael */ 31499c8d7f2Smichaelfunction getRecentsSince($from,$to=null,$ns='',$flags=0){ 31599c8d7f2Smichael global $conf; 31699c8d7f2Smichael $recent = array(); 31799c8d7f2Smichael 31899c8d7f2Smichael if($to && $to < $from) 31999c8d7f2Smichael return $recent; 32099c8d7f2Smichael 32199c8d7f2Smichael // read all recent changes. (kept short) 3220b926329SKate Arzamastseva if ($flags & RECENTS_MEDIA_CHANGES) { 32399c8d7f2Smichael $lines = @file($conf['media_changelog']); 32499c8d7f2Smichael } else { 32599c8d7f2Smichael $lines = @file($conf['changelog']); 32699c8d7f2Smichael } 327e920a0a1SAndreas Gohr if(!$lines) return $recent; 32899c8d7f2Smichael 32999c8d7f2Smichael // we start searching at the end of the list 33099c8d7f2Smichael $lines = array_reverse($lines); 33199c8d7f2Smichael 33299c8d7f2Smichael // handle lines 33399c8d7f2Smichael $seen = array(); // caches seen lines, _handleRecent() skips them 33499c8d7f2Smichael 33599c8d7f2Smichael foreach($lines as $line){ 33699c8d7f2Smichael $rec = _handleRecent($line, $ns, $flags, $seen); 33799c8d7f2Smichael if($rec !== false) { 33899c8d7f2Smichael if ($rec['date'] >= $from) { 33999c8d7f2Smichael if (!$to || $rec['date'] <= $to) { 34099c8d7f2Smichael $recent[] = $rec; 34199c8d7f2Smichael } 34299c8d7f2Smichael } else { 34399c8d7f2Smichael break; 34499c8d7f2Smichael } 34599c8d7f2Smichael } 34699c8d7f2Smichael } 34799c8d7f2Smichael 34899c8d7f2Smichael return array_reverse($recent); 34999c8d7f2Smichael} 35099c8d7f2Smichael 35199c8d7f2Smichael/** 3527d559c7fSBen Coburn * Internal function used by getRecents 3537d559c7fSBen Coburn * 3547d559c7fSBen Coburn * don't call directly 3557d559c7fSBen Coburn * 3567d559c7fSBen Coburn * @see getRecents() 3577d559c7fSBen Coburn * @author Andreas Gohr <andi@splitbrain.org> 3587d559c7fSBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3594f1e2cb3SGerrit Uitslag * 3604f1e2cb3SGerrit Uitslag * @param string $line changelog line 3614f1e2cb3SGerrit Uitslag * @param string $ns restrict to given namespace 3624f1e2cb3SGerrit Uitslag * @param int $flags flags to control which changes are included 3634f1e2cb3SGerrit Uitslag * @param array $seen listing of seen pages 3644f1e2cb3SGerrit Uitslag * @return array|bool false or array with info about a change 3657d559c7fSBen Coburn */ 36699c8d7f2Smichaelfunction _handleRecent($line,$ns,$flags,&$seen){ 3677d559c7fSBen Coburn if(empty($line)) return false; //skip empty lines 3687d559c7fSBen Coburn 3697d559c7fSBen Coburn // split the line into parts 3707d559c7fSBen Coburn $recent = parseChangelogLine($line); 3717d559c7fSBen Coburn if ($recent===false) { return false; } 3727d559c7fSBen Coburn 3737d559c7fSBen Coburn // skip seen ones 3747d559c7fSBen Coburn if(isset($seen[$recent['id']])) return false; 3757d559c7fSBen Coburn 3767d559c7fSBen Coburn // skip minors 377ebf1501fSBen Coburn if($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT && ($flags & RECENTS_SKIP_MINORS)) return false; 3787d559c7fSBen Coburn 3797d559c7fSBen Coburn // remember in seen to skip additional sights 3807d559c7fSBen Coburn $seen[$recent['id']] = 1; 3817d559c7fSBen Coburn 3827d559c7fSBen Coburn // check if it's a hidden page 3837d559c7fSBen Coburn if(isHiddenPage($recent['id'])) return false; 3847d559c7fSBen Coburn 3857d559c7fSBen Coburn // filter namespace 3867d559c7fSBen Coburn if (($ns) && (strpos($recent['id'],$ns.':') !== 0)) return false; 3877d559c7fSBen Coburn 3887d559c7fSBen Coburn // exclude subnamespaces 3897d559c7fSBen Coburn if (($flags & RECENTS_SKIP_SUBSPACES) && (getNS($recent['id']) != $ns)) return false; 3907d559c7fSBen Coburn 3917d559c7fSBen Coburn // check ACL 39242025dfdSMichael Hamann if ($flags & RECENTS_MEDIA_CHANGES) { 39342025dfdSMichael Hamann $recent['perms'] = auth_quickaclcheck(getNS($recent['id']).':*'); 39442025dfdSMichael Hamann } else { 39599c8d7f2Smichael $recent['perms'] = auth_quickaclcheck($recent['id']); 39642025dfdSMichael Hamann } 39799c8d7f2Smichael if ($recent['perms'] < AUTH_READ) return false; 3987d559c7fSBen Coburn 3997d559c7fSBen Coburn // check existance 4001d901ab2SAndreas Gohr if($flags & RECENTS_SKIP_DELETED){ 40142025dfdSMichael Hamann $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id'])); 40279e79377SAndreas Gohr if(!file_exists($fn)) return false; 4031d901ab2SAndreas Gohr } 4047d559c7fSBen Coburn 4057d559c7fSBen Coburn return $recent; 4067d559c7fSBen Coburn} 407