<?php
-/////////////////////////////////////////////////
-// $Id: dump.inc.php,v 1.30 2004/10/07 12:56:48 henoheno Exp $
+// $Id: dump.inc.php,v 1.38 2007/05/12 09:17:14 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
{
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;
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');
- move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile) or
- die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
-
- // tar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
+ // Create a temporary tar file
+ $uploadfile = tempnam(realpath(CACHE_DIR), 'tarlib_uploaded_');
$tar = new tarlib();
- $tar->open($uploadfile, $arc_kind) or
+ if(! move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile) ||
+ ! $tar->open($uploadfile, $arc_kind)) {
+ @unlink($uploadfile);
die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
+ }
$pattern = "(({$_STORAGE['DATA_DIR']['extract_filter']})|" .
"({$_STORAGE['UPLOAD_DIR']['extract_filter']})|" .
"({$_STORAGE['BACKUP_DIR']['extract_filter']}))";
$files = $tar->extract($pattern);
- if (empty($files))
+ if (empty($files)) {
+ @unlink($uploadfile);
return array('code' => FALSE, 'msg' => '<p>Ÿ³«¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>');
+ }
$msg = '<p><strong>Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë°ìÍ÷</strong><ul>';
foreach($files as $name) {
$filename .= '.tar';
}
+ pkwk_common_headers();
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . $size);
header('Content-Type: application/octet-stream');
<p><strong>¥¢¡¼¥«¥¤¥Ö¤Î·Á¼°</strong>
<br />
- <input type="radio" name="pcmd" value="tgz" checked="checked" /> ¡Á.tar.gz ·Á¼°<br />
- <input type="radio" name="pcmd" value="tar" /> ¡Á.tar ·Á¼°
+ <input type="radio" name="pcmd" id="_p_dump_tgz" value="tgz" checked="checked" />
+ <label for="_p_dump_tgz"> ¡Á.tar.gz ·Á¼°</label><br />
+ <input type="radio" name="pcmd" id="_p_dump_tar" value="tar" />
+ <label for="_p_dump_tar">¡Á.tar ·Á¼°</label>
</p>
<p><strong>¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê</strong>
<br />
- <input type="checkbox" name="bk_wiki" checked="checked" /> wiki<br />
- <input type="checkbox" name="bk_attach" /> attach<br />
- <input type="checkbox" name="bk_backup" /> backup
+ <input type="checkbox" name="bk_wiki" id="_p_dump_d_wiki" checked="checked" />
+ <label for="_p_dump_d_wiki">wiki</label><br />
+ <input type="checkbox" name="bk_attach" id="_p_dump_d_attach" />
+ <label for="_p_dump_d_attach">attach</label><br />
+ <input type="checkbox" name="bk_backup" id="_p_dump_d_backup" />
+ <label for="_p_dump_d_backup">backup</label><br />
</p>
<p><strong>¥ª¥×¥·¥ç¥ó</strong>
<br />
- <input type="checkbox" name="namedecode" /> ¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ú¡¼¥¸Ì¾¤ò¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤĤ¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ç¥³¡¼¥É (¢¨¥ê¥¹¥È¥¢¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢°ìÉô¤Îʸ»ú¤Ï '_' ¤ËÃÖ´¹¤µ¤ì¤Þ¤¹)<br />
+ <input type="checkbox" name="namedecode" id="_p_dump_namedecode" />
+ <label for="_p_dump_namedecode">¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ú¡¼¥¸Ì¾¤ò¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤĤ¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ç¥³¡¼¥É
+ (¢¨¥ê¥¹¥È¥¢¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢°ìÉô¤Îʸ»ú¤Ï '_' ¤ËÃÖ´¹¤µ¤ì¤Þ¤¹)</label><br />
</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
+<p><label for="_p_dump_adminpass_dump"><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong></label>
+ <input type="password" name="pass" id="_p_dump_adminpass_dump" size="12" />
<input type="submit" name="ok" value="OK" />
</p>
</div>
<p><span class="small">
¥¢¥Ã¥×¥í¡¼¥É²Äǽ¤ÊºÇÂç¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤Ï¡¢$maxsize KByte ¤Þ¤Ç¤Ç¤¹¡£<br />
</span>
- ¥Õ¥¡¥¤¥ë: <input type="file" name="upload_file" size="40" />
+ <label for="_p_dump_upload_file">¥Õ¥¡¥¤¥ë:</label>
+ <input type="file" name="upload_file" id="_p_dump_upload_file" size="40" />
</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
+<p><label for="_p_dump_adminpass_restore"><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong></label>
+ <input type="password" name="pass" id="_p_dump_adminpass_restore" size="12" />
<input type="submit" name="ok" value="OK" />
</p>
</div>
////////////////////////////////////////////////////////////
function create($tempdir, $kind = 'tgz')
{
- $tempnam = tempnam($tempdir, 'tarlib_');
+ $tempnam = tempnam(realpath($tempdir), 'tarlib_create_');
if ($tempnam === FALSE) return FALSE;
if ($kind == 'tgz') {
$this->arc_kind = TARLIB_KIND_TAR;
$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;
}
closedir($dp);
- sort($files);
+ sort($files, SORT_STRING);
$matches = array();
foreach($files as $name)
// ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¼èÆÀ
$size = filesize($name);
- if ($size == FALSE) {
+ if ($size === FALSE) {
+ @unlink($this->filename);
die_message($name . ' is not found or not readable.');
- continue; // ¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤
}
// ¥Ø¥Ã¥ÀÀ¸À®
$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 {
// ¥¿¥¤¥×¥Õ¥é¥°
// $type = $buff{TARLIB_HDR_TYPE_OFFSET};
- if ($name == TARLIB_DATA_LONGLINK)
- {
+ if ($name == TARLIB_DATA_LONGLINK) {
// LongLink
$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 {