OSDN Git Service

htmlsc(): Just sugar for htmlspecialchars(), and a foundation
[pukiwiki/pukiwiki.git] / plugin / backup.inc.php
index 06c40dc..b673286 100644 (file)
 <?php
-/////////////////////////////////////////////////
 // PukiWiki - Yet another WikiWikiWeb clone.
+// $Id: backup.inc.php,v 1.29 2011/01/25 15:01:01 henoheno Exp $
+// Copyright (C)
+//   2002-2005, 2007 PukiWiki Developers Team
+//   2001-2002 Originally written by yu-ji
+// License: GPL v2 or (at your option) any later version
 //
-// $Id: backup.inc.php,v 1.7 2003/06/05 10:37:35 arino Exp $
-//
-// ¥Ð¥Ã¥¯¥¢¥Ã¥×
+// Backup plugin
+
+// Prohibit rendering old wiki texts (suppresses load, transfer rate, and security risk)
+define('PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING', PKWK_SAFE_MODE || PKWK_OPTIMISE);
+
 function plugin_backup_action()
 {
-       global $script,$vars,$do_backup,$hr;
-       global $_msg_backuplist,$_msg_diff,$_msg_nowdiff,$_msg_source,$_msg_backup;
-       global $_msg_view,$_msg_goto,$_msg_deleted,$_msg_addline,$_msg_delline;
-       global $_title_backupdiff,$_title_backupnowdiff,$_title_backupsource;
-       global $_title_backup,$_title_pagebackuplist,$_title_backuplist;
-       
-       if (!$do_backup)
-       {
-               return;
-       }
+       global $vars, $do_backup, $hr;
+       global $_msg_backuplist, $_msg_diff, $_msg_nowdiff, $_msg_source, $_msg_backup;
+       global $_msg_view, $_msg_goto, $_msg_deleted;
+       global $_title_backupdiff, $_title_backupnowdiff, $_title_backupsource;
+       global $_title_backup, $_title_pagebackuplist, $_title_backuplist;
 
-       $page = $s_page = $r_page = '';
-       if (array_key_exists('page',$vars))
-       {
-               $page   = $vars['page'];
-               $s_page = htmlspecialchars($page);
-               $r_page = rawurlencode($page);
-       }
-       $s_age = (array_key_exists('age',$vars) and is_numeric($vars['age'])) ? $vars['age'] : 0;
-       $action = $s_action = $r_action = '';
-       if (array_key_exists('action',$vars))
-       {
-               $action = $vars['action'];
-               $s_action = htmlspecialchars($action);
+       if (! $do_backup) return;
+
+       $page = isset($vars['page']) ? $vars['page']  : '';
+       if ($page == '') return array('msg'=>$_title_backuplist, 'body'=>plugin_backup_get_list_all());
+
+       check_readable($page, true, true);
+       $s_page = htmlsc($page);
+       $r_page = rawurlencode($page);
+
+       $action = isset($vars['action']) ? $vars['action'] : '';
+       if ($action == 'delete') return plugin_backup_delete($page);
+
+       $s_action = $r_action = '';
+       if ($action != '') {
+               $s_action = htmlsc($action);
                $r_action = rawurlencode($action);
        }
-       
-       $body = '';
-       
-       if ($page == '')
-       {
-               return array('msg'=>$_title_backuplist,'body'=>get_backup_list_all());
-       }
-       if ($action == 'delete')
-       {
-               return plugin_backup_delete($page);
-       }
-       if ($s_age == 0)
-       {
-               return array(
-                       'msg'  => $_title_pagebackuplist,
-                       'body' => get_backup_list($page)
-               );
-       }
-       
-       $body  = "<ul>\n";
-       $body .= " <li><a href=\"$script?cmd=backup\">$_msg_backuplist</a></li>\n";
-
-       $href = "$script?cmd=backup&amp;page=$r_page&amp;age=$s_age";
-       
-       if ($action != 'diff' and is_page($page))
-       {
-               $body .= " <li>".str_replace('$1',"<a href=\"$href&amp;action=diff\">$_msg_diff</a>",$_msg_view)."</li>\n";
-       }
-       if ($action != 'nowdiff' and is_page($page))
-       {
-               $body .= " <li>".str_replace('$1',"<a href=\"$href&amp;action=nowdiff\">$_msg_nowdiff</a>",$_msg_view)."</li>\n";
-       }
+
+       $s_age  = (isset($vars['age']) && is_numeric($vars['age'])) ? $vars['age'] : 0;
+       if ($s_age <= 0) return array( 'msg'=>$_title_pagebackuplist, 'body'=>plugin_backup_get_list($page));
+
+       $script = get_script_uri();
+
+       $body  = '<ul>' . "\n";
+       $body .= ' <li><a href="' . $script . '?cmd=backup">' . $_msg_backuplist . '</a></li>' ."\n";
+
+       $href    = $script . '?cmd=backup&amp;page=' . $r_page . '&amp;age=' . $s_age;
+       $is_page = is_page($page);
+
+       if ($is_page && $action != 'diff')
+               $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
+                       '&amp;action=diff">' . $_msg_diff . '</a>',
+                       $_msg_view) . '</li>' . "\n";
+
+       if ($is_page && $action != 'nowdiff')
+               $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
+                       '&amp;action=nowdiff">' . $_msg_nowdiff . '</a>',
+                       $_msg_view) . '</li>' . "\n";
+
        if ($action != 'source')
-       {
-               $body .= " <li>".str_replace('$1',"<a href=\"$href&amp;action=source\">$_msg_source</a>",$_msg_view)."</li>\n";
-       }
-       if ($action != '')
-       {
-               $body .= " <li>".str_replace('$1',"<a href=\"$href\">$_msg_backup</a>",$_msg_view)."</li>\n";
-       }
-       
-       if (is_page($page))
-       {
-               $body .= " <li>".str_replace('$1',"<a href=\"$script?$r_page\">$s_page</a>",$_msg_goto)."</li>\n";
-       }
-       else
-       {
-               $body .= " <li>".str_replace('$1',$s_page,$_msg_deleted)."</li>\n";
+               $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
+                       '&amp;action=source">' . $_msg_source . '</a>',
+                       $_msg_view) . '</li>' . "\n";
+
+       if (! PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING && $action)
+               $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
+                       '">' . $_msg_backup . '</a>',
+                       $_msg_view) . '</li>' . "\n";
+
+       if ($is_page) {
+               $body .= ' <li>' . str_replace('$1',
+                       '<a href="' . $script . '?' . $r_page . '">' . $s_page . '</a>',
+                       $_msg_goto) . "\n";
+       } else {
+               $body .= ' <li>' . str_replace('$1', $s_page, $_msg_deleted) . "\n";
        }
 
        $backups = get_backup($page);
-       if (count($backups) > 0)
-       {
-               $body .= "  <ul>\n";
-               foreach($backups as $age => $val)
-               {
-                       $date = format_date($val['time'],TRUE);
+       $backups_count = count($backups);
+       if ($s_age > $backups_count) $s_age = $backups_count;
+
+       if ($backups_count > 0) {
+               $body .= '  <ul>' . "\n";
+               foreach($backups as $age => $val) {
+                       $date = format_date($val['time'], TRUE);
                        $body .= ($age == $s_age) ?
-                               "   <li><em>$age $date</em></li>\n" :
-                               "   <li><a href=\"$script?cmd=backup&amp;action=$r_action&amp;page=$r_page&amp;age=$age\">$age $date</a></li>\n";
+                               '   <li><em>' . $age . ' ' . $date . '</em></li>' . "\n" :
+                               '   <li><a href="' . $script . '?cmd=backup&amp;action=' .
+                               $r_action . '&amp;page=' . $r_page . '&amp;age=' . $age .
+                               '">' . $age . ' ' . $date . '</a></li>' . "\n";
                }
-               $body .= "  </ul>\n";
-       }
-       $body .= " </li>\n";
-       $body .= "</ul>\n";
-       
-       if ($action == 'diff')
-       {
-               $old = ($s_age > 1) ? join('',$backups[$s_age - 1]['data']) : '';
-               $cur = join('',$backups[$s_age]['data']);
-               $body .= plugin_backup_diff(do_diff($old,$cur));
-               
-               return array('msg'=>str_replace('$2',$s_age,$_title_backupdiff),'body'=>$body);
-       }
-       else if ($s_action == 'nowdiff')
-       {
-               $old = join('',$backups[$s_age]['data']);
-               $cur = join('',get_source($page));
-               $body .= plugin_backup_diff(do_diff($old,$cur));
-               
-               return array('msg'=>str_replace('$2',$s_age,$_title_backupnowdiff),'body'=>$body);
+               $body .= '  </ul>' . "\n";
        }
-       else if ($s_action == 'source')
-       {
-               $body .= "<pre>".htmlspecialchars(join('',$backups[$s_age]['data']))."</pre>\n";
-               
-               return array('msg'=>str_replace('$2',$s_age,$_title_backupsource),'body'=>$body);
+       $body .= ' </li>' . "\n";
+       $body .= '</ul>'  . "\n";
+
+       if ($action == 'diff') {
+               $title = & $_title_backupdiff;
+               $old = ($s_age > 1) ? join('', $backups[$s_age - 1]['data']) : '';
+               $cur = join('', $backups[$s_age]['data']);
+               $body .= plugin_backup_diff(do_diff($old, $cur));
+       } else if ($s_action == 'nowdiff') {
+               $title = & $_title_backupnowdiff;
+               $old = join('', $backups[$s_age]['data']);
+               $cur = get_source($page, TRUE, TRUE);
+               $body .= plugin_backup_diff(do_diff($old, $cur));
+       } else if ($s_action == 'source') {
+               $title = & $_title_backupsource;
+               $body .= '<pre>' . htmlsc(join('', $backups[$s_age]['data'])) .
+                       '</pre>' . "\n";
+       } else {
+               if (PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING) {
+                       die_message('This feature is prohibited');
+               } else {
+                       $title = & $_title_backup;
+                       $body .= $hr . "\n" .
+                               drop_submit(convert_html($backups[$s_age]['data']));
+               }
        }
-       // else
-       $body .= "$hr\n".drop_submit(convert_html($backups[$s_age]['data']));
-       
-       return array('msg'=>str_replace('$2',$s_age,$_title_backup),'body'=>$body);
+
+       return array('msg'=>str_replace('$2', $s_age, $title), 'body'=>$body);
 }
-// ¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºï½ü
+
+// Delete backup
 function plugin_backup_delete($page)
 {
-       global $script,$post,$adminpass;
-       global $_title_backup_delete,$_msg_backup_deleted,$_msg_backup_delete;
-       global $_msg_backup_adminpass,$_btn_delete,$_msg_invalidpass;
-       
-       if (!backup_file_exists($page))
-       {
-               return;
-       }
-       $s_page = htmlspecialchars($page);
-       $pass = array_key_exists('pass',$post) ? $post['pass'] : NULL;
-       
-       if (md5($pass) == $adminpass)
-       {
-               backup_delete($page);
-               return array(
-                       'msg'  => $_title_backup_delete,
-                       'body' => str_replace('$1',make_pagelink($page),$_msg_backup_deleted)
-               );
+       global $vars, $_title_backup_delete, $_title_pagebackuplist, $_msg_backup_deleted;
+       global $_msg_backup_adminpass, $_btn_delete, $_msg_invalidpass;
+
+       if (! _backup_file_exists($page))
+               return array('msg'=>$_title_pagebackuplist, 'body'=>plugin_backup_get_list($page)); // Say "is not found"
+
+       $body = '';
+       if (isset($vars['pass'])) {
+               if (pkwk_login($vars['pass'])) {
+                       _backup_delete($page);
+                       return array(
+                               'msg'  => $_title_backup_delete,
+                               'body' => str_replace('$1', make_pagelink($page), $_msg_backup_deleted)
+                       );
+               } else {
+                       $body = '<p><strong>' . $_msg_invalidpass . '</strong></p>' . "\n";
+               }
        }
-       $body = ($pass === NULL) ? '' : "<p><strong>$_msg_invalidpass</strong></p>\n";
 
-       $msg_delete = str_replace('$1',make_pagelink($page),$_msg_backup_delete);
+       $script = get_script_uri();
+       $s_page = htmlsc($page);
        $body .= <<<EOD
 <p>$_msg_backup_adminpass</p>
 <form action="$script" method="post">
  <div>
-  <input type="hidden" name="cmd" value="backup" />
-  <input type="hidden" name="page" value="$s_page" />
-  <input type="hidden" name="action" value="delete" />
-  <input type="password" name="pass" size="12" />
-  <input type="submit" name="ok" value="$_btn_delete" />
+  <input type="hidden"   name="cmd"    value="backup" />
+  <input type="hidden"   name="page"   value="$s_page" />
+  <input type="hidden"   name="action" value="delete" />
+  <input type="password" name="pass"   size="12" />
+  <input type="submit"   name="ok"     value="$_btn_delete" />
  </div>
 </form>
 EOD;
-       return  array('msg'=>$_title_backup_delete,'body'=>$body);
-}      
-function plugin_backup_diff($str) 
+       return  array('msg'=>$_title_backup_delete, 'body'=>$body);
+}
+
+function plugin_backup_diff($str)
 {
-       global $_msg_addline,$_msg_delline,$hr;
-       
-       $str = htmlspecialchars($str);
-       $str = preg_replace('/^(\-)(.*)$/m','<span class="diff_removed"> $2</span>',$str);
-       $str = preg_replace('/^(\+)(.*)$/m','<span class="diff_added"> $2</span>',$str);
-       $str = trim($str);
-       $str = <<<EOD
+       global $_msg_addline, $_msg_delline, $hr;
+       $ul = <<<EOD
 $hr
 <ul>
  <li>$_msg_addline</li>
  <li>$_msg_delline</li>
 </ul>
-<pre>$str</pre>
 EOD;
-       
-       return $str;
+
+       return $ul . '<pre>' . diff_style_to_css(htmlsc($str)) . '</pre>' . "\n";
 }
 
-// ¥Ð¥Ã¥¯¥¢¥Ã¥×°ìÍ÷¤ò¼èÆÀ
-function get_backup_list($page)
+function plugin_backup_get_list($page)
 {
-       global $script;
-       global $_msg_backuplist,$_msg_diff,$_msg_nowdiff,$_msg_source,$_msg_nobackup;
+       global $_msg_backuplist, $_msg_diff, $_msg_nowdiff, $_msg_source, $_msg_nobackup;
        global $_title_backup_delete;
-       
+
+       $script = get_script_uri();
        $r_page = rawurlencode($page);
-       $s_page = htmlspecialchars($page);
+       $s_page = htmlsc($page);
        $retval = array();
        $retval[0] = <<<EOD
 <ul>
@@ -206,43 +195,53 @@ EOD;
  </li>
 </ul>
 EOD;
-       
-       $backups = backup_file_exists($page) ? get_backup($page) : array();
-       if (count($backups) == 0)
-       {
-               $msg = str_replace('$1',make_pagelink($page),$_msg_nobackup);
-               $retval[1] .= "   <li>$msg</li>\n";
-               return join('',$retval);
+
+       $backups = _backup_file_exists($page) ? get_backup($page) : array();
+       if (empty($backups)) {
+               $msg = str_replace('$1', make_pagelink($page), $_msg_nobackup);
+               $retval[1] .= '   <li>' . $msg . '</li>' . "\n";
+               return join('', $retval);
+       }
+
+       if (! PKWK_READONLY) {
+               $retval[1] .= '   <li><a href="' . $script . '?cmd=backup&amp;action=delete&amp;page=' .
+                       $r_page . '">';
+               $retval[1] .= str_replace('$1', $s_page, $_title_backup_delete);
+               $retval[1] .= '</a></li>' . "\n";
        }
-       $retval[1] .= "   <li><a href=\"$script?cmd=backup&amp;action=delete&amp;page=$r_page\">";
-       $retval[1] .= str_replace('$1',$s_page,$_title_backup_delete);
-       $retval[1] .= "</a></li>\n";
+
+       $href = $script . '?cmd=backup&amp;page=' . $r_page . '&amp;age=';
+       $_anchor_from = $_anchor_to   = '';
        foreach ($backups as $age=>$data) {
-               $date = format_date($data['time'],TRUE);
-               $href = "$script?cmd=backup&amp;page=$r_page&amp;age=$age";
+               if (! PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING) {
+                       $_anchor_from = '<a href="' . $href . $age . '">';
+                       $_anchor_to   = '</a>';
+               }
+               $date = format_date($data['time'], TRUE);
                $retval[1] .= <<<EOD
-   <li><a href="$href">$age $date</a>
-     [ <a href="$href&amp;action=diff">$_msg_diff</a>
-     | <a href="$href&amp;action=nowdiff">$_msg_nowdiff</a>
-     | <a href="$href&amp;action=source">$_msg_source</a>
+   <li>$_anchor_from$age $date$_anchor_to
+     [ <a href="$href$age&amp;action=diff">$_msg_diff</a>
+     | <a href="$href$age&amp;action=nowdiff">$_msg_nowdiff</a>
+     | <a href="$href$age&amp;action=source">$_msg_source</a>
      ]
    </li>
 EOD;
        }
-       return join('',$retval);
+
+       return join('', $retval);
 }
-// Á´¥Ú¡¼¥¸¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×°ìÍ÷¤ò¼èÆÀ
-function get_backup_list_all($withfilename = FALSE)
+
+// List for all pages
+function plugin_backup_get_list_all($withfilename = FALSE)
 {
        global $cantedit;
-       
-       $pages = array_diff(get_existpages(BACKUP_DIR,BACKUP_EXT),$cantedit);
-       
-       if (count($pages) == 0)
-       {
+
+       $pages = array_diff(get_existpages(BACKUP_DIR, BACKUP_EXT), $cantedit);
+
+       if (empty($pages)) {
                return '';
+       } else {
+               return page_list($pages, 'backup', $withfilename);
        }
-       
-       return page_list($pages,'backup',$withfilename);
 }
 ?>