/** * Creates a .zip file of the theme in themes/ directory * * @access public * @param string $theme Name of the theme * @param string $srcDir Source directory * @param string $destDir Target directory * @param bool $copy_example_to_repository If copy example.png too or not * @return bool Returns true if: * - Theme exists * - Theme exists and could be packed * Returns false if: * - Theme doesn't exist * - Theme doesn't exists and couldn't be packed */ function packTheme($theme, $srcDir, $destDir, $copy_example_to_repository = true) { $themeSrc = $srcDir . '/' . $theme; if (!is_dir($themeSrc)) { return new Jaws_Error(_t('TMS_ERROR_THEME_DOES_NOT_EXISTS', $theme)); } if (!Jaws_Utils::is_writable($destDir)) { return new Jaws_Error(_t('GLOBAL_ERROR_FAILED_DIRECTORY_UNWRITABLE', $destDir), $this->gadget->name); } $themeDest = $destDir . '/' . $theme . '.zip'; //If file exists.. delete it if (file_exists($themeDest)) { @unlink($themeDest); } require_once PEAR_PATH . 'File/Archive.php'; $reader = File_Archive::read($themeSrc, $theme); $innerWriter = File_Archive::toFiles(); $writer = File_Archive::toArchive($themeDest, $innerWriter); $res = File_Archive::extract($reader, $writer); if (PEAR::isError($res)) { return new Jaws_Error(_t('TMS_ERROR_COULD_NOT_PACK_THEME')); } Jaws_Utils::chmod($themeDest); if ($copy_example_to_repository) { //Copy image to repository/images if (file_exists($srcDir . '/example.png')) { @copy($srcDir . '/example.png', JAWS_DATA . "themes/repository/Resources/images/{$theme}.png"); Jaws_Utils::chmod(JAWS_DATA . 'themes/repository/Resources/images/' . $theme . '.png'); } } return $themeDest; }
/** * Returns downloadable backup file * * @access public * @return void */ function Backup() { $this->gadget->CheckPermission('Backup'); $tmpDir = sys_get_temp_dir(); $domain = preg_replace("/^(www.)|(:{$_SERVER['SERVER_PORT']})\$|[^a-z0-9\\-\\.]/", '', strtolower($_SERVER['HTTP_HOST'])); $nameArchive = $domain . '-' . date('Y-m-d') . '.tar.gz'; $pathArchive = $tmpDir . DIRECTORY_SEPARATOR . $nameArchive; //Dump database data $dbFileName = 'dbdump.xml'; $dbFilePath = $tmpDir . DIRECTORY_SEPARATOR . $dbFileName; Jaws_DB::getInstance()->Dump($dbFilePath); $files = array(); require_once PEAR_PATH . 'File/Archive.php'; $files[] = File_Archive::read(JAWS_DATA); $files[] = File_Archive::read($dbFilePath, $dbFileName); File_Archive::extract($files, File_Archive::toArchive($pathArchive, File_Archive::toFiles())); Jaws_Utils::Delete($dbFilePath); // browser must download file from server instead of cache header("Expires: 0"); header("Pragma: public"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); // force download dialog header("Content-Type: application/force-download"); // set data type, size and filename header("Content-Disposition: attachment; filename=\"{$nameArchive}\""); header("Content-Transfer-Encoding: binary"); header('Content-Length: ' . @filesize($pathArchive)); @readfile($pathArchive); Jaws_Utils::Delete($pathArchive); }
function saveChanges() { global $CONFIG; $_REQUEST->setType('uncompress', 'any'); if (isset($_FILES['uFiles']) && $this->may($USER, EDIT)) { $u = false; $ue = false; $extensions = $CONFIG->Files->filter; foreach ($_FILES['uFiles']['error'] as $i => $e) { $parts = explode('.', $_FILES['uFiles']['name'][$i]); $extension = array_pop($parts); if ($e == UPLOAD_ERR_NO_FILE) { continue; } $newPath = $this->that->path . '/' . $_FILES['uFiles']['name'][$i]; if ($e == UPLOAD_ERR_OK) { if ($_REQUEST['uncompress'] && in_array(strtolower(strrchr($_FILES['uFiles']['name'][$i], '.')), array('.tar', '.gz', '.tgz', '.bz2', '.tbz', '.zip', '.ar', '.deb'))) { $tmpfile = $_FILES['uFiles']['tmp_name'][$i] . $_FILES['uFiles']['name'][$i]; rename($_FILES['uFiles']['tmp_name'][$i], $tmpfile); $u = true; require_once "File/Archive.php"; error_reporting(E_ALL); $curdir = getcwd(); chdir($this->path); //FIXME: FIXME! if (@File_Archive::extract(File_Archive::filter(File_Archive::predExtension($extensions), File_Archive::read($tmpfile . '/*')), File_Archive::toFiles()) == null) { $ue = true; } else { Flash::queue(__('Extraction failed')); } chdir($curdir); } elseif (!in_array(strtolower($extension), $extensions)) { Flash::queue(__('Invalid format:') . ' ' . $_FILES['uFiles']['name'][$i], 'warning'); continue; } else { $u = (bool) @move_uploaded_file($_FILES['uFiles']['tmp_name'][$i], $newPath); } } if (!$u) { Flash::queue(__('Upload of file') . ' "' . $_FILES['uFiles']['name'][$i] . '" ' . __('failed') . ' (' . ($e ? $e : __('Check permissions')) . ')', 'warning'); } } if ($u) { $this->loadStructure(true); Flash::queue(__('Your file(s) were uploaded')); return true; } if ($ue) { $this->loadStructure(true); Flash::queue(__('Your file(s) were uploaded and extracted')); return true; } return false; } }
/** * validate実行 * * @param mixed $attributes チェックする値 * @param string $errStr エラー文字列 * @param array $params オプション引数 * @return string エラー文字列(エラーの場合) * @access public */ function validate($attributes, $errStr, $params) { $this->_cabinet = $attributes["cabinet"]; $file = $attributes["file"]; $container =& DIContainerFactory::getContainer(); $commonMain =& $container->getComponent("commonMain"); $this->_fileAction =& $commonMain->registerClass(WEBAPP_DIR . '/components/file/Action.class.php', "File_Action", "fileAction"); $this->_fileView =& $commonMain->registerClass(WEBAPP_DIR . '/components/file/View.class.php', "File_View", "fileView"); $this->_uploadsView =& $container->getComponent("uploadsView"); $file_path = "cabinet/" . strtolower(session_id()) . timezone_date(); if (file_exists(FILEUPLOADS_DIR . $file_path)) { $result = $this->_fileAction->delDir(FILEUPLOADS_DIR . $file_path); if ($result === false) { return $errStr; } } mkdir(FILEUPLOADS_DIR . $file_path, octdec(_UPLOAD_FOLDER_MODE)); $request =& $container->getComponent("Request"); $request->setParameter("file_path", $file_path); $result = $this->_uploadsView->getUploadById($file["upload_id"]); if ($result === false) { return $errStr; } $upload = $result[0]; File_Archive::extract(File_Archive::read(FILEUPLOADS_DIR . $upload["file_path"] . $upload["physical_file_name"] . "/"), $dest = FILEUPLOADS_DIR . $file_path); $configView =& $container->getComponent("configView"); $config = $configView->getConfigByConfname(_SYS_CONF_MODID, "allow_extension"); if (!isset($config["conf_value"])) { return $errStr; } $this->_allow_extension = $config["conf_value"]; $cabinetView =& $container->getComponent("cabinetView"); $used_size = $cabinetView->getUsedSize(); if ($used_size === false) { return $errStr; } $total_size = $used_size; $result = $this->_check(FILEUPLOADS_DIR . $file_path, $total_size); if ($result !== true) { $this->_fileAction->delDir(FILEUPLOADS_DIR . $file_path); return $result; } $decompress_size = $this->_fileView->getSize(FILEUPLOADS_DIR . $file_path); if ($this->_cabinet["cabinet_max_size"] != 0 && $this->_cabinet["cabinet_max_size"] < $used_size + $decompress_size) { $this->_fileAction->delDir(FILEUPLOADS_DIR . $file_path); $suffix_compresssize = $this->_fileView->formatSize($used_size + $decompress_size); $suffix_maxsize = $this->_fileView->formatSize($this->_cabinet["cabinet_max_size"]); return sprintf(CABINET_ERROR_DECOMPRESS_MAX_SIZE, $suffix_compresssize, $suffix_maxsize); } $result = $cabinetView->checkCapacitySize($decompress_size); if ($result !== true) { $this->_fileAction->delDir(FILEUPLOADS_DIR . $file_path); return $result; } }
/** * Check if input (an array of $_FILES) are .tar or .zip files, if they * are then these get unpacked and returns an managed as $_FILES (returning * an array with the same structure $_FILES uses and move pics to /tmp) * * @access public * @param array $files $_FILES * @return array $_FILES format */ function UnpackFiles($files) { if (!is_array($files)) { return array(); } $cleanFiles = array(); $tmpDir = sys_get_temp_dir(); $counter = 1; require_once PEAR_PATH . 'File/Archive.php'; foreach ($files as $key => $file) { if (empty($file['tmp_name'])) { continue; } $ext = strrchr($file['name'], '.'); switch ($ext) { case '.gz': $ext = '.tgz'; break; case '.bz2': case '.bzip2': $ext = '.tbz'; break; } $ext = strtolower(ltrim($ext, '.')); if (File_Archive::isKnownExtension($ext)) { $tmpArchiveName = $tmpDir . DIRECTORY_SEPARATOR . $file['name']; if (!move_uploaded_file($file['tmp_name'], $tmpArchiveName)) { continue; } $reader = File_Archive::read($tmpArchiveName); $source = File_Archive::readArchive($ext, $reader); if (!PEAR::isError($source)) { while ($source->next()) { $destFile = $tmpDir . DIRECTORY_SEPARATOR . basename($source->getFilename()); $sourceFile = $tmpArchiveName . '/' . $source->getFilename(); $extract = File_Archive::extract($sourceFile, $tmpDir); if (PEAR::IsError($extract)) { continue; } $cleanFiles['photo' . $counter] = array('name' => basename($source->getFilename()), 'type' => $source->getMime(), 'tmp_name' => $destFile, 'size' => @filesize($destFile), 'error' => 0); $counter++; } } } else { $cleanFiles['photo' . $counter] = $file; $counter++; } } return $cleanFiles; }
/** * Export language * * @access public * @return void */ function Export() { $lang = jaws()->request->fetch('lang', 'get'); require_once PEAR_PATH . 'File/Archive.php'; $tmpDir = sys_get_temp_dir(); $tmpFileName = "{$lang}.tar"; $tmpArchiveName = $tmpDir . DIRECTORY_SEPARATOR . $tmpFileName; $writerObj = File_Archive::toFiles(); $src = File_Archive::read(JAWS_DATA . "languages/{$lang}", $lang); $dst = File_Archive::toArchive($tmpArchiveName, $writerObj); $res = File_Archive::extract($src, $dst); if (!PEAR::isError($res)) { return Jaws_Utils::Download($tmpArchiveName, $tmpFileName); } Jaws_Header::Referrer(); }
/** * _unzipFile * * @return bool **/ public function _unzipFile() { // local file name $downloadDirPath = realpath($this->Xupdate->params['temp_path']); $downloadFilePath = $this->Xupdate->params['temp_path'] . '/' . $this->target_key . '.zip'; $exploredDirPath = realpath($downloadDirPath . '/' . $this->target_key); if (empty($downloadFilePath)) { $this->_set_error_log('getDownloadFilePath not found error in: ' . $this->_getDownloadFilePath()); return false; } if (!chdir($exploredDirPath)) { $this->_set_error_log('chdir error in: ' . $exploredDirPath); return false; //chdir error } File_Archive::extract(File_Archive::read($downloadFilePath . '/'), File_Archive::appender($exploredDirPath)); return true; }
function _decompression($name, &$fileUpload) { $container =& DIContainerFactory::getContainer(); $actionChain =& $container->getComponent("ActionChain"); $session =& $container->getComponent("Session"); $file_extra =& $container->getComponent("File"); $commonMain =& $container->getComponent("commonMain"); $fileAction =& $commonMain->registerClass(WEBAPP_DIR . '/components/file/Action.class.php', "File_Action", "fileAction"); $action_name = $actionChain->getCurActionName(); $pathList = explode("_", $action_name); $cur_sess_id = $session->getID(); require_once "File/Archive.php"; // // テンポラリーディレクトリ作成 // if (!file_exists(FILEUPLOADS_DIR . $pathList[0])) { mkdir(FILEUPLOADS_DIR . $pathList[0], octdec(_UPLOAD_FOLDER_MODE)); } $file_path = $pathList[0] . "/" . strtolower($cur_sess_id); if (file_exists(FILEUPLOADS_DIR . $file_path)) { $result = $fileAction->delDir(FILEUPLOADS_DIR . $file_path); if ($result === false) { return false; } } mkdir(FILEUPLOADS_DIR . $file_path, octdec(_UPLOAD_FOLDER_MODE)); // // 圧縮ファイル取得 // $files = $file_extra->getParameterRef($name); $file_name = FILEUPLOADS_DIR . $file_path . "/" . $files['name']; // // TODO:cabinetの場合、圧縮ファイルをFileクラスに登録したものを解凍しないといけないため // $fileUpload->moveで移動してしまうとエラーとなる。 // $fileUpload->move(0, $file_name); // // 圧縮ファイル解凍 // File_Archive::extract(File_Archive::read($file_name . "/"), $dest = FILEUPLOADS_DIR . $file_path); // // 圧縮ファイル削除 // $fileAction->delDir($file_name); // // 解凍したファイルをアップロードファイルとしてセット // $commonMain =& $container->getComponent("commonMain"); $uploadsAction =& $commonMain->registerClass(WEBAPP_DIR . '/components/uploads/Action.class.php', "Uploads_Action", "uploadsAction"); $uploadsAction->setFileByPath(FILEUPLOADS_DIR . $file_path, $name); }
function _testReadArchive() { $source = File_Archive::readArchive('tar', File_Archive::read('up.tar')); while ($source->next()) { echo $source->getFilename() . "\n"; } }
/** * バックアップXMLファイル->リストア配列変換処理 * * @access public */ function getRestoreArray($upload_id, $backup_page_id, $module_id, $temporary_file_path) { set_time_limit(BACKUP_TIME_LIMIT); // メモリ最大サイズ設定 ini_set('memory_limit', -1); $errorList =& $this->_actionChain->getCurErrorList(); //if($backup_page_id == 0 || $upload_id == 0) { // // フルバックアップをリストアしようとしている // $errorList->add("backup", BACKUP_FAILURE_RESTORE); // return false; //} //$uploads = $this->_db->selectExecute("uploads", array("upload_id" => $upload_id, "room_id" => $backup_page_id, "module_id" => $module_id)); $uploads = $this->_db->selectExecute("uploads", array("upload_id" => $upload_id, "module_id" => $module_id)); if ($uploads === false || !isset($uploads[0]) || count($uploads) > 1) { return false; } $uploads_file_path = FILEUPLOADS_DIR . "backup/" . $uploads[0]['physical_file_name']; if (!file_exists($uploads_file_path)) { // バックアップファイルなし $errorList->add("backup", BACKUP_NONE_RESTORE); return false; } if (file_exists($temporary_file_path)) { // 現在、同じバックアップファイル-リストア中 // エラーとする $errorList->add("backup", BACKUP_RESTORING); return false; } if (!mkdir($temporary_file_path, 0777)) { $errorList->add("backup", BACKUP_RESTORE_ERROR); return false; } // // 解凍 // File_Archive::extract(File_Archive::read($uploads_file_path . "/"), File_Archive::appender($temporary_file_path)); if (!file_exists($temporary_file_path . BACKUP_ROOM_XML_FILE_NAME)) { // XMLファイルなし $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_RESTORE); return false; } // PHP 4 > 4.3.0, PHP 5 $xml = file_get_contents($temporary_file_path . BACKUP_ROOM_XML_FILE_NAME); if ($xml === false) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_ERROR); return false; } if (!file_exists($temporary_file_path . BACKUP_ROOM_XML_INI_NAME)) { // XML INIファイルなし $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_RESTORE); return false; } $xml_ini = file_get_contents($temporary_file_path . BACKUP_ROOM_XML_INI_NAME); if ($xml_ini === false) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_ERROR); return false; } $unserializer =& new XML_Unserializer(); // // 複合化チェック // $result = $unserializer->unserialize($xml_ini); if ($result !== true) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_UNSERIALIZE); return false; } $data_ini = $unserializer->getUnserializedData(); // 共有設定されているかどうか if ($data_ini["host_field"] == BASE_URL . INDEX_FILE_NAME) { // 自サイトならば、無条件でOK $self_flag = true; } else { $self_flag = false; // サイトテーブルにあり、commons_flagが立っているものを許す $data_ini["host_field"] = preg_replace("/" . preg_quote(INDEX_FILE_NAME, "/") . "\$/i", "", $data_ini["host_field"]); $where_params = array("url" => $data_ini["host_field"], "commons_flag" => _ON); // 有効期限がいついつの公開鍵を取得 $other_site = $this->_db->selectExecute("sites", $where_params, null, 1); if ($other_site === false) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_ERROR); return false; } if (!isset($other_site[0])) { // 共有設定されていない $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_COMMONS_ERROR); return false; } } $get_public_url = $data_ini["host_field"] . INDEX_FILE_NAME . "?action=encryption_view_publickey" . "&encrypt_data=" . rawurlencode($data_ini['encrypt_text']) . "&expiration_time=" . $data_ini['expiration_time'] . "&_header=" . _OFF; $public_key_html = $this->_requestMain->getResponseHtml($get_public_url); if ($public_key_html === false) { // 公開鍵取得失敗 $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_PUBLIC_KEY_ERROR); return false; } if (is_string($public_key_html)) { $public_key_html = trim($public_key_html); $public_key = preg_replace("/^public_key=/i", "", $public_key_html); } if (isset($public_key) && $public_key_html == $public_key) { // 公開鍵取得失敗 $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_RESTORE_PUBLIC_KEY_ERROR); return false; } // 複合化 //$this->encryption =& $this->_container->getComponent("encryptionView"); $decrypt_text = $this->encryption->decrypt($data_ini['encrypt_text'], $public_key); $hash_text = sha1($xml); if ($decrypt_text != $hash_text) { // 不正なファイルの可能性あり $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_RESTORE); return false; } //$options = array ('parseAttributes' => true); 属性値を含める //$unserializer =& new XML_Unserializer($options); $result = $unserializer->unserialize($xml); if ($result !== true) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_UNSERIALIZE); return false; } $data = $unserializer->getUnserializedData(); //----------------------------------------------------------------------------------- // NetCommonsバージョンチェック // 上3桁目がいっしょならば、リストアを許す //----------------------------------------------------------------------------------- if (!isset($data["version"]) || !isset($data["version"]["_version"]) || !isset($data["_room_inf"])) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_FAILURE_RESTORE); return false; } $current_version = $data["version"]["_version"]; $current_version_arr = explode(".", $current_version); $now_version_arr = explode(".", _NC_VERSION); if (count($current_version_arr) != 4 || count($now_version_arr) != 4) { // バージョン情報が不正 $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_WRONG_VERSION); return false; } if ($now_version_arr[0] != $current_version_arr[0] || $now_version_arr[1] != $current_version_arr[1] || $now_version_arr[2] != $current_version_arr[2]) { // バージョン情報が一致しない $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", sprintf(BACKUP_DIFFER_VERSION, $current_version, _NC_VERSION)); return false; } //----------------------------------------------------------------------------------- // リストア対象ルーム情報取得-チェック // DB項目が変わることもありえるので、すべての項目はチェックしない // 「バックアップファイル追加」時にチェックすればいい //----------------------------------------------------------------------------------- if (!isset($data["_room_inf"]["row"]) || !isset($data["_room_inf"]["row"]["page_id"]) || !isset($data["_room_inf"]["row"]["room_id"]) || !isset($data["_room_inf"]["row"]["private_flag"]) || !isset($data["_room_inf"]["row"]["space_type"]) || !isset($data["_room_inf"]["row"]["site_id"]) || !isset($data["_room_inf"]["row"]["thread_num"]) || !isset($data["_room_inf"]["row"]["parent_id"]) || $data["_room_inf"]["row"]["room_id"] != $data["_room_inf"]["row"]["page_id"]) { $this->_fileAction->delDir($temporary_file_path); $errorList->add("backup", BACKUP_WRONG_ROOMINF); return false; } $room_inf = $data["_room_inf"]["row"]; if (!$self_flag) { $room_inf['site_id'] = $other_site[0]['site_id']; $room_inf['url'] = $data_ini["host_field"]; if ($room_inf['thread_num'] == 2) { $room_inf['parent_id'] = 0; } $room_inf['room_id'] = 0; } else { $room_inf['url'] = ''; } $room_inf['pre_page_name'] = $room_inf['page_name']; // スペースタイプがパブリックスペース or プライベートスペースならば上書き // それ以外ならば、追加登録 if ($room_inf['thread_num'] == 0 && ($room_inf['private_flag'] == _ON || $room_inf['space_type'] == _SPACE_TYPE_PUBLIC)) { // パブリックスペース or プライベートスペース // 参加者や、その他、親カラムの情報は基本的にリストアしない(選択させる?) $restore_type = "top"; } else { // グループルーム or サブグループ(新規ルームとしてリストア) if ($room_inf['thread_num'] == 2) { $restore_type = "subgroup"; } else { if ($room_inf['space_type'] == _SPACE_TYPE_PUBLIC) { $restore_type = "public_room"; } else { $restore_type = "group_room"; } } // 同名のルームが存在したら、リネームする $first_room_name = $room_inf['page_name']; $rename_count = 1; while (1) { $chk_pages =& $this->_pagesView->getPages(array("thread_num" => $room_inf['thread_num'], "space_type" => $room_inf['space_type'], "private_flag" => $room_inf['private_flag'], "page_id=room_id" => null, "page_name" => $room_inf['page_name'])); if ($chk_pages === false) { $this->_fileAction->delDir($temporary_file_path); return false; } if (isset($chk_pages[0])) { // 同名のルームあり $room_inf['page_name'] = sprintf(BACKUP_RESTORE_PREFIX_PAGE_NAME, $rename_count) . $first_room_name; $rename_count++; } else { break; } } } if (($restore_type == "public_room" || $restore_type == "top") && $room_inf['private_flag'] == _OFF) { // パブリックスペースであればサイト閉鎖中かどうかを取得(警告メッセージを表示するため) // サイト閉鎖中かどうか $closesite = $this->_configView->getConfigByConfname(_SYS_CONF_MODID, "closesite"); if ($closesite === false) { $this->_fileAction->delDir($temporary_file_path); return false; } $closesite = $closesite['conf_value']; } //----------------------------------------------------------------------------------- // 各モジュールバージョンチェック // 上3桁目がいっしょならば、リストアを許す // インストールされていないモジュールはリストアしない //----------------------------------------------------------------------------------- $modules = $this->_modulesView->getModules(array("system_flag" => _OFF), null, null, null, array($this, "_fetchcallbackModules"), $this->_modulesView); if ($modules === false) { $this->_fileAction->delDir($temporary_file_path); return false; } $adodb = $this->_db->getAdoDbObject(); foreach ($modules as $dirname => $module) { $buf_tablelist = $this->_databaseSqlutility->getTableList($dirname, false); if (is_array($buf_tablelist) && count($buf_tablelist) > 0) { foreach ($buf_tablelist as $table) { // テーブルリスト取得 $this->tablePrimarylist[$dirname][$table] = $adodb->MetaPrimaryKeys($this->_db->getPrefix() . $table); $this->tablelist[$table] = $dirname; } } unset($buf_tablelist); } $restore_modules = array(); $restore_modules["system"]['restore_type'] = $restore_type; $restore_modules["system"]['self_flag'] = $self_flag; foreach ($data["version"] as $module_name => $module_version) { //if($module_name == "_version") { // continue; //} if (preg_match("/^_/i", $module_name)) { // モジュール名称 continue; } $restore_modules[$module_name] = array(); $restore_modules[$module_name]['state'] = false; if (isset($modules[$module_name])) { $restore_modules[$module_name]['module_id'] = $modules[$module_name]['module_id']; $restore_modules[$module_name]['module_name'] = $modules[$module_name]['module_name']; $module_version_arr = explode(".", $module_version); $now_module_version_arr = explode(".", $modules[$module_name]['version']); if (count($current_version_arr) != 4 || count($now_version_arr) != 4) { // モジュールのバージョンの書き方が不正(リストア対象からはずす) $restore_modules[$module_name]['error_mes'] = BACKUP_WRONG_MODULE_VERSION; continue; } else { if ($now_module_version_arr[0] != $module_version_arr[0] || $now_module_version_arr[1] != $module_version_arr[1] || $now_module_version_arr[2] != $module_version_arr[2]) { // バージョン情報が一致しない $restore_modules[$module_name]['error_mes'] = BACKUP_DIFFER_MODULE_VERSION; continue; } } $this->restorelist[$module_name] = true; //$buf_tablelist = $this->_databaseSqlutility->getTableList($module_name, false); //if(is_array($buf_tablelist) && count($buf_tablelist) > 0) { // foreach($buf_tablelist as $table) { // // テーブルリスト取得 // $this->tablelist[$table] = $module_name; // } //} } else { // 未インストールモジュール if (isset($data["version"]["_" . $module_name])) { $restore_modules[$module_name]['module_name'] = $data["version"]["_" . $module_name]; } else { $restore_modules[$module_name]['module_name'] = $module_name; } $restore_modules[$module_name]['error_mes'] = BACKUP_UNINSTALL_MODULE; continue; } if ($modules[$module_name]['restore_action'] == "auto") { // // install.iniチェック // [Restore] // _transfer_id="bbs_id,post_id,topic_id,parent_id,room_id,block_id" // -> IDを振り替えるリスト($this->db->nextSeq($table_name)) // topic_id = post_id -> post_idを振り替えた値をtopic_idに入れるという意味(topic_idでnextSeqしない) // parent_id = post_id -> 上記と同様 // room_id = core.room_id -> coreのテーブルのroom_idがはいる // block_id = core.block_id -> coreのテーブルのblock_idがはいる $file_path = MODULE_DIR . "/" . $module_name . '/install.ini'; if (file_exists($file_path)) { if (version_compare(phpversion(), "5.0.0", ">=")) { $initializer =& DIContainerInitializerLocal::getInstance(); $install_ini = $initializer->read_ini_file($file_path, true); } else { $install_ini = parse_ini_file($file_path, true); } if (isset($install_ini['Restore']) && is_array($install_ini['Restore'])) { $restore_modules[$module_name]['transfer_list'] = $install_ini['Restore']; } else { // リストア対象外モジュール $restore_modules[$module_name]['error_mes'] = BACKUP_UNSUPPORTED_MODULE; } //if(isset($install_ini['CleanUp']) && is_array($install_ini['CleanUp'])) { // // uploadsテーブルのIDを振り替えるため、その振替元のカラムのupload_idの項目を更新しなければならない // // $install_ini['Restore']にそれを記述すると煩雑になるため、現状、CleanUpの項目を用いる // $restore_modules[$module_name]['transfer_uploads'] = $install_ini['CleanUp']; //} } } else { if ($modules[$module_name]['restore_action'] == "") { // リストア対象外モジュール $restore_modules[$module_name]['error_mes'] = BACKUP_UNSUPPORTED_MODULE; } else { // リストアアクションを呼ぶのみ $restore_modules[$module_name]['transfer_list'] = $modules[$module_name]['restore_action']; } } $restore_modules[$module_name]['state'] = true; } // room毎に分割 $this->data =& $data; //$this->_fileAction->delDir($temporary_file_path); return array($room_inf, $restore_modules, $data["version"], $modules); }
/** * Remove duplicates from a source, keeping the most recent one (or the one that has highest pos in * the archive if the files have same date or no date specified) * * @param File_Archive_Reader a reader that may contain duplicates */ function removeDuplicatesFromSource(&$toConvert, $URL = null) { $source =& File_Archive::_convertToReader($toConvert); if (PEAR::isError($source)) { return $source; } if ($URL !== null && substr($URL, -1) != '/') { $URL .= '/'; } if ($source === null) { $source = File_Archive::read($URL); } require_once dirname(__FILE__) . "/Archive/Predicate/Duplicate.php"; $pred = new File_Archive_Predicate_Duplicate($source); $source->close(); return File_Archive::removeFromSource($pred, $source, null); }
/** * Zip & TarGzip Functions */ function archive_items($dir) { if (($GLOBALS["permissions"] & 01) != 01) { show_error($GLOBALS["error_msg"]["accessfunc"]); } if (!$GLOBALS["zip"] && !$GLOBALS["tgz"]) { show_error($GLOBALS["error_msg"]["miscnofunc"]); } $allowed_types = array('zip', 'tgz', 'tbz', 'tar'); $actionURL = str_replace("index2.php", "index3.php", make_link("arch", $dir, NULL)); // If we have something to archive, let's do it now if (isset($GLOBALS['__POST']["name"])) { $saveToDir = $GLOBALS['__POST']['saveToDir']; if (!file_exists(get_abs_dir($saveToDir))) { echo nx_scriptTag('', '$(\'loadingindicator\').style.display=\'none\';'); echo nx_alertBox('The Save-To Directory you have specified does not exist.'); die('The Save-To Directory you have specified does not exist.'); } if (!is_writable(get_abs_dir($saveToDir))) { echo nx_scriptTag('', '$(\'loadingindicator\').style.display=\'none\';'); echo nx_alertBox('Please specify a writable directory to save the archive to.'); die('Please specify a writable directory to save the archive to.'); } require_once _QUIXPLORER_PATH . '/libraries/Archive.php'; if (!in_array(strtolower($GLOBALS['__POST']["type"]), $allowed_types)) { echo 'Unknown Archive Format: ' . htmlspecialchars($GLOBALS['__POST']["type"]); nx_exit(); } while (@ob_end_clean()) { } header('Status: 200 OK'); echo '<?xml version="1.0" ?>' . "\n"; $files_per_step = 2500; $cnt = count($GLOBALS['__POST']["selitems"]); $abs_dir = get_abs_dir($dir); $name = basename(stripslashes($GLOBALS['__POST']["name"])); if ($name == "") { show_error($GLOBALS["error_msg"]["miscnoname"]); } $download = JArrayHelper::getValue($_REQUEST, 'download', "n"); $startfrom = JArrayHelper::getValue($_REQUEST, 'startfrom', 0); $archive_name = get_abs_item($saveToDir, $name); $fileinfo = pathinfo($archive_name); if (empty($fileinfo['extension'])) { $archive_name .= "." . $GLOBALS['__POST']["type"]; $fileinfo['extension'] = $GLOBALS['__POST']["type"]; } foreach ($allowed_types as $ext) { if ($GLOBALS['__POST']["type"] == $ext && @$fileinfo['extension'] != $ext) { $archive_name .= "." . $ext; } } for ($i = 0; $i < $cnt; $i++) { $selitem = stripslashes($GLOBALS['__POST']["selitems"][$i]); if (is_dir($abs_dir . "/" . $selitem)) { $items = JFolder::files($abs_dir . "/" . $selitem, '.', true, true); foreach ($items as $item) { if (is_dir($item) || !is_readable($item) || $item == $archive_name) { continue; } $v_list[] = $item; } } else { $v_list[] = $abs_dir . "/" . $selitem; } } $cnt_filelist = count($v_list); $remove_path = $GLOBALS["home_dir"]; if ($dir) { $remove_path .= $dir . $GLOBALS['separator']; } for ($i = $startfrom; $i < $cnt_filelist && $i < $startfrom + $files_per_step; $i++) { $filelist[] = File_Archive::read($v_list[$i], str_replace($remove_path, '', $v_list[$i])); } //echo '<strong>Starting from: '.$startfrom.'</strong><br />'; //echo '<strong>Files to process: '.$cnt_filelist.'</strong><br />'; //print_r( $filelist );exit; // Do some setup stuff ini_set('memory_limit', '128M'); @set_time_limit(0); error_reporting(E_ERROR | E_PARSE); $result = File_Archive::extract($filelist, $archive_name); if (PEAR::isError($result)) { echo $name . ": Failed saving Archive File. Error: " . $result->getMessage(); nx_exit(); } if ($cnt_filelist > $startfrom + $files_per_step) { echo "\n <script type=\"text/javascript\">document.archform.startfrom.value = '" . ($startfrom + $files_per_step) . "';</script>\n"; echo '<script type="text/javascript"> doArchiving( \'' . $actionURL . '\' );</script>'; printf($GLOBALS['messages']['processed_x_files'], $startfrom + $files_per_step, $cnt_filelist); } else { if ($GLOBALS['__POST']["type"] == 'tgz' || $GLOBALS['__POST']["type"] == 'tbz') { chmod($archive_name, 0644); } if ($download == "y") { echo '<script type="text/javascript">document.location=\'' . make_link('download', dirname($archive_name), basename($archive_name)) . '\';</script>'; } else { echo '<script type="text/javascript">document.location=\'' . str_replace("index3.php", "index2.php", make_link("list", $dir, NULL)) . '&mosmsg=The%20Archive%20File%20has%20been%20created\';</script>'; } } nx_exit(); } ?> <script type="text/javascript" src="components/com_osefileman/scripts/functions.js"></script> <script type="text/javascript"> function doArchiving( url ) { showLoadingIndicator( $('loadingindicator'), true ); $('loadingindicator').style.display = ''; var controller = new Ajax( url, { postBody: $('adminform'), evalScripts: true, update: 'statustext' } ); controller.request(); return false; }</script> <?php show_header($GLOBALS["messages"]["actarchive"]); ?> <br/> <form name="archform" method="post" action="<?php echo $actionURL; ?> " onsubmit="return doArchiving(this.action);" id="adminform"> <input type="hidden" name="no_html" value="1" /> <input type="hidden" name="startfrom" value="0" /> <?php $cnt = count($GLOBALS['__POST']["selitems"]); for ($i = 0; $i < $cnt; ++$i) { echo '<input type="hidden" name="selitems[]" value="' . stripslashes($GLOBALS['__POST']["selitems"][$i]) . '">'; } ?> <table class="adminform" style="width:600px;"> <tr><td colspan="2" style="text-align:center;display:none;" id="loadingindicator"><strong><?php echo $GLOBALS['messages']['creating_archive']; ?> </strong></td></tr> <tr><td colspan="2" style="font-weight:bold;text-align:center" id="statustext"> </td></tr> <tr><td><?php echo $GLOBALS['messages']['archive_name']; ?> :</td> <td align="left"> <input type="text" name="name" size="25" value="<?php echo $dir != '' ? basename($dir) : $GLOBALS['__POST']["selitems"][0]; ?> " /> </td> </tr> <tr><td><?php echo $GLOBALS["messages"]["typeheader"]; ?> :</td> <td align="left"> <select name="type"> <?php if (extension_loaded("zlib")) { echo '<option value="zip">Zip (' . $GLOBALS["messages"]['normal_compression'] . ')</option>' . "\n"; echo '<option value="tgz">Tar/Gz (' . $GLOBALS["messages"]['good_compression'] . ')</option>' . "\n"; } if (extension_loaded("bz2")) { echo '<option value="tbz">Tar/Bzip2 (' . $GLOBALS["messages"]['best_compression'] . ')</option>' . "\n"; } echo '<option value="" disabled="disabled"> - - - - - - -</option>' . "\n"; echo '<option value="tar">Tar (' . $GLOBALS["messages"]['no_compression'] . ')</option>' . "\n"; ?> </select> </td> </tr> <tr><td><?php echo $GLOBALS['messages']['archive_saveToDir']; ?> :</td> <td align="left"> <input type="text" name="saveToDir" size="50" value="<?php echo $dir; ?> " /> </td> </tr> <tr><td><?php echo $GLOBALS["messages"]["downlink"]; ?> ?:</td> <td align="left"> <input type="checkbox" checked="checked" name="download" value="y" /> </td> </tr> <tr> <td colspan="2" style="text-align:center;"> <input type="submit" value="<?php echo $GLOBALS["messages"]["btncreate"]; ?> "> <input type="button" value="<?php echo $GLOBALS["messages"]["btncancel"]; ?> " onclick="javascript:location='<?php echo make_link("list", $dir, NULL); ?> ';"> </td> </tr> <tr><td colspan="2"> </td></tr> </table> </form> <br/> <script type="text/javascript">if(document.archform) document.archform.name.focus();</script> <?php }
/** * cmdGetDoc() * * @param string $sPath * @return void */ function cmdGetDoc($sPath) { if (isset($_SERVER['PWD'])) { chdir($_SERVER['PWD']); } File_Archive::extract(File_Archive::read(BLOCKEN_DOC_DIR), File_Archive::toArchive('BlockenDoc.zip', File_Archive::toFiles($sPath))); }
/** * 圧縮処理 * * @return boolean * @access private */ function _compressFile($parent_id, $folder_path = "") { $sql = "SELECT F.file_id, F.parent_id, F.file_type, F.file_name, F.extension, U.file_path, U.physical_file_name " . "FROM {cabinet_file} F " . "LEFT JOIN {uploads} U ON (F.upload_id=U.upload_id) "; $sql .= "WHERE F.cabinet_id = ? "; $sql .= "AND F.parent_id = ? "; $params = array("cabinet_id" => $this->_request->getParameter("cabinet_id"), "parent_id" => $parent_id); $files = $this->_db->execute($sql, $params); if ($files === false) { $this->_db->addError(); return false; } if (empty($files)) { return true; } foreach ($files as $i => $db_file) { if ($db_file["file_type"] == CABINET_FILETYPE_FOLDER) { $result = $this->_compressFile($db_file["file_id"], $folder_path . mb_convert_encoding($db_file["file_name"], $this->encode, "auto") . "/"); if ($result === false) { return $result; } } else { $physical_file = FILEUPLOADS_DIR . $db_file["file_path"] . $db_file["physical_file_name"]; $target_file = $folder_path . mb_convert_encoding($db_file["file_name"], $this->encode, "auto") . "." . $db_file["extension"]; if (file_exists($physical_file)) { $this->_source[] = File_Archive::read($physical_file, $target_file); //File_Archive::extract(File_Archive::read($physical_file, $target_file), $this->archive_full_path); } $cabinet = $this->_request->getParameter("cabinet"); if ($cabinet["compress_download"] == _ON) { $this->setDownload($db_file["file_id"]); } } } return true; }
function ZipFileRead($zip_file,$dtype) { $datas=array(); $line=0; //ライブラリ set_include_path(get_include_path() .PATH_SEPARATOR. DIR_ARCH_LIB); require_once "File/Archive.php"; //圧縮ファイル読み込み $arr=array(); $source = File_Archive::read( "$zip_file/" ); while( true ){ $w=CommonComponent::ZipFileReadBuffer($source); if ( $w == "" ){ break; } if ( $dtype == "csv" ){ $w=mb_convert_encoding(rtrim($w),"UTF-8","SJIS-WIN"); }else{ $w=rtrim($w); } $datas[]=array("data"=>$w); $line++; if ( $line >= RESULT_LINE_MAX ){ break; } } $source->close(); return $datas; }
function zip_it($source, $destination) { $source = realpath($source); if (is_readable($source) === true) { if (extension_loaded('zip') === true) { $zip = new ZipArchive(); if ($zip->open($destination, ZIPARCHIVE::CREATE) === true) { $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); // Iterate through files & directories and add to archive object foreach ($files as $file) { if (is_dir($file) === true) { $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); } else { if (is_file($file) === true) { $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); } } } } else { echo "Couldn't create zip file<br />"; } return $zip->close(); } else { $original_dir = getcwd(); chdir($source); File_Archive::extract(File_Archive::read('.'), File_Archive::toArchive($destination, File_Archive::toFiles(), 'zip')); chdir($original_dir); // TODO: add filesize check? if (is_readable($destination)) { return true; } } } else { echo "Source content does not exist or is not readable<br />"; } return false; }
/** * 指定したディレクトリのファイルをFile_Archiveに読み込む処理 * @param array &$source * @param string $dirname * @param string $archiveDir * @access private */ function _readStartFile(&$source, $dirname, $archiveDir) { $handle = opendir($dirname); while (false !== ($file = readdir($handle))) { if ($file != 'index.php' && $file != 'css.php' && $file != 'js.php' && $file != 'install' && !preg_match("/^.htaccess/", $file)) { continue; } $filePath = $dirname . '/' . $file; $source[] = File_Archive::read($filePath, $archiveDir . '/' . $file); } closedir($handle); if (!file_exists($dirname . '/css.php')) { $archiveDir .= '/htdocs'; $source[] = File_Archive::read($dirname . '/htdocs/css.php', $archiveDir . '/css.php'); $source[] = File_Archive::read($dirname . '/htdocs/js.php', $archiveDir . '/js.php'); $source[] = File_Archive::read($dirname . '/htdocs/install', $archiveDir . '/install'); } return $source; }
/** * Export Logs * * @access public * @return void */ function ExportLogs() { $this->gadget->CheckPermission('ExportLogs'); $filters = jaws()->request->fetch(array('from_date', 'to_date', 'gname', 'user', 'priority', 'status'), 'get'); $filters['gadget'] = $filters['gname']; unset($filters['gname']); $model = $this->gadget->model->load('Logs'); $logs = $model->GetLogs($filters); if (Jaws_Error::IsError($logs) || count($logs) < 1) { return; } $tmpDir = sys_get_temp_dir(); $tmpCSVFileName = uniqid(rand(), true) . '.csv'; $fp = fopen($tmpDir . DIRECTORY_SEPARATOR . $tmpCSVFileName, 'w'); $date = Jaws_Date::getInstance(); foreach ($logs as $log) { $exportData = ''; $exportData .= $log['id'] . ','; $exportData .= $log['username'] . ','; $exportData .= $log['gadget'] . ','; $exportData .= $log['action'] . ','; $exportData .= $log['priority'] . ','; $exportData .= $log['apptype'] . ','; $exportData .= $log['backend'] . ','; $exportData .= long2ip($log['ip']) . ','; $exportData .= $log['status'] . ','; $exportData .= $date->Format($log['insert_time'], 'Y-m-d H:i:s'); $exportData .= PHP_EOL; fwrite($fp, $exportData); } fclose($fp); require_once PEAR_PATH . 'File/Archive.php'; $tmpFileName = uniqid(rand(), true) . '.tar.gz'; $tmpArchiveName = $tmpDir . DIRECTORY_SEPARATOR . $tmpFileName; $writerObj = File_Archive::toFiles(); $src = File_Archive::read($tmpDir . DIRECTORY_SEPARATOR . $tmpCSVFileName); $dst = File_Archive::toArchive($tmpArchiveName, $writerObj); $res = File_Archive::extract($src, $dst); if (!PEAR::isError($res)) { return Jaws_Utils::Download($tmpArchiveName, $tmpFileName); } Jaws_Header::Referrer(); }
/** * Zip the temp folder */ function createZipFile($bEchoStatus = FALSE) { if (empty($this->aPaths)) { return PEAR::raiseError(_kt("No folders or documents found to compress")); } $config = KTConfig::getSingleton(); $useBinary = $config->get('export/useBinary', false); // Set environment language to output character encoding $loc = $this->sOutputEncoding; putenv("LANG={$loc}"); putenv("LANGUAGE={$loc}"); $loc = setlocale(LC_ALL, $loc); if ($useBinary) { $sManifest = sprintf("%s/%s", $this->sTmpPath, "MANIFEST"); file_put_contents($sManifest, join("\n", $this->aPaths)); } $sZipFile = sprintf("%s/%s." . $this->extension, $this->sTmpPath, $this->sZipFileName); $sZipFile = str_replace('<', '', str_replace('</', '', str_replace('>', '', $sZipFile))); if ($useBinary) { $sZipCommand = KTUtil::findCommand("export/zip", "zip"); $aCmd = array($sZipCommand, "-r", $sZipFile, ".", "-i@MANIFEST"); $sOldPath = getcwd(); chdir($this->sTmpPath); // Note that the popen means that pexec will return a file descriptor $aOptions = array('popen' => 'r'); $fh = KTUtil::pexec($aCmd, $aOptions); if ($bEchoStatus) { $last_beat = time(); while (!feof($fh)) { if ($i % 1000 == 0) { $this_beat = time(); if ($last_beat + 1 < $this_beat) { $last_beat = $this_beat; print " "; } } $contents = fread($fh, 4096); if ($contents) { print nl2br($this->_convertEncoding($contents, false)); } $i++; } } pclose($fh); } else { // Create the zip archive using the PEAR File_Archive File_Archive::extract(File_Archive::read($this->sTmpPath . '/Root Folder'), File_Archive::toArchive($this->sZipFileName . '.' . $this->extension, File_Archive::toFiles($this->sTmpPath), $this->extension)); } // Save the zip file and path into session $_SESSION['zipcompression'] = KTUtil::arrayGet($_SESSION, 'zipcompression', array()); $sExportCode = $this->exportCode; $_SESSION['zipcompression'][$sExportCode] = array('file' => $sZipFile, 'dir' => $this->sTmpPath); $_SESSION['zipcompression']['exportcode'] = $sExportCode; $this->sZipFile = $sZipFile; return $sExportCode; }