Skip to content
Snippets Groups Projects
Commit 818d2283 authored by Michael Hamann's avatar Michael Hamann Committed by Christopher Smith
Browse files

Fix the useheading cache invalidation for hidden pages, add tests

This adds a new parameter to ft_backlinks() to ignore permissions which
is needed for invalidating the cache of linking pages with useheading
enabled. This also adds various test cases for ft_backlinks().
parent 40960973
No related branches found
No related tags found
No related merge requests found
<?php
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
/**
* Test cases for the link index
*
* @author Michael Hamann <michael@content-space.de>
*/
class fultext_backlinks_test extends DokuWikiTest {
public function test_internallink() {
saveWikiText('test:internallinks', '[[internälLink]] [[..:internal link]]', 'Test initialization');
idx_addPage('test:internallinks');
$this->assertEquals(array('test:internallinks'), ft_backlinks('internal_link'));
$this->assertEquals(array('test:internallinks'), ft_backlinks('test:internaellink'));
}
public function test_links_in_footnotes() {
saveWikiText('test:link_footnotes', '(([[footnote]] [[:foÖtnotel]]))', 'Test initialization');
idx_addPage('test:link_footnotes');
$this->assertEquals(array('test:link_footnotes'), ft_backlinks('test:footnote'));
$this->assertEquals(array('test:link_footnotes'), ft_backlinks('fooetnotel'));
}
public function test_links_in_hidden_pages() {
global $conf;
$conf['hidepages'] = 'hidden:.*';
saveWikiText('hidden:links', '[[wiki:hiddenlink|linktitle]]', 'Test initialization');
idx_addPage('hidden:links');
saveWikiText('visible:links', '[[wiki:hiddenlink]]', 'Test initialization');
idx_addPage('visible:links');
$this->assertEquals(array('visible:links'), ft_backlinks('wiki:hiddenlink'));
$this->assertEquals(array('visible:links'), ft_backlinks('wiki:hiddenlink', false));
$this->assertEquals(array('hidden:links', 'visible:links'), ft_backlinks('wiki:hiddenlink', true));
}
public function test_links_in_protected_pages() {
global $conf;
global $AUTH_ACL;
$conf['superuser'] = 'alice';
$conf['useacl'] = 1;
$AUTH_ACL = array(
'* @ALL 8',
'secret:* @ALL 0',
);
$_SERVER['REMOTE_USER'] = 'eve';
saveWikiText('secret:links', '[[wiki:secretlink]]', 'Test initialization');
idx_addPage('secret:links');
saveWikiText('public:links', '[[wiki:secretlink]]', 'Test initialization');
idx_addPage('public:links');
$this->assertEquals(array('public:links'), ft_backlinks('wiki:secretlink'));
$this->assertEquals(array('public:links'), ft_backlinks('wiki:secretlink', false));
$this->assertEquals(array('public:links', 'secret:links'), ft_backlinks('wiki:secretlink', true));
}
public function test_links_in_deleted_pages() {
saveWikiText('test:internallinks', '[[internallink]] [[..:internal link]]', 'Test initialization');
idx_addPage('test:internallinks');
$this->assertEquals(array('test:internallinks'), ft_backlinks('test:internallink'));
$this->assertEquals(array('test:internallinks'), ft_backlinks('internal_link'));
saveWikiText('test:internallinks', '', 'Deleted');
$this->assertEquals(array(), ft_backlinks('test:internallink'));
$this->assertEquals(array(), ft_backlinks('internal_link'));
}
}
......@@ -1130,7 +1130,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
// if useheading is enabled, purge the cache of all linking pages
if(useHeading('content')) {
$pages = ft_backlinks($id);
$pages = ft_backlinks($id, true);
foreach($pages as $page) {
$cache = new cache_renderer($page, wikiFN($page), 'xhtml');
$cache->removeCache();
......
......@@ -125,17 +125,21 @@ function _ft_pageSearch(&$data) {
* Returns the backlinks for a given page
*
* Uses the metadata index.
*
* @param string $id The id for which links shall be returned
* @param bool $ignore_perms Ignore the fact that pages are hidden or read-protected
* @return array The pages that contain links to the given page
*/
function ft_backlinks($id){
$result = array();
function ft_backlinks($id, $ignore_perms = false){
$result = idx_get_indexer()->lookupKey('relation_references', $id);
if(!count($result)) return $result;
// check ACL permissions
foreach(array_keys($result) as $idx){
if(isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ || !page_exists($result[$idx], '', false)){
if(($ignore_perms !== true && (
isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ
)) || !page_exists($result[$idx], '', false)){
unset($result[$idx]);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment