Esempio n. 1
0
 public static function export($idstr)
 {
     $idArr = is_array($idstr) ? $idstr : explode(",", $idstr);
     if (1 < count($idArr)) {
         $zip = new Zip();
         $exportFileName = Ibos::lang("Form export file pack", "workflow.default", array("{date}" => date("Y-m-d")));
         $zipFileName = FileUtil::getTempPath() . "/" . TIMESTAMP . ".zip";
         foreach ($idArr as $id) {
             $form = self::handleExportSingleForm($id);
             $zip->addFile($form["content"], sprintf("%s.html", ConvertUtil::iIconv($form["title"], CHARSET, "gbk")));
         }
         $fp = fopen($zipFileName, "w");
         if (@fwrite($fp, $zip->file()) !== false) {
             header("Cache-control: private");
             header("Content-type: application/octet-stream");
             header("Accept-Ranges: bytes");
             header("Content-Length: " . sprintf("%u", FileUtil::fileSize($zipFileName)));
             header("Content-Disposition: attachment; filename=" . $exportFileName . ".zip");
             readfile($zipFileName);
             exit;
         }
     } else {
         $id = implode(",", $idArr);
         $form = self::handleExportSingleForm($id);
         ob_end_clean();
         header("Cache-control: private");
         header("Content-type: text/plain");
         header("Accept-Ranges: bytes");
         header("Accept-Length: " . strlen($form["content"]));
         header("Content-Disposition: attachment; filename=" . $form["title"] . ".html");
         echo $form["content"];
     }
 }
Esempio n. 2
0
 public static function databaseBackup()
 {
     $config = Ibos::app()->setting->toArray();
     $command = Ibos::app()->db->createCommand("SET SQL_QUOTE_SHOW_CREATE=0");
     $command->execute();
     $fileName = EnvUtil::getRequest("filename");
     $hasDangerFileName = preg_match("/(\\.)(exe|jsp|asp|aspx|cgi|fcgi|pl)(\\.|\$)/i", $fileName);
     if (!$fileName || (bool) $hasDangerFileName) {
         return array("type" => "error", "msg" => Ibos::lang("Database export filename invalid", "dashboard.default"));
     }
     $tablePrefix = $config["config"]["db"]["tableprefix"];
     $dbCharset = $config["config"]["db"]["charset"];
     $type = EnvUtil::getRequest("backuptype");
     if ($type == "all") {
         $tableList = self::getTablelist($tablePrefix);
         $tables = self::arrayKeysTo($tableList, "Name");
     } elseif ($type == "custom") {
         $tables = array();
         if (is_null(EnvUtil::getRequest("dbSubmit"))) {
             $tables = Setting::model()->fetchSettingValueByKey("custombackup");
             $tables = unserialize($tables);
         } else {
             $customTables = EnvUtil::getRequest("customtables");
             Setting::model()->updateSettingValueByKey("custombackup", is_null($customTables) ? "" : $customTables);
             $tables =& $customTables;
         }
         if (!is_array($tables) || empty($tables)) {
             return array("type" => "error", "msg" => Ibos::lang("Database export custom invalid", "dashboard.default"));
         }
     }
     $time = date("Y-m-d H:i:s", TIMESTAMP);
     $volume = intval(EnvUtil::getRequest("volume")) + 1;
     $method = EnvUtil::getRequest("method");
     $encode = base64_encode("{$config["timestamp"]}," . VERSION . ",{$type},{$method},{$volume},{$tablePrefix},{$dbCharset}");
     $idString = "# Identify: " . $encode . "\n";
     $sqlCharset = EnvUtil::getRequest("sqlcharset");
     $sqlCompat = EnvUtil::getRequest("sqlcompat");
     $dbVersion = Ibos::app()->db->getServerVersion();
     $useZip = EnvUtil::getRequest("usezip");
     $useHex = EnvUtil::getRequest("usehex");
     $extendIns = EnvUtil::getRequest("extendins");
     $sizeLimit = EnvUtil::getRequest("sizelimit");
     $dumpCharset = !empty($sqlCharset) ? $sqlCharset : str_replace("-", "", CHARSET);
     $isNewSqlVersion = "4.1" < $dbVersion && (!is_null($sqlCompat) || $sqlCompat == "MYSQL41");
     $setNames = !empty($sqlCharset) && $isNewSqlVersion ? "SET NAMES '{$dumpCharset}';\n\n" : "";
     if ("4.1" < $dbVersion) {
         if ($sqlCharset) {
             $command->setText("SET NAMES `{$sqlCharset}`")->execute();
         }
         if ($sqlCompat == "MYSQL40") {
             $command->setText("SET SQL_MODE='MYSQL40'")->execute();
         } elseif ($sqlCompat == "MYSQL41") {
             $command->setText("SET SQL_MODE=''")->execute();
         }
     }
     if (!is_dir(self::BACKUP_DIR)) {
         FileUtil::makeDir(self::BACKUP_DIR, 511);
     }
     $backupFileName = self::BACKUP_DIR . "/" . str_replace(array("/", "\\", ".", "'"), "", $fileName);
     if ($method == "multivol") {
         $sqlDump = "";
         $tableId = intval(EnvUtil::getRequest("tableid"));
         $startFrom = intval(EnvUtil::getRequest("startfrom"));
         if (!$tableId && $volume == 1) {
             foreach ($tables as $table) {
                 $sqlDump .= self::getSqlDumpTableStruct($table, $sqlCompat, $sqlCharset, $dumpCharset);
             }
         }
         for (self::$complete = true; strlen($sqlDump) + 500 < $sizeLimit * 1000; $tableId++) {
             $sqlDump .= self::sqlDumpTable($tables[$tableId], $extendIns, $sizeLimit, $useHex, $startFrom, strlen($sqlDump));
             if (self::$complete) {
                 $startFrom = 0;
             }
         }
         $dumpFile = $backupFileName . "-%s.sql";
         !self::$complete && $tableId--;
         if (trim($sqlDump)) {
             $sqlDump = "{$idString}# <?php exit();?>\n# IBOS Multi-Volume Data Dump Vol.{$volume}\n# Version: IBOS {$config["version"]}\n# Time: {$time}\n# Type: {$type}\n# Table Prefix: {$tablePrefix}\n#\n# IBOS Home: http://www.ibos.com.cn\n# Please visit our website for newest infomation about IBOS\n# --------------------------------------------------------\n\n\n{$setNames}" . $sqlDump;
             $dumpFileName = sprintf($dumpFile, $volume);
             @($fp = fopen($dumpFileName, "wb"));
             @flock($fp, 2);
             if (@(!fwrite($fp, $sqlDump))) {
                 @fclose($fp);
                 return array("type" => "error", "msg" => Ibos::lang("Database export file invalid", "dashboard.default"), "url" => "");
             } else {
                 fclose($fp);
                 if ($useZip == 2) {
                     $fp = fopen($dumpFileName, "r");
                     $content = @fread($fp, filesize($dumpFileName));
                     fclose($fp);
                     $zip = new Zip();
                     $zip->addFile($content, basename($dumpFileName));
                     $fp = fopen(sprintf($backupFileName . "-%s.zip", $volume), "w");
                     if (@fwrite($fp, $zip->file()) !== false) {
                         @unlink($dumpFileName);
                     }
                     fclose($fp);
                 }
                 unset($sqlDump);
                 unset($zip);
                 unset($content);
                 $param = array("setup" => 1, "backuptype" => rawurlencode($type), "filename" => rawurlencode($fileName), "method" => "multivol", "sizelimit" => rawurlencode($sizeLimit), "volume" => rawurlencode($volume), "tableid" => rawurlencode($tableId), "startfrom" => rawurlencode(self::$startRow), "extendins" => rawurlencode($fileName), "sqlcharset" => rawurlencode($sqlCharset), "sqlcompat" => rawurlencode($sqlCompat), "usehex" => $useHex, "usezip" => $useZip);
                 $url = Ibos::app()->urlManager->createUrl("dashboard/database/backup", $param);
                 return array("type" => "success", "msg" => Ibos::lang("Database export multivol redirect", "dashboard.default", array("volume" => $volume)), "url" => $url);
             }
         } else {
             $volume--;
             if ($useZip == 1) {
                 $zip = new Zip();
                 $zipFileName = $backupFileName . ".zip";
                 $unlinks = array();
                 for ($i = 1; $i <= $volume; $i++) {
                     $filename = sprintf($dumpFile, $i);
                     $fp = fopen($filename, "r");
                     $content = @fread($fp, filesize($filename));
                     fclose($fp);
                     $zip->addFile($content, basename($filename));
                     $unlinks[] = $filename;
                 }
                 $fp = fopen($zipFileName, "w");
                 if (@fwrite($fp, $zip->file()) !== false) {
                     foreach ($unlinks as $link) {
                         @unlink($link);
                     }
                 } else {
                     return array("type" => "success", "msg" => Ibos::lang("Database export multivol succeed", "dashboard.default", array("volume" => $volume)), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore"));
                 }
                 unset($sqlDump);
                 unset($zip);
                 unset($content);
                 fclose($fp);
                 $filename = $zipFileName;
                 return array("type" => "success", "msg" => Ibos::lang("Database export zip succeed", "dashboard.default"), "param" => array("autoJump" => false));
             } else {
                 return array("type" => "success", "msg" => Ibos::lang("Database export multivol succeed", "dashboard.default", array("volume" => $volume)), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore"));
             }
         }
     } else {
         $tablesstr = "";
         foreach ($tables as $table) {
             $tablesstr .= "\"" . $table . "\" ";
         }
         $db = $config["config"]["db"];
         $query = $command->setText("SHOW VARIABLES LIKE 'basedir'")->queryRow();
         $mysqlBase = $query["Value"];
         $dumpFile = addslashes(dirname(dirname(__FILE__))) . "/" . $backupFileName . ".sql";
         @unlink($dumpFile);
         $mysqlBin = $mysqlBase == "/" ? "" : addslashes($mysqlBase) . "bin/";
         shell_exec($mysqlBin . "mysqldump --force --quick " . ("4.1" < $dbVersion ? "--skip-opt --create-options" : "-all") . " --add-drop-table" . (EnvUtil::getRequest("extendins") == 1 ? " --extended-insert" : "") . "" . ("4.1" < $dbVersion && $sqlCompat == "MYSQL40" ? " --compatible=mysql40" : "") . " --host=\"" . $db["host"] . ($db["port"] ? is_numeric($db["port"]) ? " --port=" . $db["port"] : " --socket=\"" . $db["port"] . "\"" : "") . "\" --user=\"" . $db["username"] . "\" --password=\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" " . $tablesstr . " > " . $dumpFile);
         if (@file_exists($dumpFile)) {
             if ($useZip) {
                 $zip = new Zip();
                 $zipfilename = $backupFileName . ".zip";
                 $fp = fopen($dumpFile, "r");
                 $content = @fread($fp, filesize($dumpFile));
                 fclose($fp);
                 $zip->addFile($idString . "# <?php exit();?>\n " . $setNames . "\n #" . $content, basename($dumpFile));
                 $fp = fopen($zipfilename, "w");
                 @fwrite($fp, $zip->file());
                 fclose($fp);
                 @unlink($dumpFile);
                 $filename = $backupFileName . ".zip";
                 unset($sqlDump);
                 unset($zip);
                 unset($content);
                 return array("type" => "success", "msg" => Ibos::lang("Database export zip succeed", "dashboard.default"), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore"));
             } else {
                 if (@is_writeable($dumpFile)) {
                     $fp = fopen($dumpFile, "rb+");
                     @fwrite($fp, $idString . "# <?php exit();?>\n " . $setNames . "\n #");
                     fclose($fp);
                 }
                 $filename = $backupFileName . ".sql";
                 return array("type" => "success", "msg" => Ibos::lang("Database export succeed", "dashboard.default"), "param" => Ibos::app()->urlManager->createUrl("dashboard/database/restore"));
             }
         } else {
             return array("type" => "error", "msg" => Ibos::lang("Database shell fail", "dashboard.default"));
         }
     }
 }