dokuwiki/lib/plugins/revert/admin.php
<?php
use dokuwiki\Extension\AdminPlugin;
use dokuwiki\ChangeLog\PageChangeLog;
/**
* All DokuWiki plugins to extend the admin function
* need to inherit from this class
*/
class admin_plugin_revert extends AdminPlugin
{
protected $cmd;
// some vars which might need tuning later
protected $max_lines = 800; // lines to read from changelog
protected $max_revs = 20; // numer of old revisions to check
/**
* Constructor
*/
public function __construct()
{
$this->setupLocale();
}
/**
* access for managers
*/
public function forAdminOnly()
{
return false;
}
/**
* return sort order for position in admin menu
*/
public function getMenuSort()
{
return 40;
}
/**
* handle user request
*/
public function handle()
{
}
/**
* output appropriate html
*/
public function html()
{
global $INPUT;
echo $this->locale_xhtml('intro');
$this->printSearchForm();
if (is_array($INPUT->param('revert')) && checkSecurityToken()) {
$this->revertEdits($INPUT->arr('revert'), $INPUT->str('filter'));
} elseif ($INPUT->has('filter')) {
$this->listEdits($INPUT->str('filter'));
}
}
/**
* Display the form for searching spam pages
*/
protected function printSearchForm()
{
global $lang, $INPUT;
echo '<form action="" method="post"><div class="no">';
echo '<label>' . $this->getLang('filter') . ': </label>';
echo '<input type="text" name="filter" class="edit" value="' . hsc($INPUT->str('filter')) . '" /> ';
echo '<button type="submit">' . $lang['btn_search'] . '</button> ';
echo '<span>' . $this->getLang('note1') . '</span>';
echo '</div></form><br /><br />';
}
/**
* Start the reversion process
*/
protected function revertEdits($revert, $filter)
{
echo '<hr /><br />';
echo '<p>' . $this->getLang('revstart') . '</p>';
echo '<ul>';
foreach ($revert as $id) {
global $REV;
// find the last non-spammy revision
$data = '';
$pagelog = new PageChangeLog($id);
$old = $pagelog->getRevisions(0, $this->max_revs);
if ($old !== []) {
foreach ($old as $REV) {
$data = rawWiki($id, $REV);
if (strpos($data, (string) $filter) === false) break;
}
}
if ($data) {
saveWikiText($id, $data, 'old revision restored', false);
printf('<li><div class="li">' . $this->getLang('reverted') . '</div></li>', $id, $REV);
} else {
saveWikiText($id, '', '', false);
printf('<li><div class="li">' . $this->getLang('removed') . '</div></li>', $id);
}
@set_time_limit(10);
flush();
}
echo '</ul>';
echo '<p>' . $this->getLang('revstop') . '</p>';
}
/**
* List recent edits matching the given filter
*/
protected function listEdits($filter)
{
global $conf;
global $lang;
echo '<hr /><br />';
echo '<form action="" method="post"><div class="no">';
echo '<input type="hidden" name="filter" value="' . hsc($filter) . '" />';
formSecurityToken();
$recents = getRecents(0, $this->max_lines);
echo '<ul>';
$cnt = 0;
foreach ($recents as $recent) {
if ($filter) {
if (strpos(rawWiki($recent['id']), (string) $filter) === false) continue;
}
$cnt++;
$date = dformat($recent['date']);
echo ($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? '<li class="minor">' : '<li>';
echo '<div class="li">';
echo '<input type="checkbox" name="revert[]" value="' . hsc($recent['id']) .
'" checked="checked" id="revert__' . $cnt . '" />';
echo ' <label for="revert__' . $cnt . '">' . $date . '</label> ';
echo '<a href="' . wl($recent['id'], "do=diff") . '">';
$p = [];
$p['src'] = DOKU_BASE . 'lib/images/diff.png';
$p['width'] = 15;
$p['height'] = 11;
$p['title'] = $lang['diff'];
$p['alt'] = $lang['diff'];
$att = buildAttributes($p);
echo "<img $att />";
echo '</a> ';
echo '<a href="' . wl($recent['id'], "do=revisions") . '">';
$p = [];
$p['src'] = DOKU_BASE . 'lib/images/history.png';
$p['width'] = 12;
$p['height'] = 14;
$p['title'] = $lang['btn_revs'];
$p['alt'] = $lang['btn_revs'];
$att = buildAttributes($p);
echo "<img $att />";
echo '</a> ';
echo html_wikilink(':' . $recent['id'], (useHeading('navigation')) ? null : $recent['id']);
echo ' – ' . htmlspecialchars($recent['sum']);
echo ' <span class="user">';
echo $recent['user'] . ' ' . $recent['ip'];
echo '</span>';
echo '</div>';
echo '</li>';
@set_time_limit(10);
flush();
}
echo '</ul>';
echo '<p>';
echo '<button type="submit">' . $this->getLang('revert') . '</button> ';
printf($this->getLang('note2'), hsc($filter));
echo '</p>';
echo '</div></form>';
}
}
//Setup VIM: ex: et ts=4 :