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

177 lines
9.1 KiB
PHP
Executable File

<?php
class setting extends control
{
/**
* Configuration of xuanxuan.
*
* @param string $type
* @access public
* @return void
*/
public function xuanxuan($type = '')
{
if($type != 'edit' && empty($this->config->xuanxuan->server)) $this->locate(inlink('xuanxuan', 'type=edit'));
if($type != 'edit' && (!zget($this->config->xuanxuan, 'key', '') or zget($this->config->xuanxuan, 'key', '') == str_repeat(8, 32))) $this->locate(inlink('xuanxuan', 'type=edit'));
if(!isset($_SESSION['clearFileName'])) {
$clearFileName = $this->app->getBasePath() . 'tmp' . DIRECTORY_SEPARATOR . uniqid('clear_') . '.txt';
$this->session->set('clearFileName', $clearFileName);
}
$clearFileName = $this->session->clearFileName;
$this->app->loadLang('im');
if($_POST)
{
if(array_key_exists('key', $_POST))
{
$errors = array();
$setting = fixer::input('post')->get();
if(strlen($this->post->key) != 32 or !validater::checkREG($this->post->key, '|^[A-Za-z0-9]+$|')) $errors['key'] = $this->lang->im->errorKey;
if($this->post->key == str_repeat(8, 32)) $errors['key'] = $this->lang->im->defaultKey;
if($setting->https == 'on')
{
if(empty($setting->sslcrt)) $errors['sslcrt'] = $this->lang->im->errorSSLCrt;
if(empty($setting->sslkey)) $errors['sslkey'] = $this->lang->im->errorSSLKey;
}
if(strpos($setting->server, '127.0.0.1') !== false) $errors['server'][] = $this->lang->im->xxdServerError;
if(strpos($setting->server, 'https://') !== 0 and strpos($setting->server, 'http://') !== 0) $errors['server'][] = $this->lang->im->xxdSchemeError;
if(empty($setting->server)) $errors['server'][] = $this->lang->im->xxdServerEmpty;
/* Check if value is a valid positive number. (float or int) */
if(!is_numeric($setting->uploadFileSize) || (int)$setting->uploadFileSize < 0) $errors['uploadFileSize'] = $this->lang->im->xxdFileSizeErr;
/* Check if value is a valid positive int. */
if(!(is_numeric($setting->chatPort) && is_int($setting->chatPort + 0)) || (int)$setting->chatPort <= 0 || (int)$setting->chatPort > 65535) $errors['chatPort'] = $this->lang->im->xxdPortError;
if(!(is_numeric($setting->commonPort) && is_int($setting->commonPort + 0)) || (int)$setting->commonPort <= 0 || (int)$setting->commonPort > 65535) $errors['commonPort'] = $this->lang->im->xxdPortError;
if(!(is_numeric($setting->pollingInterval) && is_int($setting->pollingInterval + 0)) || (int)$setting->pollingInterval < 5) $errors['pollingInterval'] = $this->lang->im->xxdPollIntErr;
if(!(is_numeric($setting->tokenLifetime) && is_int($setting->tokenLifetime + 0)) || (int)$setting->tokenLifetime < 1) $errors['tokenLifetime'] = $this->lang->im->tokenLifetimeErr;
if(!(is_numeric($setting->tokenAuthWindow) && is_int($setting->tokenAuthWindow + 0)) || (int)$setting->tokenAuthWindow < 20) $errors['tokenAuthWindow'] = $this->lang->im->tokenAuthWindowErr;
if(isset($setting->iceServers))
{
$servers = array_map(
function($x) {return trim($x);},
array_filter(explode("\n", $setting->iceServers))
);
$setting->iceServers = implode(',', $servers);
foreach ($servers as $server)
{
if(strlen($server) > 5 && preg_match('/^(stun|turn):/', $server) === 1)
{
$result = parse_url(substr($server, 5));
if($result !== false && count($result) === 2 && array_key_exists('host', $result) && array_key_exists('port', $result))
{
continue;
}
}
$errors['iceServers'] = $this->lang->im->iceServersErr ;
break;
}
}
if(isset($setting->fileEncrypt) && $setting->fileEncrypt == 'on' && !isset($errors['key'])) $setting->fileEncryptionKey = $this->post->key;
$comment = json_encode($_POST);
if($errors)
{
$this->setting->addSettingAction('paramProfile', 0, 'edit', 'fail', $comment);
$this->send(array('result' => 'fail', 'message' => $errors));
}
if(isset($setting->messageEncrypt) && $setting->messageEncrypt == 'on')
{
if(!isset($this->config->xuanxuan->lastUnEncryptMessageId))
{
$lastUnEncryptMessageId = $this->loadModel('im')->message->getLastMessageId();
$this->loadModel('setting')->setItem('system.common.xuanxuan.lastUnEncryptMessageId', $lastUnEncryptMessageId);
}
}
$result = $this->loadModel('setting')->setItems('system.common.xuanxuan', $setting);
if(!$result)
{
$this->setting->addSettingAction('paramProfile', 0, 'edit', 'fail', $comment);
$this->send(array('result' => 'fail', 'message' => dao::getError()));
}
$this->setting->addSettingAction('paramProfile', 0, 'edit', 'success', $comment);
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('xuanxuan')));
}
else if($this->config->product == 'xxb')
{
if(!isset($_SESSION['clearFileName']) || !file_exists($_SESSION['clearFileName']) || time() - filemtime($_SESSION['clearFileName']) > 60 * 2)
{
$lang = $this->lang->setting->createClearFile . ' ' . addslashes($_SESSION['clearFileName']);
$this->send(array('result' => 'fail', 'message' => $lang));
}
$tableArr = array(
TABLE_ACTION,
TABLE_BLOCK,
TABLE_FILE,
TABLE_GROUP,
TABLE_GROUPPRIV,
TABLE_HISTORY,
TABLE_IM_CHATUSER,
TABLE_IM_CHAT_MESSAGE_INDEX,
TABLE_IM_CLIENT,
TABLE_IM_CONFERENCE,
TABLE_IM_CONFERENCEACTION,
TABLE_IM_MESSAGESTATUS,
TABLE_IM_MESSAGE_BACKUP,
TABLE_IM_QUEUE,
TABLE_IM_USERDEVICE,
TABLE_LANG,
);
foreach($tableArr as $table)
{
$this->dao->delete()->from($table)->exec();
}
$this->dao->delete()->from(TABLE_IM_CHAT)->exec();
$this->loadModel('im')->chatInitSystemChat();
$tables = $this->loadModel('im')->messageGetAllTables();
foreach($tables as $table)
{
if($table->tableName == TABLE_IM_MESSAGE) $this->dao->delete()->from($table->tableName)->exec();
if($table->tableName != TABLE_IM_MESSAGE) $this->dao->exec('DROP TABLE ' . $table->tableName);
}
$this->dao->delete()->from(TABLE_IM_MESSAGE_INDEX)->exec();
$this->dao->delete()->from(TABLE_CONFIG)
->where('module')->eq('chat')
->andWhere('`key`')->in(array('lastreadid', 'lastreadindex'))
->exec();
if($_POST['clearType'] == 'all')
{
$this->dao->delete()->from(TABLE_USER)->where('account')->ne($this->app->user->account)->exec();
$this->dao->update(TABLE_USER)->set('dept')->eq(0)->where('account')->eq($this->app->user->account)->exec();
$this->dao->delete()->from(TABLE_USERGROUP)->exec();
$this->dao->delete()->from(TABLE_CATEGORY)->exec();
}
unset($_SESSION['clearFileName']);
$this->send(array('result' => 'success', 'message' => $this->lang->setting->deleteSuccess, 'locate' => inlink('xuanxuan')));
}
}
$os = 'win';
if(strpos(strtolower(PHP_OS), 'win') !== 0) $os = strtolower(PHP_OS);
if(isset($this->lang->client->menu))
{
$this->lang->setting->menu = $this->lang->client->menu;
$this->lang->menuGroups->setting = 'client';
}
$this->view->title = $this->lang->setting->param;
$this->view->type = $type;
$this->view->os = $os . '_' . php_uname('m');
$this->view->server = $this->loadModel('im')->getServer();
$this->view->path = $this->app->basePath;
$this->view->clearType = 'exceptUsers';
$this->view->clearFileName = $clearFileName;
$this->display();
}
}