194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
 | 
						||
use dokuwiki\ChangeLog\PageChangeLog;
 | 
						||
 | 
						||
/**
 | 
						||
 * All DokuWiki plugins to extend the admin function
 | 
						||
 * need to inherit from this class
 | 
						||
 */
 | 
						||
class admin_plugin_revert extends DokuWiki_Admin_Plugin
 | 
						||
{
 | 
						||
    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 (count($old)) {
 | 
						||
                foreach ($old as $REV) {
 | 
						||
                    $data = rawWiki($id, $REV);
 | 
						||
                    if (strpos($data, $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']), $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 = array();
 | 
						||
            $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 = array();
 | 
						||
            $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 :
 |