禅道3.0.beta1插件安装清除文件bug补丁下载!
转贴今天收到3群飞鸟网友的反馈,发现禅道3.0.beta1安装插件的时候,会把其所在分区的文件误删。这是一个非常严重的bug,感谢飞鸟网友的反馈,也非常抱歉,给大家造成不便和损失。
这个bug的缘由如下:
禅道插件安装的机制是从我们的网站下载插件包,然后将其解压缩到module/extension/ext目录下面。这样存在一个问题就是同一个插件的新版本安装的时候,也会解压缩到同样的目录,然后再拷贝到对应的目录里面去。这样就无法保证新版本插件安装时的目录和文件的纯粹性,因为可能还包含了老版本插件已经不再使用的文件或者目录。所以我们在3.0.beta1里面在安装插件之前,就增加了一个逻辑,先把extension/ext/xxx目录删掉。问题就出现在这个代码逻辑里面:
代码:module/extension/model.php
505 public function extractPackage($extension)
506 {
507 $return->result = 'ok';
508 $return->error = '';
509
510 /* try remove pre extracted files. */
511 $extensionPath = "ext/$extension";
512 $this->classFile->removeDir($extensionPath);
问题就出现在511行,如果是新安装一个插件的时候,ext/$extension这个目录其实不并存在,file.class.php里面的removeDir()方法会先尝试将传入的删除目录取realpath,然后再进行删除。而php里面的realpath方法对一个不存在的目录返回值为空,结果就变成了删除根目录。
我们平时的开发机都是在linux下面。linux下面的权限机制还是非常完善的,虽然是错误的操作,但其实并没有任何影响,所以就没有呈现不良的结果。但在windows下面,问题就出现了。apache运行所用的帐号往往是当前登录的帐号,就给删掉了。
如何解决这个bug呢,请下载附件里面的model.php,将其覆盖到禅道的model/extension/model.php,就可以了。
教训:
1. 不测试的代码肯定会有错误!
2. 跨平台的测试尤其关键。
3. 还是linux好。:)
再次向大家表示歉意,希望大家能够谅解。
禅道开发团队 2012年1月10日
- model.php.txt
3398MD5