OSDN Git Service

BugTrack2/235: Clear the sort_flag
[pukiwiki/pukiwiki.git] / plugin / dump.inc.php
index 88060b4..c8a54f7 100644 (file)
@@ -1,23 +1,9 @@
 <?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
 
@@ -58,6 +44,8 @@ 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;
 
@@ -163,22 +151,23 @@ function plugin_dump_upload()
        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) {
@@ -205,6 +194,7 @@ function download_tarfile($tempnam, $arc_kind)
                $filename .= '.tar';
        }
 
+       pkwk_common_headers();
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Content-Length: ' . $size);
        header('Content-Type: application/octet-stream');
@@ -234,21 +224,28 @@ function plugin_dump_disp_form()
 
 <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>
@@ -267,10 +264,11 @@ EOD;
 <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>
@@ -343,7 +341,7 @@ class tarlib
        ////////////////////////////////////////////////////////////
        function create($tempdir, $kind = 'tgz')
        {
-               $tempnam = tempnam($tempdir, 'tarlib_');
+               $tempnam = tempnam(realpath($tempdir), 'tarlib_create_');
                if ($tempnam === FALSE) return FALSE;
 
                if ($kind == 'tgz') {
@@ -353,15 +351,17 @@ class tarlib
                        $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;
+               }
        }
 
        ////////////////////////////////////////////////////////////
@@ -381,15 +381,19 @@ class tarlib
                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)
@@ -434,9 +438,9 @@ class tarlib
 
                        // ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¼èÆÀ
                        $size = filesize($name);
-                       if ($size == FALSE) {
+                       if ($size === FALSE) {
+                               @unlink($this->filename);
                                die_message($name . ' is not found or not readable.');
-                               continue;       // ¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤
                        }
 
                        // ¥Ø¥Ã¥ÀÀ¸À®
@@ -469,8 +473,7 @@ class tarlib
                $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 {
@@ -647,16 +650,12 @@ class tarlib
                        // ¥¿¥¤¥×¥Õ¥é¥°
 //                      $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);
 
                                // ´û¤ËƱ¤¸¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¾å½ñ¤­¤µ¤ì¤ë
@@ -671,9 +670,7 @@ class tarlib
                                        fclose($fpw);
                                        $files[] = $name;
                                }
-                       }
-                       else
-                       {
+                       } else {
                                // ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë
                                @fseek($this->fp, $pdsz, SEEK_CUR);
                        }
@@ -688,8 +685,7 @@ class tarlib
        ////////////////////////////////////////////////////////////
        function close()
        {
-               if ($this->status == TARLIB_STATUS_CREATE)
-               {
+               if ($this->status == TARLIB_STATUS_CREATE) {
                        // ¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
                        if ($this->arc_kind == TARLIB_KIND_TGZ) {
                                // ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ
@@ -702,9 +698,7 @@ class tarlib
                                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 {