<?php
-/////////////////////////////////////////////////
-// $Id: dump.inc.php,v 1.26 2004/09/29 14:46:07 henoheno Exp $
+// $Id: dump.inc.php,v 1.34 2005/01/23 07:24:11 henoheno Exp $
+//
+// Remote dump / restore plugin
// Originated as tarfile.inc.php by teanan / Interfair Laboratory 2004.
-// [¹¹¿·ÍúÎò]
-// 2004-09-21 version 0.0 [»ÃÄêÈÇ]
-// ¡¦¤È¤ê¤¢¤¨¤º wiki ¥Ç¥£¥ì¥¯¥È¥ê¤¬tar.gz¤Ç¼è¤ê½Ð¤»¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
-// 2004-09-22 version 0.1 [»ÃÄêÈÇ]
-// ¡¦¡Átar.gz/¡Á.tar¤ÎÁªÂò¤ËÂбþ
-// ¡¦attach,backup¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÂбþ
-// ¡¦¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ëµ¡Ç½¤òÄɲÃ(wiki/attach/backup)
-// ¡¦¥Õ¥¡¥¤¥ë°ìÍ÷¤Î¼èÆÀÊýË¡¤òÊѹ¹(glob¢ªopendir)
-// 2004-09-22 version 0.2
-// ¡¦¥Õ¥¡¥¤¥ë¤Î¥¢¥Ã¥×¥í¡¼¥É(¥ê¥¹¥È¥¢)¤ËÂбþ(tar/tar.gz)
-// (ÂÐ¾Ý¤Ï wiki,attach¥Ç¥£¥ì¥¯¥È¥ê¤Î¤ß)
-// 2004-09-22 version 1.0
-// ¡¦LongLink(100¥Ð¥¤¥È¤òĶ¤¨¤¿¥Õ¥¡¥¤¥ë̾)¤ËÂбþ
-// ¡¦¥ê¥¹¥È¥¢»þ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¸µ¤ËÌ᤹¤è¤¦¤Ë½¤Àµ
-
/////////////////////////////////////////////////
// User defines
define('PLUGIN_DUMP_DUMP', 'dump'); // Dump & download
define('PLUGIN_DUMP_RESTORE', 'restore'); // Upload & restore
+global $_STORAGE;
+
+// DATA_DIR (wiki/*.txt)
+$_STORAGE['DATA_DIR']['add_filter'] = '^[0-9A-F]+\.txt';
+$_STORAGE['DATA_DIR']['extract_filter'] = '^' . preg_quote(DATA_DIR, '/') . '((?:[0-9A-F])+)(\.txt){0,1}';
+
+// UPLOAD_DIR (attach/*)
+$_STORAGE['UPLOAD_DIR']['add_filter'] = '^[0-9A-F_]+';
+$_STORAGE['UPLOAD_DIR']['extract_filter'] = '^' . preg_quote(UPLOAD_DIR, '/') . '((?:[0-9A-F]{2})+)_((?:[0-9A-F])+)';
+
+// BACKUP_DIR (backup/*.gz)
+$_STORAGE['BACKUP_DIR']['add_filter'] = '^[0-9A-F]+\.gz';
+$_STORAGE['BACKUP_DIR']['extract_filter'] = '^' . preg_quote(BACKUP_DIR, '/') . '((?:[0-9A-F])+)(\.gz){0,1}';
+
+
/////////////////////////////////////////////////
// ¥×¥é¥°¥¤¥óËÜÂÎ
function plugin_dump_action()
{
global $vars;
+ if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
+
$pass = isset($_POST['pass']) ? $_POST['pass'] : NULL;
$act = isset($vars['act']) ? $vars['act'] : NULL;
$body = '';
if ($pass !== NULL) {
- if (pkwk_login($pass) && ($act !== NULL) ) {
+ if (! pkwk_login($pass)) {
+ $body = "<p><strong>¥Ñ¥¹¥ï¡¼¥É¤¬°ã¤¤¤Þ¤¹¡£</strong></p>\n";
+ } else {
switch($act){
case PLUGIN_DUMP_DUMP:
$body = plugin_dump_download();
return array('msg' => $msg, 'body' => $body);
break;
}
- } else {
- $body = ($pass === NULL) ? '' : "<p><strong>¥Ñ¥¹¥ï¡¼¥É¤¬°ã¤¤¤Þ¤¹¡£</strong></p>\n";
}
}
} else {
$msg = 'dump';
}
+
return array('msg' => $msg, 'body' => $body);
}
// ¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É
function plugin_dump_download()
{
- global $vars;
+ global $vars, $_STORAGE;
// ¥¢¡¼¥«¥¤¥Ö¤Î¼ïÎà
$arc_kind = ($vars['pcmd'] == 'tar') ? 'tar' : 'tgz';
$bk_attach = isset($vars['bk_attach']) ? TRUE : FALSE;
$bk_backup = isset($vars['bk_backup']) ? TRUE : FALSE;
+ $filecount = 0;
$tar = new tarlib();
-
- // ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë
- if ($tar->create(CACHE_DIR, $arc_kind))
- {
- $filecount = 0; // ¥Õ¥¡¥¤¥ë¿ô
- if ($bk_wiki) $filecount .= $tar->add_dir(DATA_DIR, '^[0-9A-F]+\.txt', $namedecode);
- if ($bk_attach) $filecount .= $tar->add_dir(UPLOAD_DIR, '^[0-9A-F_]+', $namedecode);
- if ($bk_backup) $filecount .= $tar->add_dir(BACKUP_DIR, '^[0-9A-F]+\.gz', $namedecode);
- $tar->close();
-
- if ($filecount > 0) {
- // ¥À¥¦¥ó¥í¡¼¥É
- download_tarfile($tar->filename, $arc_kind);
- @unlink($tar->filename);
- exit; // Àµ¾ï½ªÎ»
- } else {
- @unlink($tar->filename);
- return '<p><strong>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</strong></p>';
- }
- }
- else
- {
+ $tar->create(CACHE_DIR, $arc_kind) or
die_message('¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£');
+
+ if ($bk_wiki) $filecount += $tar->add_dir(DATA_DIR, $_STORAGE['DATA_DIR']['add_filter'], $namedecode);
+ if ($bk_attach) $filecount += $tar->add_dir(UPLOAD_DIR, $_STORAGE['UPLOAD_DIR']['add_filter'], $namedecode);
+ if ($bk_backup) $filecount += $tar->add_dir(BACKUP_DIR, $_STORAGE['BACKUP_DIR']['add_filter'], $namedecode);
+
+ $tar->close();
+
+ if ($filecount === 0) {
+ @unlink($tar->filename);
+ return '<p><strong>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</strong></p>';
+ } else {
+ // ¥À¥¦¥ó¥í¡¼¥É
+ download_tarfile($tar->filename, $arc_kind);
+ @unlink($tar->filename);
+ exit; // Àµ¾ï½ªÎ»
}
}
// ¥Õ¥¡¥¤¥ë¤Î¥¢¥Ã¥×¥í¡¼¥É
function plugin_dump_upload()
{
- global $vars;
+ global $vars, $_STORAGE;
if (! PLUGIN_DUMP_ALLOW_RESTORE)
return array('code' => FALSE , 'msg' => 'Restoring function is not allowed');
- $code = FALSE;
- $msg = '';
-
$filename = $_FILES['upload_file']['name'];
- $matches = array();
+ $matches = array();
$arc_kind = FALSE;
if(! preg_match('/(\.tar|\.tar.gz|\.tgz)$/', $filename, $matches)){
- die_message("Invalid file suffix");
+ die_message('Invalid file suffix');
} else {
$matches[1] = strtolower($matches[1]);
switch ($matches[1]) {
case '.tar': $arc_kind = 'tar'; break;
case '.tgz': $arc_kind = 'tar'; break;
case '.tar.gz': $arc_kind = 'tgz'; break;
- default: die_message('Invalid file suffix: ' . $matches[1]);
- }
+ default: die_message('Invalid file suffix: ' . $matches[1]); }
}
if ($_FILES['upload_file']['size'] > PLUGIN_DUMP_MAX_FILESIZE * 1024)
die_message('Max file size exceeded: ' . PLUGIN_DUMP_MAX_FILESIZE . 'KB');
- // ¥¢¥Ã¥×¥í¡¼¥É¥Õ¥¡¥¤¥ë
- $uploadfile = tempnam(CACHE_DIR, 'upload' );
- if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile))
- {
- // tar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
- $tar = new tarlib();
- if ($tar->open($uploadfile, $arc_kind))
- {
- // DATA_DIR (wiki/*.txt)
- $quote_wiki = preg_quote(DATA_DIR, '/');
- $quote_wiki .= '((?:[0-9A-F])+)(\.txt){0,1}';
-
- // UPLOAD_DIR (attach/*)
- $quote_attach = preg_quote(UPLOAD_DIR,'/');
- $quote_attach .= '((?:[0-9A-F]{2})+)_((?:[0-9A-F])+)';
+ // Create a temporary tar file
+ $uploadfile = tempnam(CACHE_DIR, 'tarlib_uploaded_');
+ $tar = new tarlib();
+ if(! move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile) ||
+ ! $tar->open($uploadfile, $arc_kind)) {
+ @unlink($uploadfile);
+ die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
+ }
- $pattern = "((^$quote_wiki)|(^$quote_attach))";
-
- $files = $tar->extract($pattern);
- if (! empty($files)) {
- $msg = '<p><strong>Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë°ìÍ÷</strong><ul>';
- foreach($files as $name) {
- $msg .= "<li>$name</li>\n";
- }
- $msg .= '</ul></p>';
- $code = TRUE;
- } else {
- $msg = '<p>Ÿ³«¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>';
- $code = FALSE;
- }
- $tar->close();
- }
- else
- {
- $msg = '<p>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>';
- $code = FALSE;
- }
+ $pattern = "(({$_STORAGE['DATA_DIR']['extract_filter']})|" .
+ "({$_STORAGE['UPLOAD_DIR']['extract_filter']})|" .
+ "({$_STORAGE['BACKUP_DIR']['extract_filter']}))";
+ $files = $tar->extract($pattern);
+ if (empty($files)) {
@unlink($uploadfile);
+ return array('code' => FALSE, 'msg' => '<p>Ÿ³«¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>');
}
- else
- {
- die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
+
+ $msg = '<p><strong>Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë°ìÍ÷</strong><ul>';
+ foreach($files as $name) {
+ $msg .= "<li>$name</li>\n";
}
+ $msg .= '</ul></p>';
- return array('code' => $code , 'msg' => $msg);
+ $tar->close();
+ @unlink($uploadfile);
+
+ return array('code' => TRUE, 'msg' => $msg);
}
/////////////////////////////////////////////////
$filename .= '.tar';
}
+ pkwk_common_headers();
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . $size);
header('Content-Type: application/octet-stream');
// GNU³ÈÄ¥»ÅÍÍ(¥í¥ó¥°¥Õ¥¡¥¤¥ë̾Âбþ)
define('TARLIB_DATA_LONGLINK', '././@LongLink');
+
+// Type flag
define('TARLIB_HDR_FILE', '0');
define('TARLIB_HDR_LINK', 'L');
+// Kind of the archive
define('TARLIB_KIND_TGZ', 0);
-define('TARLIB_KIND_TAR', 1);
+define('TARLIB_KIND_TAR', 1);
class tarlib
{
////////////////////////////////////////////////////////////
function create($tempdir, $kind = 'tgz')
{
- $tempnam = tempnam($tempdir, 'tarlib_');
+ $tempnam = tempnam($tempdir, 'tarlib_create_');
if ($tempnam === FALSE) return FALSE;
if ($kind == 'tgz') {
$this->arc_kind = TARLIB_KIND_TGZ;
- $this->fp = gzopen($tempnam, 'wb');
+ $this->fp = gzopen($tempnam, 'wb');
} else {
$this->arc_kind = TARLIB_KIND_TAR;
- $this->fp = @fopen($tempnam, 'wb');
+ $this->fp = @fopen($tempnam, 'wb');
}
- if ($this->fp === FALSE) return FALSE;
- $this->filename = $tempnam;
- $this->dummydata = join('', array_fill(0, TARLIB_BLK_LEN, "\0"));
- $this->status = TARLIB_STATUS_CREATE;
-
- rewind($this->fp);
-
- return TRUE;
+ if ($this->fp === FALSE) {
+ @unlink($tempnam);
+ return FALSE;
+ } else {
+ $this->filename = $tempnam;
+ $this->dummydata = join('', array_fill(0, TARLIB_BLK_LEN, "\0"));
+ $this->status = TARLIB_STATUS_CREATE;
+ rewind($this->fp);
+ return TRUE;
+ }
}
////////////////////////////////////////////////////////////
unset($files);
// »ØÄꤵ¤ì¤¿¥Ñ¥¹¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë
- $dp = @opendir($dir) or
+ $dp = @opendir($dir);
+ if($dp === FALSE) {
+ @unlink($this->filename);
die_message($dir . ' is not found or not readable.');
+ }
+
while ($filename = readdir($dp)) {
if (preg_match("/$mask/", $filename))
$files[] = $dir . $filename;
$matches = array();
foreach($files as $name)
{
- // Tar¤Ë³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë̾
- if ($decode == TRUE)
- {
- // ¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ë½èÍý
+ // Tar¤Ë³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë̾¤òdecode
+ if ($decode === FALSE) {
+ $filename = $name;
+ } else {
$dirname = dirname(trim($name)) . '/';
$filename = basename(trim($name));
- if (preg_match("/^((?:[0-9A-F]{2})+)_((?:[0-9A-F]{2})+)/", $filename, $matches))
- {
+ if (preg_match("/^((?:[0-9A-F]{2})+)_((?:[0-9A-F]{2})+)/", $filename, $matches)) {
// attach¥Õ¥¡¥¤¥ë̾
- $filename = decode($matches[1]).'/'.decode($matches[2]);
- }
- else
- {
+ $filename = decode($matches[1]) . '/' . decode($matches[2]);
+ } else {
$pattern = '^((?:[0-9A-F]{2})+)((\.txt|\.gz)*)$';
if (preg_match("/$pattern/", $filename, $matches)) {
- $filename = decode($matches[1]).$matches[2];
+ $filename = decode($matches[1]) . $matches[2];
// ´í¤Ê¤¤¥³¡¼¥É¤ÏÃÖ´¹¤·¤Æ¤ª¤¯
$filename = str_replace(':', '_', $filename);
}
}
$filename = $dirname . $filename;
- if (function_exists('mb_convert_encoding')) {
- // ¥Õ¥¡¥¤¥ë̾¤Îʸ»ú¥³¡¼¥É¤òÊÑ´¹
+ // ¥Õ¥¡¥¤¥ë̾¤Îʸ»ú¥³¡¼¥É¤òÊÑ´¹
+ if (function_exists('mb_convert_encoding'))
$filename = mb_convert_encoding($filename, PLUGIN_DUMP_FILENAME_ENCORDING);
- }
- }
- else
- {
- $filename = $name;
}
// ºÇ½ª¹¹¿·»þ¹ï
// ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¼èÆÀ
$size = filesize($name);
if ($size == FALSE) {
+ @unlink($this->filename);
die_message($name . ' is not found or not readable.');
- continue; // ¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤
}
// ¥Ø¥Ã¥ÀÀ¸À®
// ¥Õ¥¡¥¤¥ë¥Ç¡¼¥¿¤Î¼èÆÀ
$fpr = @fopen($name , 'rb');
+ flock($fpr, LOCK_SH);
$data = fread($fpr, $size);
+ flock($fpr, LOCK_UN);
fclose( $fpr );
// ¥Õ¥¡¥¤¥ë½ÐÎÏ
$tar_data = array_fill(0, TARLIB_HDR_LEN, "\0");
// ¥Õ¥¡¥¤¥ë̾¤òÊݸ
- for($i = 0; $i < strlen($filename); $i++ )
- {
+ for($i = 0; $i < strlen($filename); $i++ ) {
if ($i < TARLIB_HDR_NAME_LEN) {
$tar_data[$i + TARLIB_HDR_NAME_OFFSET] = $filename{$i};
} else {
for($i = 0; $i < strlen($strchksum); $i++ ) {
$tar_data[$i + TARLIB_HDR_CHKSUM_OFFSET] = $strchksum{$i};
}
+
return $tar_data;
}
gzwrite($this->fp, $body, $size); // Body
gzwrite($this->fp, $this->dummydata, $fixsize); // Padding
} else {
- flock($this->fp, LOCK_EX);
fwrite($this->fp, $header, TARLIB_HDR_LEN); // Header
fwrite($this->fp, $body, $size); // Body
fwrite($this->fp, $this->dummydata, $fixsize); // Padding
- flock($this->fp, LOCK_UN);
}
}
// ÊÖ¤êÃÍ: Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë̾¤Î°ìÍ÷
// Êä : ARAI¤µ¤ó¤Îattach¥×¥é¥°¥¤¥ó¥Ñ¥Ã¥Á¤ò»²¹Í¤Ë¤·¤Þ¤·¤¿
////////////////////////////////////////////////////////////
- function extract($pattern )
+ function extract($pattern)
{
if ($this->status != TARLIB_STATUS_OPEN) return ''; // Not opened
if (strlen($buff) != TARLIB_HDR_LEN) break;
// ¥Õ¥¡¥¤¥ë̾
+ $name = '';
if ($longname != '') {
$name = $longname; // LongLinkÂбþ
$longname = '';
} else {
- $name = '';
for ($i = 0; $i < TARLIB_HDR_NAME_LEN; $i++ ) {
if ($buff{$i + TARLIB_HDR_NAME_OFFSET} != "\0") {
$name .= $buff{$i + TARLIB_HDR_NAME_OFFSET};
}
}
}
-
$name = trim($name);
+
if ($name == '') break; // Ÿ³«½ªÎ»
// ¥Á¥§¥Ã¥¯¥µ¥à¤ò¼èÆÀ¤·¤Ä¤Ä¡¢¥Ö¥é¥ó¥¯¤ËÃÖ´¹¤·¤Æ¤¤¤¯
// ¥¿¥¤¥×¥Õ¥é¥°
// $type = $buff{TARLIB_HDR_TYPE_OFFSET};
- if ($name == TARLIB_DATA_LONGLINK)
- {
+ if ($name == TARLIB_DATA_LONGLINK) {
// LongLink
- $buff = fread( $this->fp, $pdsz );
+ $buff = fread($this->fp, $pdsz);
$longname = substr($buff, 0, $size);
- }
- else
- if (preg_match("/$pattern/", $name) )
-// if ($type == 0 && preg_match("/$pattern/", $name) )
- {
+ } else if (preg_match("/$pattern/", $name) ) {
+// } else if ($type == 0 && preg_match("/$pattern/", $name) ) {
$buff = fread($this->fp, $pdsz);
// ´û¤ËƱ¤¸¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¾å½ñ¤¤µ¤ì¤ë
fclose($fpw);
$files[] = $name;
}
- }
- else
- {
+ } else {
// ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë
@fseek($this->fp, $pdsz, SEEK_CUR);
}
////////////////////////////////////////////////////////////
function close()
{
- if ($this->status == TARLIB_STATUS_CREATE)
- {
+ if ($this->status == TARLIB_STATUS_CREATE) {
// ¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
if ($this->arc_kind == TARLIB_KIND_TGZ) {
// ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ
fwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN);
fclose($this->fp);
}
- }
- else if ($this->status == TARLIB_STATUS_OPEN)
- {
+ } else if ($this->status == TARLIB_STATUS_OPEN) {
if ($this->arc_kind == TARLIB_KIND_TGZ) {
gzclose($this->fp);
} else {