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 :
 |