xxb/module/client/control.php
2023-10-23 15:51:36 +08:00

440 lines
13 KiB
PHP

<?php
/**
* The control file of client module of XXB.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd., www.zentao.net)
* @license ZOSL (https://zpl.pub/page/zoslv1.html)
* @author Gang Liu <liugang@cnezsoft.com>
* @package client
* @version $Id$
* @link https://xuanim.com
*/
class client extends control
{
/**
* Index page.
*
* @access public
* @return void
*/
public function index()
{
$blocks = $this->loadModel('block')->getBlockList('xxb');
/* Init block when vist index first. */
if(empty($blocks))
{
if($this->loadModel('block')->initBlock('xxb')) die(js::reload());
}
foreach($blocks as $key => $block)
{
$block->params = json_decode($block->params);
if(empty($block->params)) $block->params = new stdclass();
$sign = $this->config->requestType == 'PATH_INFO' ? '?' : '&';
$block->blockLink = $this->createLink('block', 'print' . $block->block . 'block', "index={$block->id}");
}
$this->view->title = $this->lang->client->common;
$this->view->blocks = $blocks;
$this->view->currentVersion = $this->client->getCurrentVersion();
$this->view->versionApiUrl = sprintf($this->config->client->upgradeApi, '');
$this->display();
}
/**
* Browse client list.
*
* @access public
* @return void
*/
public function browse()
{
$this->view->title = $this->lang->client->update;
$this->view->clients = $this->client->getList();
$this->display();
}
/**
* Create a client.
*
* @access public
* @return void
*/
public function create()
{
if($_POST)
{
$this->client->create();
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
$this->view->title = $this->lang->client->create;
$this->display();
}
/**
* Download remote package.
* @param string $version
* @param string $link
* @param string $os
* @return string
*/
public function download($version = '', $link = '', $os = '')
{
set_time_limit(0);
$result = $this->client->downloadZipPackage($version, $link);
if($result == false) $this->send(array('result' => 'fail', 'message' => $this->lang->client->downloadFail));
$client = $this->client->edit($version, $result, $os);
if($client == false) $this->send(array('result' => 'fail', 'message' => $this->lang->client->saveClientError));
$this->send(array('result' => 'success', 'client' => $client, 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
/**
* Edit a version.
*
* @param int $clientID
* @access public
* @return void
*/
public function edit($clientID)
{
if($_POST)
{
$this->client->update($clientID);
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
$this->view->title = $this->lang->client->edit;
$this->view->client = $this->client->getByID($clientID);
$this->display();
}
/**
* View changelog of a client update
*
* @param int $clientID
* @access public
* @return void
*/
public function changelog($clientID)
{
$client = $this->client->getByID($clientID);
$this->view->client = $client;
$this->view->title = $this->lang->client->changeLog . ' ' . $client->version;
$this->display();
}
/**
* Delete a client.
*
* @param int $clientID
* @access public
* @return void
*/
public function delete($clientID)
{
$this->dao->delete()->from(TABLE_IM_CLIENT)->where('id')->eq($clientID)->exec();
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->send(array('result' => 'success'));
}
/**
* Check upgrade.
*
* @access public
* @return void
*/
public function checkUpgrade()
{
$currentVersion = $this->client->getCurrentVersion();
$apiUrl = sprintf($this->config->client->upgradeApi, "-$currentVersion->version");
$jsonData = file_get_contents($apiUrl);
$serverVersions = json_decode($jsonData, false);
$this->view->title = $this->lang->client->checkUpgrade;
$this->view->serverVersions = $serverVersions;
$this->view->versions = $serverVersions;
$this->view->currentVersion = $currentVersion;
$this->view->path = $this->app->dataRoot;
$this->display();
}
/**
* Download xuan client.
*
* @access public
* @param string $action
* @param string $os
* @return void
*/
public function downloadClient($action = 'check', $os = '')
{
if($_POST)
{
$os = $this->post->os;
die(js::locate($this->createLink('client', 'downloadClient', "action=getPackage&os=$os"), 'self'));
}
if($action == 'check')
{
$error = false;
$errorInfo = '';
$clientDir = $this->app->wwwRoot . 'data/client/' . $this->config->xuanxuan->version . '/';
if(!is_dir($clientDir))
{
$result = mkdir($clientDir, 0755, true);
if($result == false)
{
$error = true;
$errorInfo = sprintf($this->lang->client->errorInfo->dirNotExist, $clientDir, $clientDir);
}
}
if(!is_writable($clientDir))
{
$error = true;
$errorInfo = sprintf($this->lang->client->errorInfo->dirNotWritable, $clientDir, $clientDir);
}
$this->view->error = $error;
$this->view->errorInfo = $errorInfo;
if(!$error) die(js::locate($this->createLink('client', 'downloadClient', "action=selectPackage")));
}
if($action == 'selectPackage')
{
$os = 'win64';
$agentOS = helper::getOS();
if(strpos($agentOS, 'Windows') !== false) $os = 'win64';
if(strpos($agentOS, 'Linux') !== false) $os = 'linux64';
if(strpos($agentOS, 'Mac') !== false) $os = 'mac';
$this->view->os = $os;
}
if($action == 'getPackage')
{
$this->view->os = $os;
$this->view->account = $this->app->user->account;
}
if($action == 'clearTmpPackage')
{
$account = $this->app->user->account;
$tmpDir = $this->app->wwwRoot . 'data/client/' . "$account/";
if(is_dir($tmpDir))
{
$zfile = $this->app->loadClass('zfile');
$zfile->removeDir($tmpDir);
}
}
if($action == 'downloadPackage')
{
$account = $this->app->user->account;
$clientDir = $this->app->wwwRoot . 'data/client/' . "$account/";
$clientFile = $clientDir . 'xuanxuan.zip';
$zipContent = file_get_contents($clientFile);
if(is_dir($clientDir))
{
$zfile = $this->app->loadClass('zfile');
$zfile->removeDir($clientDir);
}
$output = $this->fetch('file', 'sendDownHeader', array('fileName' => "xuanxuan." . $os . '.zip', 'zip', $zipContent));
}
$this->view->action = $action;
$this->display();
}
/**
* Ajax get client package.
*
* @param string $os
* @access public
* @return void
*/
public function ajaxGetClientPackage($os = '')
{
set_time_limit (0);
session_write_close();
$response = array();
$response['result'] = 'success';
$response['message'] = '';
$clientDir = $this->app->wwwRoot . 'data/client/';
if(!is_dir($clientDir)) mkdir($clientDir, 0755, true);
$version = $this->config->xuanxuan->version;
$packageDir = $clientDir . "/$version/";
if(!is_dir($packageDir)) mkdir($packageDir, 0755, true);
$account = $this->app->user->account;
$tmpDir = $clientDir . "/$account/";
if(!is_dir($tmpDir)) mkdir($tmpDir, 0755, true);
$needCache = false;
$clientName = "xuanxuan." . $version . "." . $os . ".zip";
$packageFile = $packageDir . $clientName;
$packageURL = "http://dl.cnezsoft.com/xuanxuan/$version/$clientName";
if(!file_exists($packageFile))
{
$xxFile = $packageURL . "?t=" . rand();
$needCache = true;
}
else
{
$xxFile = $packageFile;
}
$clientFile = $tmpDir . 'xuanxuan.zip';
if($xxHd = fopen($xxFile, "rb"))
{
if($clientHd = fopen($clientFile, "wb"))
{
while(!feof($xxHd))
{
$result = fwrite($clientHd, fread($xxHd, 1024 * 8 ), 1024 * 8 );
if($result == false)
{
$response['result'] = 'fail';
$response['message'] = sprintf($this->lang->client->errorInfo->manualOpt, $packageURL);
$this->send($response);
}
}
}
else
{
$response['result'] = 'fail';
$response['message'] = sprintf($this->lang->client->errorInfo->manualOpt, $packageURL);
$this->send($response);
}
fclose($xxHd);
fclose($clientHd);
}
else
{
$response['result'] = 'fail';
$response['message'] = sprintf($this->lang->client->errorInfo->manualOpt, $packageURL);
$this->send($response);
}
if($needCache) file_put_contents($packageFile, file_get_contents($clientFile));
$this->send($response);
}
/**
* Ajax get client package size.
*
* @access public
* @return void
*/
public function ajaxGetPackageSize()
{
$account = $this->app->user->account;
$packageFile = $this->app->wwwRoot . 'data/client/' . $account . '/xuanxuan.zip';
$size = 0;
if(file_exists($packageFile))
{
$size = filesize($packageFile);
$size = $size ? round($size / 1048576, 2) : 0;
}
$response = array();
$response['result'] = 'success';
$response['size'] = $size;
$this->send($response);
}
/**
* Ajax set client config to client package.
*
* @param string $os
* @access public
* @return void
*/
public function ajaxSetClientConfig($os = '')
{
$response['result'] = 'success';
$account = $this->app->user->account;
$clientDir = $this->app->wwwRoot . 'data/client/' . "$account/";
if(!is_dir($clientDir)) mkdir($clientDir, 0755, true);
/* write login info into config file. */
$loginInfo = new stdclass();
$loginInfo->ui = new stdclass();
$loginInfo->ui->defaultUser = new stdclass();
$loginInfo->ui->defaultUser->server = $this->config->xuanxuan->server;
$loginInfo->ui->defaultUser->account = $this->app->user->account;
$loginInfo = json_encode($loginInfo);
$loginFile = $clientDir . 'config.json';
file_put_contents($loginFile, $loginInfo);
define('PCLZIP_TEMPORARY_DIR', $clientDir);
$this->app->loadClass('pclzip', true);
$clientFile = $clientDir . 'xuanxuan.zip';
$archive = new pclzip($clientFile);
if($os == 'mac')
{
$result = $archive->add($loginFile, PCLZIP_OPT_REMOVE_ALL_PATH, PCLZIP_OPT_ADD_PATH, 'xuanxuan.app/Contents/Resources/build-in');
}
else
{
$result = $archive->add($loginFile, PCLZIP_OPT_REMOVE_ALL_PATH, PCLZIP_OPT_ADD_PATH, 'xuanxuan/resources/build-in');
}
if($result == 0)
{
$response['result'] = 'fail';
$response['message'] = $archive->errorInfo(true);
$this->send($response);
}
$this->send($response);
}
/**
* Fetch and pack server address into client zips, and provide download links.
*
* @param string $os
* @return void
*/
public function getClientLinks($os = 'win64')
{
if($_POST)
{
$os = implode(',', $this->post->os);
$this->client->fetchCurrentClient($os);
$this->client->packServerConfig($os);
$this->view->links = $this->client->getLinks($os);
$this->view->os = '';
$this->display();
die;
}
$this->view->hangWarning = $this->lang->client->serverMightHang;
$this->view->links = false;
$this->view->os = $os;
$this->display();
}
}