예제 #1
0
파일: dump.inc.php 프로젝트: big2men/qhm
function plugin_dump_upload()
{
    global $vars, $_STORAGE, $script;
    $qm = get_qm();
    if (!PLUGIN_DUMP_ALLOW_RESTORE) {
        return array('code' => FALSE, 'msg' => $qm->m['plg_dump']['err_prohibit_restore']);
    }
    $filename = $_FILES['upload_file']['name'];
    $matches = array();
    $arc_kind = FALSE;
    if (!preg_match('/\\.zip$/', $filename, $matches)) {
        die_message($qm->m['plg_dump']['err_invalid_filetype']);
    }
    if ($_FILES['upload_file']['size'] > PLUGIN_DUMP_MAX_FILESIZE * 1024) {
        die_message($qm->replace('plg_dump.err_size_over', PLUGIN_DUMP_MAX_FILESIZE));
    }
    //require unzip
    require_once LIB_DIR . 'unzip.lib.php';
    // Create a temporary tar file
    $uploadfile = tempnam(realpath(CACHEQHM_DIR), 'zip_uploaded_');
    if (!move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile)) {
        @unlink($uploadfile);
        die_message($qm->m['plg_dump']['err_upload_failed']);
    }
    $unzip = new SimpleUnzip($uploadfile);
    $files = array();
    $len = $unzip->Count();
    for ($i = 0; $i < $len; $i++) {
        $name = $unzip->GetName($i);
        $path = $unzip->GetPath($i);
        //path をディレクトリにする: ./ で始まる場合、それを除去
        $dir = basename($path);
        //swfu/d
        if ($dir == 'd') {
            $dir = strpos($path, 'swfu/d') !== FALSE ? 'swfu/d' : '';
        }
        if ($dir == 'data') {
            //swfu/data
            if (strpos($path, 'swfu/data') !== FALSE) {
                $dir = 'swfu/data';
            } else {
                if (strpos($path, 'fwd3/sys/data') !== FALSE) {
                    $dir = 'fwd3/sys/data';
                }
            }
        }
        if (strpos($path, './.') !== FALSE) {
            $path = str_replace('./.', '.', $path);
        }
        switch ($dir) {
            case 'wiki':
                $stokey = 'DATA_DIR';
                break;
            case 'attach':
                $stokey = 'UPLOAD_DIR';
                break;
            case 'backup':
                $stokey = 'BACKUP_DIR';
                break;
            case 'swfu/d':
                $stokey = 'SWFU_DIR';
                break;
            case 'swfu/data':
                $stokey = 'SWFUDATA_DIR';
                break;
            case 'fwd3/sys/data':
                $stokey = 'FWD3DATA_DIR';
                break;
            case 'cache':
                $stokey = 'CACHE_DIR';
                break;
            default:
                $stokey = 'HOME_DIR';
        }
        $filter = isset($_STORAGE[$stokey]['extract_filter']) ? $_STORAGE[$stokey]['extract_filter'] : '';
        if ($filter && preg_match("/{$filter}/", $name)) {
            $uzfile = $path . '/' . $name;
            $files[] = $uzfile;
            $data = $unzip->GetData($i);
            $dlen = strlen($data);
            if ($fp = fopen($uzfile, "wb")) {
                fwrite($fp, $data, $dlen);
                fclose($fp);
                chmod($uzfile, 0666);
            } else {
                echo '<error>', $qm->replace('plg_dump.err_open_archive', $name), '</error>';
            }
        }
    }
    if (empty($files)) {
        @unlink($uploadfile);
        return array('code' => FALSE, 'msg' => $qm->m['plg_dump']['err_upload_empty']);
    }
    $msg = '<p><strong>' . $qm->m['plg_dump']['restore_header'] . '</strong><ul>';
    foreach ($files as $name) {
        $msg .= "<li>{$name}</li>\n";
    }
    $msg .= '</ul></p>';
    $msg .= '
<p>
	<a href="' . h($script) . '?cmd=qhmsetting">設定一覧へ戻る</a>
</p>
';
    @unlink($uploadfile);
    return array('code' => TRUE, 'msg' => $msg);
}