禅道3.0.beta1插件安装清除文件bug补丁下载!

转贴
摘要:今天收到3群飞鸟网友的反馈,发现禅道3.0.beta1安装插件的时候,会把其所在分区的...

今天收到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日

返回顶部
刘斌
高级客户经理
17685869372
526288068
统一服务热线 4006-8899-23
我要提问提问有任何问题,您都可以在这里提问。 问题反馈反馈点击这里,让我们聆听您的建议与反馈。