2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: backup.inc.php,v 1.25 2005/12/10 10:50:59 henoheno Exp $
7 // Prohibit rendering old wiki texts (suppresses load, transfer rate, and security risk)
8 define('PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING', PKWK_SAFE_MODE || PKWK_OPTIMISE);
10 function plugin_backup_action()
12 global $vars, $do_backup, $hr;
13 global $_msg_backuplist, $_msg_diff, $_msg_nowdiff, $_msg_source, $_msg_backup;
14 global $_msg_view, $_msg_goto, $_msg_deleted;
15 global $_title_backupdiff, $_title_backupnowdiff, $_title_backupsource;
16 global $_title_backup, $_title_pagebackuplist, $_title_backuplist;
18 if (! $do_backup) return;
20 $page = isset($vars['page']) ? $vars['page'] : '';
21 if ($page == '') return array('msg'=>$_title_backuplist, 'body'=>plugin_backup_get_list_all());
23 check_readable($page, true, true);
24 $s_page = htmlspecialchars($page);
25 $r_page = rawurlencode($page);
27 $action = isset($vars['action']) ? $vars['action'] : '';
28 if ($action == 'delete') return plugin_backup_delete($page);
30 $s_action = $r_action = '';
32 $s_action = htmlspecialchars($action);
33 $r_action = rawurlencode($action);
36 $s_age = (isset($vars['age']) && is_numeric($vars['age'])) ? $vars['age'] : 0;
37 if ($s_age <= 0) return array( 'msg'=>$_title_pagebackuplist, 'body'=>plugin_backup_get_list($page));
39 $script = get_script_uri();
41 $body = '<ul>' . "\n";
42 $body .= ' <li><a href="' . $script . '?cmd=backup">' . $_msg_backuplist . '</a></li>' ."\n";
44 $href = $script . '?cmd=backup&page=' . $r_page . '&age=' . $s_age;
45 $is_page = is_page($page);
47 if ($is_page && $action != 'diff')
48 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
49 '&action=diff">' . $_msg_diff . '</a>',
50 $_msg_view) . '</li>' . "\n";
52 if ($is_page && $action != 'nowdiff')
53 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
54 '&action=nowdiff">' . $_msg_nowdiff . '</a>',
55 $_msg_view) . '</li>' . "\n";
57 if ($action != 'source')
58 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
59 '&action=source">' . $_msg_source . '</a>',
60 $_msg_view) . '</li>' . "\n";
62 if (! PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING && $action)
63 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
64 '">' . $_msg_backup . '</a>',
65 $_msg_view) . '</li>' . "\n";
68 $body .= ' <li>' . str_replace('$1',
69 '<a href="' . $script . '?' . $r_page . '">' . $s_page . '</a>',
72 $body .= ' <li>' . str_replace('$1', $s_page, $_msg_deleted) . "\n";
75 $backups = get_backup($page);
76 $backups_count = count($backups);
77 if ($s_age > $backups_count) $s_age = $backups_count;
79 if ($backups_count > 0) {
80 $body .= ' <ul>' . "\n";
81 foreach($backups as $age => $val) {
82 $date = format_date($val['time'], TRUE);
83 $body .= ($age == $s_age) ?
84 ' <li><em>' . $age . ' ' . $date . '</em></li>' . "\n" :
85 ' <li><a href="' . $script . '?cmd=backup&action=' .
86 $r_action . '&page=' . $r_page . '&age=' . $age .
87 '">' . $age . ' ' . $date . '</a></li>' . "\n";
89 $body .= ' </ul>' . "\n";
91 $body .= ' </li>' . "\n";
92 $body .= '</ul>' . "\n";
94 if ($action == 'diff') {
95 $title = & $_title_backupdiff;
96 $old = ($s_age > 1) ? join('', $backups[$s_age - 1]['data']) : '';
97 $cur = join('', $backups[$s_age]['data']);
98 $body .= plugin_backup_diff(do_diff($old, $cur));
99 } else if ($s_action == 'nowdiff') {
100 $title = & $_title_backupnowdiff;
101 $old = join('', $backups[$s_age]['data']);
102 $cur = join('', get_source($page));
103 $body .= plugin_backup_diff(do_diff($old, $cur));
104 } else if ($s_action == 'source') {
105 $title = & $_title_backupsource;
106 $body .= '<pre>' . htmlspecialchars(join('', $backups[$s_age]['data'])) .
109 if (PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING) {
110 die_message('This feature is prohibited');
112 $title = & $_title_backup;
113 $body .= $hr . "\n" .
114 drop_submit(convert_html($backups[$s_age]['data']));
118 return array('msg'=>str_replace('$2', $s_age, $title), 'body'=>$body);
122 function plugin_backup_delete($page)
124 global $vars, $_title_backup_delete, $_title_pagebackuplist, $_msg_backup_deleted;
125 global $_msg_backup_adminpass, $_btn_delete, $_msg_invalidpass;
127 if (! _backup_file_exists($page))
128 return array('msg'=>$_title_pagebackuplist, 'body'=>plugin_backup_get_list($page)); // Say "is not found"
131 if (isset($vars['pass'])) {
132 if (pkwk_login($vars['pass'])) {
133 _backup_delete($page);
135 'msg' => $_title_backup_delete,
136 'body' => str_replace('$1', make_pagelink($page), $_msg_backup_deleted)
139 $body = '<p><strong>' . $_msg_invalidpass . '</strong></p>' . "\n";
143 $script = get_script_uri();
144 $s_page = htmlspecialchars($page);
146 <p>$_msg_backup_adminpass</p>
147 <form action="$script" method="post">
149 <input type="hidden" name="cmd" value="backup" />
150 <input type="hidden" name="page" value="$s_page" />
151 <input type="hidden" name="action" value="delete" />
152 <input type="password" name="pass" size="12" />
153 <input type="submit" name="ok" value="$_btn_delete" />
157 return array('msg'=>$_title_backup_delete, 'body'=>$body);
160 function plugin_backup_diff($str)
162 global $_msg_addline, $_msg_delline, $hr;
164 $str = htmlspecialchars($str);
166 // Cut diff markers ('+' or '-' or ' ')
167 $str = preg_replace('/^\-(.*)$/m', '<span class="diff_removed">$1</span>', $str);
168 $str = preg_replace('/^\+(.*)$/m', '<span class="diff_added" >$1</span>', $str);
169 $str = preg_replace('/^ (.*)$/m', '$1', $str);
174 <li>$_msg_addline</li>
175 <li>$_msg_delline</li>
183 function plugin_backup_get_list($page)
185 global $_msg_backuplist, $_msg_diff, $_msg_nowdiff, $_msg_source, $_msg_nobackup;
186 global $_title_backup_delete;
188 $script = get_script_uri();
189 $r_page = rawurlencode($page);
190 $s_page = htmlspecialchars($page);
194 <li><a href="$script?cmd=backup">$_msg_backuplist</a>
204 $backups = _backup_file_exists($page) ? get_backup($page) : array();
205 if (empty($backups)) {
206 $msg = str_replace('$1', make_pagelink($page), $_msg_nobackup);
207 $retval[1] .= ' <li>' . $msg . '</li>' . "\n";
208 return join('', $retval);
211 if (! PKWK_READONLY) {
212 $retval[1] .= ' <li><a href="' . $script . '?cmd=backup&action=delete&page=' .
214 $retval[1] .= str_replace('$1', $s_page, $_title_backup_delete);
215 $retval[1] .= '</a></li>' . "\n";
218 $href = $script . '?cmd=backup&page=' . $r_page . '&age=';
219 $_anchor_from = $_anchor_to = '';
220 foreach ($backups as $age=>$data) {
221 if (! PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING) {
222 $_anchor_from = '<a href="' . $href . $age . '">';
223 $_anchor_to = '</a>';
225 $date = format_date($data['time'], TRUE);
227 <li>$_anchor_from$age $date$_anchor_to
228 [ <a href="$href$age&action=diff">$_msg_diff</a>
229 | <a href="$href$age&action=nowdiff">$_msg_nowdiff</a>
230 | <a href="$href$age&action=source">$_msg_source</a>
236 return join('', $retval);
239 // List for all pages
240 function plugin_backup_get_list_all($withfilename = FALSE)
244 $pages = array_diff(get_existpages(BACKUP_DIR, BACKUP_EXT), $cantedit);
249 return page_list($pages, 'backup', $withfilename);