[
'searchtext' => 'xss',
'replacetext' => 'xss',
'maxRecords' => 'digits',
'offset' => 'digits',
'paddingLength' => 'digits',
]
]
];
require_once('tiki-setup.php');
$wikilib = TikiLib::lib('wiki');
$access->check_feature(['feature_wiki']);
$access->check_permission(['tiki_p_admin_wiki']);
// Search input
$searchtext = '';
$replacetext = '';
if (! empty($_REQUEST['replacetext'])) {
$replacetext = $_REQUEST['replacetext'];
} else {
$replacetext = '';
}
if (! empty($_REQUEST['searchtext'])) {
$searchtext = $_REQUEST['searchtext'];
}
if (! isset($_REQUEST["offset"])) {
$offset = 0;
} else {
$offset = $_REQUEST["offset"];
}
$smarty->assign('offset', $offset);
if (! empty($_REQUEST['categId'])) {
$categFilter = [$_REQUEST['categId']];
$smarty->assign('find_categId', $_REQUEST['categId']);
} else {
$categFilter = [];
$smarty->assign('find_categId', '');
}
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
$categories = $categlib->getCategories(null, true, false);
$smarty->assign('categories', $categories);
}
if (isset($_REQUEST["maxRecords"])) {
$maxRecords = $_REQUEST["maxRecords"];
} else {
$maxRecords = 10;
}
$smarty->assign('maxRecords', $maxRecords);
if (! isset($_REQUEST["paddingLength"])) {
$paddingLength = 50;
} else {
$paddingLength = $_REQUEST["paddingLength"];
}
$smarty->assign('paddingLength', $paddingLength);
if (isset($_REQUEST["casesensitive"]) && $_REQUEST["casesensitive"] == 'y') {
$casesensitive = 'y';
} else {
$casesensitive = 'n';
}
$smarty->assign('casesensitive', $casesensitive);
if (isset($_REQUEST['search']) && $searchtext) {
$results = $wikilib->get_pages_contains($searchtext, $offset, $maxRecords, 'pageName_asc', $categFilter);
$searchtextLength = strlen($searchtext);
foreach ($results["data"] as &$r) {
$pageLength = strlen($r["data"]);
$curpos = -1;
while ($curpos < $pageLength) {
if ($casesensitive == 'y') {
$curpos = strpos($r["data"], $searchtext, $curpos + 1);
} else {
$curpos = stripos($r["data"], $searchtext, $curpos + 1);
}
if ($curpos === false) {
$r["beforeSnippet"][] = tra('This match was not case sensitive');
$r["afterSnippet"][] = tra('This match was not case sensitive');
$r["searchreplace"][] = '0:0:0';
break;
}
// can't use str_replace because it replaces all: we need to be more precise
$snippetStart = max(0, $curpos - $paddingLength);
$leftpartLength = $curpos - $snippetStart;
$rightpartLength = min($paddingLength, $pageLength - $curpos - $searchtextLength);
$rightpartStart = $curpos + $searchtextLength;
$foundtext = substr($r["data"], $curpos, $searchtextLength);
$lefthash = md5($r["page_id"] . $r["version"] . $searchtext . $curpos);
$righthash = md5($curpos . $searchtext . $r["version"] . $r["page_id"]);
$beforeSnippet = substr($r["data"], $snippetStart, $leftpartLength) . $lefthash . $foundtext . $righthash . substr($r["data"], $rightpartStart, $rightpartLength);
$beforeSnippet = htmlentities($beforeSnippet);
$beforeSnippet = str_replace($lefthash, '', $beforeSnippet);
$beforeSnippet = str_replace($righthash, '', $beforeSnippet);
$afterSnippet = substr($r["data"], $snippetStart, $leftpartLength) . $lefthash . $replacetext . $righthash . substr($r["data"], $rightpartStart, $rightpartLength);
$afterSnippet = htmlentities($afterSnippet);
$afterSnippet = str_replace($lefthash, '', $afterSnippet);
$afterSnippet = str_replace($righthash, '', $afterSnippet);
$r["beforeSnippet"][] = $beforeSnippet;
$r["afterSnippet"][] = $afterSnippet;
$r["searchreplace"][] = ($r["page_id"] . ":" . $r["version"] . ":" . $curpos);
}
}
$smarty->assign('cant', $results['cant']);
$smarty->assign('results', $results['data']);
}
if (isset($_REQUEST['replace']) && $searchtext) {
if (empty($_REQUEST['checked'])) {
$message = tra('No items selected');
} else {
$last_page_id = 0;
foreach ($_REQUEST['checked'] as $c) {
list($page_id, $version, $curpos) = explode(":", $c);
if ($last_page_id && $page_id == $last_page_id) {
$version = $version + $versionadjuster;
$curpos = $curpos + $curposadjuster;
} else {
$last_page_id = 0;
$curposadjuster = 0;
$versionadjuster = 0;
}
$page_info = $tikilib->get_page_info_from_id($page_id);
if (! $page_info) {
$message .= tra("Page cannot be found: ") . $page_id . "
";
continue;
}
if ($page_info["version"] != $version) {
$message .= tra("Page has changed since preview: ") . htmlentities($page_info["pageName"]) . "
";
continue;
}
// do replacing
$searchtextLength = strlen($searchtext);
$data = $page_info["data"];
$firstpart = substr($data, 0, $curpos);
$lastpart = substr($data, $curpos + $searchtextLength);
if (strtolower(substr($data, $curpos, $searchtextLength)) != strtolower($searchtext)) {
$message .= tra("Page not updated due to error in replacing: ") . htmlentities($page_info["pageName"]) . "
";
continue;
}
$data = $firstpart . $replacetext . $lastpart;
$tikilib->update_page($page_info["pageName"], $data, tra('Mass search and replace'), $user, $tikilib->get_ip_address());
$message .= tra("Page updated: ") . htmlentities($page_info["pageName"]) . "
";
$versionadjuster++;
$curposadjuster = $curposadjuster + strlen($replacetext) - $searchtextLength;
$last_page_id = $page_id;
}
}
if (empty($message)) {
$message = tra('Nothing was replaced. Try selecting fewer items or increasing the limit change max_input_vars in php.ini.');
}
$smarty->assign('message', $message);
}
$smarty->assign('searchtext', $searchtext);
$smarty->assign('replacetext', $replacetext);
$smarty->assign('mid', 'tiki-search_replace.tpl');
$smarty->display("tiki.tpl");