pukiwiki plus! のdumpプラグインでリストアが動作しない!

なぜか、pukiwiki plus! のdumpプラグインでリストアが機能しない現象にあたりました。
そもそもpukiwikiに詳しくないため、dumpプラグインのソースを解析することになったのでその顛末を書きとめておきます。

そもそもリストアのプラグインが呼ばれないじゃないか!

dumpプラグインではリストアするファイルをPOSTしたフォームにMenuというパラメータが無ければリストアのアクションが起動しないようでした。

// メニューを表示する必要があるか?
if (! isset($vars['menu'])) {
	// 入力フォームを表示
	$body = plugin_dump_disp_form();
	return array('msg' => $msg, 'body' => $body);
}

このように$vars[‘menu’]が要求され、なければ74行目のreturnでプラグインが終了してしまいます。
にもかかわらず、これをPOSTするフォームはというと…

  <input type="hidden" name="cmd"  value="dump" />
  <input type="hidden" name="page" value="$defaultpage" />
  <input type="hidden" name="act"  value="$act_up" />

となっており、menuの値など一切渡されません。

そこで、フォームを変更してmenuに’1’をセットして渡すようにしました。

  <input type="hidden" name="cmd"  value="dump" />
  <input type="hidden" name="page" value="$defaultpage" />
  <input type="hidden" name="act"  value="$act_up" />
  <input type="hidden" name="menu" value="1" />

これでひとまず、リストア処理が呼び出されるところまで行きましたが…
なぜか「解凍するファイルが無い!」というエラーが発生します。

よくよく調べていくと、アップロードするtar.gzからファイルを取り出す処理でなにやらフィルターが…

if ($name == TARLIB_DATA_LONGLINK) {
  // LongLink
  $buff     = fread($this->fp, $pdsz);
  $longname = substr($buff, 0, $size);
} else if (preg_match("/$pattern/", $name) ) {
  $buff = fread($this->fp, $pdsz);
  // 既に同じファイルがある場合は上書きされる
  $fpw = @fopen($name, 'wb');
  if ($fpw !== FALSE) {
    flock($fpw, LOCK_EX);
    fwrite($fpw, $buff, $size);
    @chmod($name, 0666);
    @touch($name, $mtime);
    flock($fpw, LOCK_UN);

この752行目のpreg_matchのパターンが怪しい…

どうやらこのパターン、復元先を保証するために設定されているようで、
ダンプファイルを取得したディレクトリ構造と同じ位置に復元する
という仕様のようでした。

私が今回試していたのは、実は別のWikiサービスからとってきたDumpを自分のサーバに上げようとしていたため、取得したダンプファイルのディレクトリ構造とリストア先のサーバのディレクトリ構造が異なっていたため、このフィルタに引っ掛かって上手くリストアされていなかったようです。

うーん、Dumpプラグインを改造しなくちゃです。