OSDN Git Service

BugTrack/779: Cleanup/Simplify.
[pukiwiki/pukiwiki.git] / plugin / backup.inc.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: backup.inc.php,v 1.25 2005/12/10 10:50:59 henoheno Exp $
4 //
5 // Backup plugin
6
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);
9
10 function plugin_backup_action()
11 {
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;
17
18         if (! $do_backup) return;
19
20         $page = isset($vars['page']) ? $vars['page']  : '';
21         if ($page == '') return array('msg'=>$_title_backuplist, 'body'=>plugin_backup_get_list_all());
22
23         check_readable($page, true, true);
24         $s_page = htmlspecialchars($page);
25         $r_page = rawurlencode($page);
26
27         $action = isset($vars['action']) ? $vars['action'] : '';
28         if ($action == 'delete') return plugin_backup_delete($page);
29
30         $s_action = $r_action = '';
31         if ($action != '') {
32                 $s_action = htmlspecialchars($action);
33                 $r_action = rawurlencode($action);
34         }
35
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));
38
39         $script = get_script_uri();
40
41         $body  = '<ul>' . "\n";
42         $body .= ' <li><a href="' . $script . '?cmd=backup">' . $_msg_backuplist . '</a></li>' ."\n";
43
44         $href    = $script . '?cmd=backup&amp;page=' . $r_page . '&amp;age=' . $s_age;
45         $is_page = is_page($page);
46
47         if ($is_page && $action != 'diff')
48                 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
49                         '&amp;action=diff">' . $_msg_diff . '</a>',
50                         $_msg_view) . '</li>' . "\n";
51
52         if ($is_page && $action != 'nowdiff')
53                 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
54                         '&amp;action=nowdiff">' . $_msg_nowdiff . '</a>',
55                         $_msg_view) . '</li>' . "\n";
56
57         if ($action != 'source')
58                 $body .= ' <li>' . str_replace('$1', '<a href="' . $href .
59                         '&amp;action=source">' . $_msg_source . '</a>',
60                         $_msg_view) . '</li>' . "\n";
61
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";
66
67         if ($is_page) {
68                 $body .= ' <li>' . str_replace('$1',
69                         '<a href="' . $script . '?' . $r_page . '">' . $s_page . '</a>',
70                         $_msg_goto) . "\n";
71         } else {
72                 $body .= ' <li>' . str_replace('$1', $s_page, $_msg_deleted) . "\n";
73         }
74
75         $backups = get_backup($page);
76         $backups_count = count($backups);
77         if ($s_age > $backups_count) $s_age = $backups_count;
78
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&amp;action=' .
86                                 $r_action . '&amp;page=' . $r_page . '&amp;age=' . $age .
87                                 '">' . $age . ' ' . $date . '</a></li>' . "\n";
88                 }
89                 $body .= '  </ul>' . "\n";
90         }
91         $body .= ' </li>' . "\n";
92         $body .= '</ul>'  . "\n";
93
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'])) .
107                         '</pre>' . "\n";
108         } else {
109                 if (PLUGIN_BACKUP_DISABLE_BACKUP_RENDERING) {
110                         die_message('This feature is prohibited');
111                 } else {
112                         $title = & $_title_backup;
113                         $body .= $hr . "\n" .
114                                 drop_submit(convert_html($backups[$s_age]['data']));
115                 }
116         }
117
118         return array('msg'=>str_replace('$2', $s_age, $title), 'body'=>$body);
119 }
120
121 // Delete backup
122 function plugin_backup_delete($page)
123 {
124         global $vars, $_title_backup_delete, $_title_pagebackuplist, $_msg_backup_deleted;
125         global $_msg_backup_adminpass, $_btn_delete, $_msg_invalidpass;
126
127         if (! _backup_file_exists($page))
128                 return array('msg'=>$_title_pagebackuplist, 'body'=>plugin_backup_get_list($page)); // Say "is not found"
129
130         $body = '';
131         if (isset($vars['pass'])) {
132                 if (pkwk_login($vars['pass'])) {
133                         _backup_delete($page);
134                         return array(
135                                 'msg'  => $_title_backup_delete,
136                                 'body' => str_replace('$1', make_pagelink($page), $_msg_backup_deleted)
137                         );
138                 } else {
139                         $body = '<p><strong>' . $_msg_invalidpass . '</strong></p>' . "\n";
140                 }
141         }
142
143         $script = get_script_uri();
144         $s_page = htmlspecialchars($page);
145         $body .= <<<EOD
146 <p>$_msg_backup_adminpass</p>
147 <form action="$script" method="post">
148  <div>
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" />
154  </div>
155 </form>
156 EOD;
157         return  array('msg'=>$_title_backup_delete, 'body'=>$body);
158 }
159
160 function plugin_backup_diff($str)
161 {
162         global $_msg_addline, $_msg_delline, $hr;
163
164         $str = htmlspecialchars($str);
165
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);
170
171         $str = <<<EOD
172 $hr
173 <ul>
174  <li>$_msg_addline</li>
175  <li>$_msg_delline</li>
176 </ul>
177 <pre>$str</pre>
178 EOD;
179
180         return $str;
181 }
182
183 function plugin_backup_get_list($page)
184 {
185         global $_msg_backuplist, $_msg_diff, $_msg_nowdiff, $_msg_source, $_msg_nobackup;
186         global $_title_backup_delete;
187
188         $script = get_script_uri();
189         $r_page = rawurlencode($page);
190         $s_page = htmlspecialchars($page);
191         $retval = array();
192         $retval[0] = <<<EOD
193 <ul>
194  <li><a href="$script?cmd=backup">$_msg_backuplist</a>
195   <ul>
196 EOD;
197         $retval[1] = "\n";
198         $retval[2] = <<<EOD
199   </ul>
200  </li>
201 </ul>
202 EOD;
203
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);
209         }
210
211         if (! PKWK_READONLY) {
212                 $retval[1] .= '   <li><a href="' . $script . '?cmd=backup&amp;action=delete&amp;page=' .
213                         $r_page . '">';
214                 $retval[1] .= str_replace('$1', $s_page, $_title_backup_delete);
215                 $retval[1] .= '</a></li>' . "\n";
216         }
217
218         $href = $script . '?cmd=backup&amp;page=' . $r_page . '&amp;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>';
224                 }
225                 $date = format_date($data['time'], TRUE);
226                 $retval[1] .= <<<EOD
227    <li>$_anchor_from$age $date$_anchor_to
228      [ <a href="$href$age&amp;action=diff">$_msg_diff</a>
229      | <a href="$href$age&amp;action=nowdiff">$_msg_nowdiff</a>
230      | <a href="$href$age&amp;action=source">$_msg_source</a>
231      ]
232    </li>
233 EOD;
234         }
235
236         return join('', $retval);
237 }
238
239 // List for all pages
240 function plugin_backup_get_list_all($withfilename = FALSE)
241 {
242         global $cantedit;
243
244         $pages = array_diff(get_existpages(BACKUP_DIR, BACKUP_EXT), $cantedit);
245
246         if (empty($pages)) {
247                 return '';
248         } else {
249                 return page_list($pages, 'backup', $withfilename);
250         }
251 }
252 ?>