OSDN Git Service

BugTrack/554 HTTP 'Location:' header needs absolute URI
[pukiwiki/pukiwiki.git] / plugin / rename.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: rename.inc.php,v 1.16 2004/10/10 10:20:59 henoheno Exp $
6 //
7
8 /*
9  * ¥×¥é¥°¥¤¥ó rename
10  * ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
11  *
12  * Usage
13  *  http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
14  *
15  * ¥Ñ¥é¥á¡¼¥¿
16  * &refer=¥Ú¡¼¥¸Ì¾
17  * ¥Ú¡¼¥¸¤ò»ØÄê
18  *
19  */
20
21 define('RENAME_LOGPAGE', ':RenameLog');
22
23 function plugin_rename_action()
24 {
25         global $whatsnew;
26
27         $method = rename_getvar('method');
28         if ($method == 'regex')
29         {
30                 $src = rename_getvar('src');
31                 $dst = rename_getvar('dst');
32                 if ($src == '')
33                 {
34                         return rename_phase1();
35                 }
36
37                 $src_pattern = '/' . preg_quote($src, '/') . '/';
38                 $arr0 = preg_grep($src_pattern, get_existpages());
39                 if (! is_array($arr0) or count($arr0) == 0)
40                 {
41                         return rename_phase1('nomatch');
42                 }
43                 $arr1 = preg_replace($src_pattern, $dst, $arr0);
44                 foreach ($arr1 as $page)
45                 {
46                         if (! is_pagename($page))
47                         {
48                                 return rename_phase1('notvalid');
49                         }
50                 }
51                 return rename_regex($arr0, $arr1);
52         }
53         else // $method == 'page'
54         {
55                 $page  = rename_getvar('page');
56                 $refer = rename_getvar('refer');
57                 if ($refer == '')
58                 {
59                         return rename_phase1();
60                 }
61                 if (!is_page($refer))
62                 {
63                         return rename_phase1('notpage', $refer);
64                 }
65                 if ($refer == $whatsnew)
66                 {
67                         return rename_phase1('norename', $refer);
68                 }
69                 if ($page == '' or $page == $refer)
70                 {
71                         return rename_phase2();
72                 }
73                 if (! is_pagename($page))
74                 {
75                         return rename_phase2('notvalid');
76                 }
77                 return rename_refer();
78         }
79 }
80
81 // ÊÑ¿ô¤ò¼èÆÀ¤¹¤ë
82 function rename_getvar($key)
83 {
84         global $vars;
85
86         return isset($vars[$key]) ? $vars[$key] : '';
87 }
88
89 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
90 function rename_err($err, $page = '')
91 {
92         global $_rename_messages;
93
94         if ($err == '')
95         {
96                 return '';
97         }
98         $body = $_rename_messages["err_$err"];
99         if (is_array($page))
100         {
101                 $tmp = '';
102                 foreach ($page as $_page)
103                 {
104                         $tmp .= "<br />$_page";
105                 }
106                 $page = $tmp;
107         }
108         if ($page != '')
109         {
110                 $body = sprintf($body, htmlspecialchars($page));
111         }
112         $msg = sprintf($_rename_messages['err'], $body);
113         return $msg;
114 }
115
116 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
117 function rename_phase1($err = '', $page = '')
118 {
119         global $script, $_rename_messages;
120
121         $msg    = rename_err($err, $page);
122         $refer  = rename_getvar('refer');
123         $method = rename_getvar('method');
124
125         $radio_regex = $radio_page = '';
126         if ($method == 'regex')
127         {
128                 $radio_regex =' checked';
129         }
130         else
131         {
132                 $radio_page = ' checked';
133         }
134         $select_refer = rename_getselecttag($refer);
135
136         $s_src = htmlspecialchars(rename_getvar('src'));
137         $s_dst = htmlspecialchars(rename_getvar('dst'));
138
139         $ret = array();
140         $ret['msg'] = $_rename_messages['msg_title'];
141         $ret['body'] = <<<EOD
142 $msg
143 <form action="$script" method="post">
144  <div>
145   <input type="hidden" name="plugin" value="rename" />
146   <input type="radio"  name="method" value="page"$radio_page />
147   {$_rename_messages['msg_page']}:$select_refer<br />
148   <input type="radio" name="method" value="regex"$radio_regex />
149   {$_rename_messages['msg_regex']}:<br />
150   From:<br />
151   <input type="text" name="src" size="80" value="$s_src" /><br />
152   To:<br />
153   <input type="text" name="dst" size="80" value="$s_dst" /><br />
154   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
155  </div>
156 </form>
157 EOD;
158         return $ret;
159 }
160
161 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
162 function rename_phase2($err = '')
163 {
164         global $script, $_rename_messages;
165
166         $msg   = rename_err($err);
167         $page  = rename_getvar('page');
168         $refer = rename_getvar('refer');
169         if ($page == '')
170         {
171                 $page = $refer;
172         }
173
174         $related = rename_getrelated($refer);
175         $msg_related = '';
176         if (count($related) > 0)
177         {
178                 $msg_related = $_rename_messages['msg_do_related'].
179                         '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
180         }
181         $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
182
183         $s_page  = htmlspecialchars($page);
184         $s_refer = htmlspecialchars($refer);
185
186         $ret = array();
187         $ret['msg'] = $_rename_messages['msg_title'];
188         $ret['body'] = <<<EOD
189 $msg
190 <form action="$script" method="post">
191  <div>
192   <input type="hidden" name="plugin" value="rename" />
193   <input type="hidden" name="refer"  value="$s_refer" />
194   $msg_rename<br />
195   {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
196   $msg_related
197   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
198  </div>
199 </form>
200 EOD;
201         if (count($related) > 0)
202         {
203                 $ret['body'] .= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
204                 sort($related);
205                 foreach ($related as $name)
206                 {
207                         $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
208                 }
209                 $ret['body'] .= '</ul>';
210         }
211         return $ret;
212 }
213
214 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
215 function rename_refer()
216 {
217         $page  = rename_getvar('page');
218         $refer = rename_getvar('refer');
219
220         $pages[encode($refer)] = encode($page);
221         if (rename_getvar('related') != '')
222         {
223                 $from = strip_bracket($refer);
224                 $to   = strip_bracket($page);
225                 foreach (rename_getrelated($refer) as $_page)
226                 {
227                         $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
228                 }
229         }
230         return rename_phase3($pages);
231 }
232
233 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
234 function rename_regex($arr_from, $arr_to)
235 {
236         $exists = array();
237         foreach ($arr_to as $page)
238         {
239                 if (is_page($page))
240                 {
241                         $exists[] = $page;
242                 }
243         }
244         if (count($exists) > 0)
245         {
246                 return rename_phase1('already', $exists);
247         }
248
249         $pages = array();
250         foreach ($arr_from as $refer)
251         {
252                 $pages[encode($refer)] = encode(array_shift($arr_to));
253         }
254         return rename_phase3($pages);
255 }
256
257 function rename_phase3($pages)
258 {
259         global $script, $_rename_messages;
260
261         $msg = $input = '';
262         $files = rename_get_files($pages);
263
264         $exists = array();
265         foreach ($files as $_page=>$arr)
266         {
267                 foreach ($arr as $old=>$new)
268                 {
269                         if (file_exists($new))
270                         {
271                                 $exists[$_page][$old] = $new;
272                         }
273                 }
274         }
275         $pass = rename_getvar('pass');
276         if ($pass != '' && pkwk_login($pass))
277         {
278                 return rename_proceed($pages, $files, $exists);
279         }
280         else if ($pass != '')
281         {
282                 $msg = rename_err('adminpass');
283         }
284         $method = rename_getvar('method');
285         if ($method == 'regex')
286         {
287                 $s_src = htmlspecialchars(rename_getvar('src'));
288                 $s_dst = htmlspecialchars(rename_getvar('dst'));
289                 $msg   .= $_rename_messages['msg_regex'] . '<br />';
290                 $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
291                 $input .= "<input type=\"hidden\" name=\"src\"    value=\"$s_src\" />";
292                 $input .= "<input type=\"hidden\" name=\"dst\"    value=\"$s_dst\" />";
293         }
294         else
295         {
296                 $s_refer = htmlspecialchars(rename_getvar('refer'));
297                 $s_page  = htmlspecialchars(rename_getvar('page'));
298                 $s_related = htmlspecialchars(rename_getvar('related'));
299                 $msg   .= $_rename_messages['msg_page'] . '<br />';
300                 $input .= "<input type=\"hidden\" name=\"method\"  value=\"page\" />";
301                 $input .= "<input type=\"hidden\" name=\"refer\"   value=\"$s_refer\" />";
302                 $input .= "<input type=\"hidden\" name=\"page\"    value=\"$s_page\" />";
303                 $input .= "<input type=\"hidden\" name=\"related\" value=\"$s_related\" />";
304         }
305
306         if (count($exists) > 0)
307         {
308                 $msg .= $_rename_messages['err_already_below'] . "<ul>";
309                 foreach ($exists as $page=>$arr)
310                 {
311                         $msg .= '<li>';
312                         $msg .= make_pagelink(decode($page));
313                         $msg .= $_rename_messages['msg_arrow'];
314                         $msg .= htmlspecialchars(decode($pages[$page]));
315                         if (count($arr) > 0)
316                         {
317                                 $msg .= "<ul>\n";
318                                 foreach ($arr as $ofile=>$nfile)
319                                 {
320                                         $msg .= '<li>' . $ofile . $_rename_messages['msg_arrow'] . $nfile."</li>\n";
321                                 }
322                                 $msg .= '</ul>';
323                         }
324                         $msg .= "</li>\n";
325                 }
326                 $msg .= "</ul><hr />\n";
327
328                 $input .= '<input type="radio" name="exist" value="0" checked="checked" />' . $_rename_messages['msg_exist_none'] . '<br />';
329                 $input .= '<input type="radio" name="exist" value="1" />' . $_rename_messages['msg_exist_overwrite'] . '<br />';
330         }
331
332         $ret = array();
333         $ret['msg'] = $_rename_messages['msg_title'];
334         $ret['body'] = <<<EOD
335 <p>$msg</p>
336 <form action="$script" method="post">
337  <div>
338   <input type="hidden" name="plugin" value="rename" />
339   $input
340   {$_rename_messages['msg_adminpass']}
341   <input type="password" name="pass" value="" />
342   <input type="submit" value="{$_rename_messages['btn_submit']}" />
343  </div>
344 </form>
345 <p>{$_rename_messages['msg_confirm']}</p>
346 EOD;
347
348         ksort($pages);
349         $ret['body'] .= "<ul>\n";
350         foreach ($pages as $old=>$new)
351         {
352                 $ret['body'] .= '<li>' .  make_pagelink(decode($old)) .
353                         $_rename_messages['msg_arrow'] .  htmlspecialchars(decode($new)) .  "</li>\n";
354         }
355         $ret['body'] .= "</ul>\n";
356         return $ret;
357 }
358
359 function rename_get_files($pages)
360 {
361         $files = array();
362         $dirs  = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
363         if (exist_plugin_convert('attach'))
364         {
365                 $dirs[] = UPLOAD_DIR;
366         }
367         if (exist_plugin_convert('counter'))
368         {
369                 $dirs[] = COUNTER_DIR;
370         }
371         // and more ...
372
373         $matches = array();
374         foreach ($dirs as $path)
375         {
376                 $dir = opendir($path);
377                 if (! $dir) continue;
378
379                 while ($file = readdir($dir))
380                 {
381                         if ($file == '.' or $file == '..')
382                         {
383                                 continue;
384                         }
385                         foreach ($pages as $from=>$to)
386                         {
387                                 $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
388                                 if (! preg_match($pattern, $file, $matches))
389                                 {
390                                         continue;
391                                 }
392                                 $newfile = $to . $matches[1];
393                                 $files[$from][$path . $file] = $path . $newfile;
394                         }
395                 }
396         }
397         return $files;
398 }
399
400 function rename_proceed($pages, $files, $exists)
401 {
402         global $now, $_rename_messages;
403
404         if (rename_getvar('exist') == '')
405         {
406                 foreach ($exists as $key=>$arr)
407                 {
408                         unset($files[$key]);
409                 }
410         }
411
412         set_time_limit(0);
413         foreach ($files as $page=>$arr)
414         {
415                 foreach ($arr as $old=>$new)
416                 {
417                         if ($exists[$page][$old])
418                         {
419                                 unlink($new);
420                         }
421                         rename($old, $new);
422
423                         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
424                         links_update($old);
425                         links_update($new);
426                 }
427         }
428
429         $postdata = get_source(RENAME_LOGPAGE);
430         $postdata[] = '*' . $now . "\n";
431         if (rename_getvar('method') == 'regex')
432         {
433                 $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
434                 $postdata[] = '--From:[[' . rename_getvar('src') . "]]\n";
435                 $postdata[] = '--To:[['   . rename_getvar('dst') . "]]\n";
436         }
437         else
438         {
439                 $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
440                 $postdata[] = '--From:[[' . rename_getvar('refer') . "]]\n";
441                 $postdata[] = '--To:[['   . rename_getvar('page') . "]]\n";
442         }
443         if (count($exists) > 0)
444         {
445                 $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
446                 foreach ($exists as $page=>$arr)
447                 {
448                         $postdata[] = '-' . decode($page) .
449                                 $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
450                         foreach ($arr as $ofile=>$nfile)
451                         {
452                                 $postdata[] = '--' . $ofile .
453                                         $_rename_messages['msg_arrow'] . $nfile . "\n";
454                         }
455                 }
456                 $postdata[] = "----\n";
457         }
458         foreach ($pages as $old=>$new)
459         {
460                 $postdata[] = '-' . decode($old) .
461                         $_rename_messages['msg_arrow'] . decode($new) . "\n";
462         }
463
464         // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
465
466         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
467         page_write(RENAME_LOGPAGE, join('', $postdata));
468
469         //¥ê¥À¥¤¥ì¥¯¥È
470         $page = rename_getvar('page');
471         if ($page == '')
472         {
473                 $page = RENAME_LOGPAGE;
474         }
475         header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
476         die();
477 }
478
479 function rename_getrelated($page)
480 {
481         $related = array();
482         $pages = get_existpages();
483         $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
484         foreach ($pages as $name)
485         {
486                 if ($name == $page)
487                 {
488                         continue;
489                 }
490                 if (preg_match($pattern, $name))
491                 {
492                         $related[] = $name;
493                 }
494         }
495         return $related;
496 }
497
498 function rename_getselecttag($page)
499 {
500         global $whatsnew;
501
502         $pages =array();
503         foreach (get_existpages() as $_page)
504         {
505                 if ($_page == $whatsnew)
506                 {
507                         continue;
508                 }
509                 $selected = ($_page == $page) ? ' selected' : '';
510                 $s_page = htmlspecialchars($_page);
511                 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
512         }
513         ksort($pages);
514         $list = join("\n ", $pages);
515
516         return <<<EOD
517 <select name="refer">
518  <option value=""></option>
519  $list
520 </select>
521 EOD;
522
523 }
524 ?>