diff --git a/module/extension/control.php b/module/extension/control.php index 492b4a2025..179fb9afa9 100644 --- a/module/extension/control.php +++ b/module/extension/control.php @@ -74,7 +74,7 @@ class extension extends control * @access public * @return void */ - public function install($extension, $downLink = '', $md5 = '', $forceInstall = 'no') + public function install($extension, $downLink = '', $md5 = '', $forceInstall = 'no', $isCheck = true) { $this->view->error = ''; $this->view->header->title = $this->lang->extension->install . $this->lang->colon . $extension; @@ -134,12 +134,20 @@ class extension extends control /* Extract the package. */ $return = $this->extension->extractPackage($extension); - if($return->result != 'ok') + if($return->result != 'ok') { $this->view->error = sprintf($this->lang->extension->errorExtracted, $packageFile, $return->error); die($this->display()); } + $return = $this->extension->checkFile($extension, 'repeat', $isCheck); + if($return->result != 'ok') + { + $continueLink = inlink('install', "extension=$extension&downLink=&md5=&forecInstall=&isCheck=" . false); + $resetLink = inlink('obtain'); + $this->view->error = sprintf($this->lang->extension->errorRepeatFile, $return->error, $continueLink, $resetLink); + die($this->display()); + } /* Save to database. */ $this->extension->saveExtension($extension); @@ -179,11 +187,24 @@ class extension extends control * @access public * @return void */ - public function uninstall($extension) + public function uninstall($extension,$isCheck = true) { + $return->return = 'ok'; + $checkReturn = $this->extension->checkFile($extension, 'change', $isCheck); + if($checkReturn->result != 'ok') + { + $continueLink = inlink('uninstall', "extension=$extension&isCheck=" . false); + $resetLink = inlink('browse'); + $return->removeCommands = sprintf($this->lang->extension->errorChangeFile, $checkReturn->error, $continueLink, $resetLink); + $return->return = 'fail'; + $this->view->return = $return; + die($this->display()); + } + $this->extension->executeDB($extension, 'uninstall'); $this->extension->updateExtension($extension, array('status' => 'available')); - $this->view->removeCommands = $this->extension->removePackage($extension); + $return->removeCommands = $this->extension->removePackage($extension); + $this->view->return = $return; $this->view->header->title = $this->lang->extension->uninstallFinished; $this->display(); } @@ -195,8 +216,18 @@ class extension extends control * @access public * @return void */ - public function activate($extension) + public function activate($extension, $isCheck = true) { + $return = $this->extension->checkFile($extension, 'repeat', $isCheck); + if($return->result != 'ok') + { + $continueLink = inlink('activate', "extension=$extension&isCheck=" . false); + $resetLink = inlink('browse', 'type=deactivated'); + $return->error = sprintf($this->lang->extension->errorRepeatFile, $return->error, $continueLink, $resetLink); + $this->view->return = $return; + die($this->display()); + } + $this->extension->copyPackageFiles($extension); $this->extension->updateExtension($extension, array('status' => 'installed')); $this->view->header->title = $this->lang->extension->activateFinished; @@ -210,10 +241,22 @@ class extension extends control * @access public * @return void */ - public function deactivate($extension) + public function deactivate($extension, $isCheck = true) { + $return->return = 'ok'; + $checkReturn = $this->extension->checkFile($extension, 'change', $isCheck); + if($checkReturn->result != 'ok') + { + $continueLink = inlink('deactivate', "extension=$extension&isCheck=" . false); + $resetLink = inlink('browse'); + $return->removeCommands = sprintf($this->lang->extension->errorChangeFile, $checkReturn->error, $continueLink, $resetLink); + $return->return = 'fail'; + $this->view->return = $return; + die($this->display()); + } $this->extension->updateExtension($extension, array('status' => 'deactivated')); - $this->view->removeCommands = $this->extension->removePackage($extension); + $return->removeCommands = $this->extension->removePackage($extension); + $this->view->return = $return; $this->view->header->title = $this->lang->extension->deactivateFinished; $this->display(); } diff --git a/module/extension/lang/zh-cn.php b/module/extension/lang/zh-cn.php index 839098896c..6f1857b733 100644 --- a/module/extension/lang/zh-cn.php +++ b/module/extension/lang/zh-cn.php @@ -65,7 +65,9 @@ $lang->extension->errorDownloadPathNotWritable = '插件下载存储路径extension->errorPackageFileExists = '下载路径已经有一个名为的%s附件。

重新安装,请点击此链接

'; $lang->extension->errorDownloadFailed = '下载失败,请重新下载。如果多次重试还不行,请尝试手工下载,然后通过上传功能上传。'; $lang->extension->errorMd5Checking = '下载文件不完整,请重新下载。如果多次重试还不行,请尝试手工下载,然后通过上传功能上传。'; -$lang->extension->errorExtracted = '包文件 %s 解压缩失败,可能不是一个有效的zip文件。错误信息如下:
'; +$lang->extension->errorExtracted = '包文件 %s 解压缩失败,可能不是一个有效的zip文件。错误信息如下:
%s'; +$lang->extension->errorRepeatFile = '有以下安装文件重复:
%s。

是否继续安装,覆盖安装  取消

'; +$lang->extension->errorChangeFile = '有以下安装文件做过改动:
%s。

是否继续,确定删除  取消

'; $lang->extension->errorPackageNotFound = '包文件 %s 没有找到,可能是因为自动下载失败。您可以尝试再次下载。'; $lang->extension->errorTargetPathNotWritable = '目标路径 %s 不可写。'; $lang->extension->errorTargetPathNotExists = '目标路径 %s 不存在。'; diff --git a/module/extension/model.php b/module/extension/model.php index b1cb99a02d..64bb7900a8 100644 --- a/module/extension/model.php +++ b/module/extension/model.php @@ -352,7 +352,6 @@ class extensionModel extends model if($path == 'db' or $path == 'doc' or $path == '..' or $path == '.') continue; $copiedFiles = $this->copyDir($extensionDir . $path, $appRoot . $path); } - return $copiedFiles; } @@ -513,7 +512,7 @@ class extensionModel extends model $data = (object)$data; $appRoot = $this->app->getAppRoot(); - if(isset($data->dirs) and $data->dirs) + if(isset($data->dirs)) { foreach($data->dirs as $key => $dir) { @@ -612,4 +611,81 @@ class extensionModel extends model if(!@rmdir($dir)) return false; return true; } + + /** + * Check the file for repeat or changed + * + * @param string $moveFile + * @param string $extensionFile + * @access public + * @return object + */ + public function checkFile($extension,$type = 'repeat', $isCheck = true) + { + $return->result = 'ok'; + $return->error = ''; + if(!$isCheck) return $return; + + $extensionFiles = $this->getAllExtensionFile($extension); + $appRoot = $this->app->getAppRoot(); + foreach($extensionFiles as $extensionFile) + { + $compareFile = $appRoot . str_replace(realpath("ext/$extension") . '/', '', $extensionFile); + if(!file_exists($compareFile)) continue; + if($type =='repeat' and md5_file($extensionFile) == md5_file($compareFile)) $return->error .= $compareFile . '
'; + elseif($type =='change' and md5_file($extensionFile) != md5_file($compareFile)) $return->error .= $compareFile . '
'; + } + if($return->error != '') $return->result = 'fail'; + return $return; + } + + /** + * Get all extension files + * + * @param string $extension + * @access public + * @return array + */ + public function getAllExtensionFile($extension) + { + $extensionDir = "ext/$extension/"; + $files = $this->getFile($extensionDir, array('db', 'doc')); + return $files; + + } + + /** + * Foreach the dir's files + * + * @param string $dir + * @param array $exceptions + * @access private + * @return array + */ + private function getFile($dir, $exceptions = array()) + { + static $files = array(); + + if(!is_dir($dir)) return $files; + + $dir = realpath($dir) . '/'; + $entries = scandir($dir); + + foreach($entries as $entry) + { + if($entry == '.' or $entry == '..') continue; + if(in_array($entry, $exceptions)) continue; + $fullEntry = $dir . $entry; + if(is_file($fullEntry)) + { + $files[] = $dir . $entry; + } + else + { + $nextDir = $dir . $entry; + $this->getFile($nextDir); + } + } + return $files; + } } diff --git a/module/extension/view/activate.html.php b/module/extension/view/activate.html.php index a3c58cd27c..c86f4a0655 100644 --- a/module/extension/view/activate.html.php +++ b/module/extension/view/activate.html.php @@ -15,10 +15,17 @@ title;?> - {$header->title}"; - echo "

" . html::commonButton($lang->extension->viewInstalled, 'onclick=parent.location.href="' . inlink('browse', 'type=installed') . '"') . '

'; - ?> + return == 'fail') + { + echo $return->error; + } + else + { + echo "

{$header->title}

"; + echo "

" . html::commonButton($lang->extension->viewInstalled, 'onclick=parent.location.href="' . inlink('browse', 'type=installed') . '"') . '

'; + } + ?> diff --git a/module/extension/view/deactivate.html.php b/module/extension/view/deactivate.html.php index b89d206c58..32734f44d4 100644 --- a/module/extension/view/deactivate.html.php +++ b/module/extension/view/deactivate.html.php @@ -15,15 +15,22 @@ title;?> - return == 'fail') +{ + echo $return->removeCommands; +} +else +{ echo "

{$header->title}

"; - if($removeCommands) + if($return->removeCommands) { echo "

{$lang->extension->unremovedFiles}

"; - echo join($removeCommands, '
'); + echo join($retrun->removeCommands, '
'); } echo "

" . html::commonButton($lang->extension->viewDeactivated, 'onclick=parent.location.href="' . inlink('browse', 'type=deactivated') . '"') . '

'; - ?> +} +?> diff --git a/module/extension/view/uninstall.html.php b/module/extension/view/uninstall.html.php index 962ce178f1..37dfe178f6 100644 --- a/module/extension/view/uninstall.html.php +++ b/module/extension/view/uninstall.html.php @@ -14,16 +14,24 @@ -
title;?>
- {$header->title}"; - if($removeCommands) - { - echo "

{$lang->extension->unremovedFiles}

"; - echo join($removeCommands, '
'); - } - echo "

" . html::commonButton($lang->extension->viewAvailable, 'onclick=parent.location.href="' . inlink('browse', 'type=available') . '"') . '

'; - ?> +
+ return == 'fail') + { + echo $return->removeCommands; + } + else + { + echo "

{$header->title}

"; + if($return->removeCommands) + { + echo "

{$lang->extension->unremovedFiles}

"; + echo join($retrun->removeCommands, '
'); + } + echo "

" . html::commonButton($lang->extension->viewAvailable, 'onclick=parent.location.href="' . inlink('browse', 'type=available') . '"') . '

'; + } + + ?>