123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656 |
- <?php if(!defined('DEDEINC')) exit("Request Error!");
- /**
- * 织梦模块类
- *
- * @version $Id: dedemodule.class.php 1 10:31 2010年7月6日Z tianya $
- * @package DedeCMS.Libraries
- * @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
- * @license http://help.dedecms.com/usersguide/license.html
- * @link http://www.dedecms.com
- */
- require_once(DEDEINC.'/charset.func.php');
- require_once(DEDEINC.'/dedeatt.class.php');
- require_once(DEDEINC.'/dedehttpdown.class.php');
- class DedeModule
- {
- var $modulesPath;
- var $modulesUrl;
- var $modules;
- var $fileListNames;
- var $sysLang;
- var $moduleLang;
- function __construct($modulespath='',$modulesUrl='')
- {
- global $cfg_soft_lang;
- $this->sysLang = $this->moduleLang = $cfg_soft_lang;
- $this->fileListNames = array();
- $this->modulesPath = $modulespath;
- $this->modulesUrl = $modulesUrl;
- }
- function DedeModule($modulespath='')
- {
- $this->__construct($modulespath);
- }
- /**
- * 枚举系统里已经存在的模块(缓存功能实际上只作hash与文件名的解析,在此不特别处理)
- *
- * @access public
- * @param string $moduletype 模块类型
- * @return string
- */
- function GetModuleList($moduletype='')
- {
- if(is_array($this->modules)) return $this->modules;
- $dh = dir($this->modulesPath) or die("没找到模块目录:({$this->modulesPath})!");
- $fp = @fopen($this->modulesPath.'/modulescache.php','w') or die('读取文件权限出错,目录文件'.$this->modulesPath.'/modulescache.php不可写!');
- fwrite($fp, "<"."?php\r\n");
- fwrite($fp, "global \$allmodules;\r\n");
- while($filename = $dh->read())
- {
- if(preg_match("/\.xml$/i", $filename))
- {
- $minfos = $this->GetModuleInfo(str_replace('.xml','',$filename));
- if(isset($minfos['moduletype']) && $moduletype!='' && $moduletype!=$minfos['moduletype'])
- {
- continue;
- }
- if($minfos['hash']!='')
- {
- $this->modules[$minfos['hash']] = $minfos;
- fwrite($fp, '$'."GLOBALS['allmodules']['{$minfos['hash']}']='{$filename}';\r\n");
- }
- }
- }
- fwrite($fp,'?'.'>');
- fclose($fp);
- $dh->Close();
- return $this->modules;
- }
- /**
- * 从远程获取模块信息
- *
- * @access public
- * @param string $moduletype 模块类型
- * @return string
- */
- function GetModuleUrlList($moduletype='',$url='')
- {
- $dh = dir($this->modulesPath) or die("没找到模块目录:({$this->modulesPath})!");
- $fp = @fopen($this->modulesPath.'/modulescache.php','w') or die('读取文件权限出错,目录文件'.$this->modulesPath.'/modulescache.php不可写!');
- $cachefile = DEDEDATA.'/module/moduleurllist.txt';
- $remotelist = '';
- if(file_exists($cachefile) && (filemtime($cachefile) + 60 * 30) > time())
- {
- // 30分钟本地缓存一次
- $remotelist = file_get_contents($cachefile);
- } else {
- $del = new DedeHttpDown();
- $del->OpenUrl($url);
- $remotelist = $del->GetHtml();
- PutFile($cachefile, $remotelist);
- }
- if(empty($remotelist)) return false;
-
- $modules = unserialize($remotelist);
- if(empty($moduletype)){
- return $modules;
- }
- $return = array();
- foreach($modules as $arrow=>$data) {
- if($data['moduletype']==$moduletype)
- $return[] = $data;
- }
- return $return;
- }
- /**
- * 转换编码
- *
- * @access public
- * @param string $str 字符串
- * @return string
- */
- function AppCode(&$str)
- {
- if($this->moduleLang==$this->sysLang)
- {
- return $str;
- }
- else
- {
- if($this->sysLang=='utf-8')
- {
- if($this->moduleLang=='gbk') return gb2utf8($str);
- if($this->moduleLang=='big5') return gb2utf8(big52gb($str));
- }
- else if($this->sysLang=='gbk')
- {
- if($this->moduleLang=='utf-8') return utf82gb($str);
- if($this->moduleLang=='big5') return big52gb($str);
- }
- else if($this->sysLang=='big5')
- {
- if($this->moduleLang=='utf-8') return gb2big5(utf82gb($str));
- if($this->moduleLang=='gbk') return gb2big5($str);
- }
- else
- {
- return $str;
- }
- }
- }
- /**
- * 获得指定hash的模块文件
- *
- * @access public
- * @param string $hash hash文件
- * @return string
- */
- function GetHashFile($hash)
- {
- include_once($this->modulesPath.'/modulescache.php');
- if(isset($GLOBALS['allmodules'][$hash])) return $GLOBALS['allmodules'][$hash];
- else return $hash.'.xml';
- }
- /**
- * 获得某模块的基本信息
- *
- * @access public
- * @param string $hash hash
- * @param string $ftype 文件类型
- * @return string
- */
- function GetModuleInfo($hash, $ftype='hash')
- {
- if($ftype=='file') $filename = $hash;
- else if(!empty($this->modulesUrl)) {
- $filename = $this->modulesUrl.$hash.'.xml';
- }else $filename = $this->modulesPath.'/'.$this->GetHashFile($hash);
- $start = 0;
- $minfos = array();
- $minfos['name']=$minfos['team']=$minfos['time']=$minfos['email']=$minfos['url']='';
- $minfos['hash']=$minfos['indexname']=$minfos['indexurl']='';
- $minfos['ismember']=$minfos['autosetup']=$minfos['autodel']=0;
- //$minfos['filename'] = $filename;
- if(empty($this->modulesUrl)){
- $minfos['filesize'] = filesize($filename)/1024;
- $minfos['filesize'] = number_format($minfos['filesize'],2,'.','').' Kb';
- }
- $fp = fopen($filename,'r') or die("文件 {$filename} 不存在或不可读!");
- $n = 0;
- while(!feof($fp))
- {
- $n++;
- if($n > 30) break;
- $line = fgets($fp,256);
- if($start==0)
- { if(preg_match("/<baseinfo/is",$line)) $start = 1; }
- else
- {
- if(preg_match("/<\/baseinfo/is",$line)) break;
- $line = trim($line);
- list($skey,$svalue) = explode('=',$line);
- $skey = trim($skey);
- $minfos[$skey] = $svalue;
- }
- }
- fclose($fp);
- if(isset($minfos['lang'])) $this->moduleLang = trim($minfos['lang']);
- else $this->moduleLang = 'gbk';
- if($this->sysLang=='gb2312') $this->sysLang = 'gbk';
- if($this->moduleLang=='gb2312') $this->moduleLang = 'gbk';
- if($this->sysLang != $this->moduleLang)
- {
- foreach($minfos as $k=>$v) $minfos[$k] = $this->AppCode($v);
- }
- return $minfos;
- }
- /**
- * 获得某模块的基本信息
- *
- * @access public
- * @param string $hash hash
- * @param string $ftype 文件类型
- * @return string
- */
- function GetFileXml($hash, $ftype='hash')
- {
- if($ftype=='file') $filename = $hash;
- else $filename = $this->modulesPath.'/'.$this->GetHashFile($hash);
- $filexml = '';
- $fp = fopen($filename,'r') or die("文件 {$filename} 不存在或不可读!");
- $start = 0;
- while(!feof($fp))
- {
- $line = fgets($fp,1024);
- if($start==0)
- {
- if(preg_match("/<modulefiles/is",$line))
- {
- $filexml .= $line;
- $start = 1;
- }
- continue;
- }
- else
- {
- $filexml .= $line;
- }
- }
- fclose($fp);
- return $filexml;
- }
- /**
- * 获得系统文件的内容
- * 指安装、删除、协议文件
- *
- * @access public
- * @param string $hashcode hash码
- * @param string $ntype 文件类型
- * @param string $enCode 是否加密
- * @return string
- */
- function GetSystemFile($hashcode, $ntype, $enCode=TRUE)
- {
- $this->GetModuleInfo($hashcode,$ntype);
- $start = FALSE;
- $filename = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
- $fp = fopen($filename,'r') or die("文件 {$filename} 不存在或不可读!");
- $okdata = '';
- while(!feof($fp))
- {
- $line = fgets($fp,1024);
- if(!$start)
- {
- // 2011-6-7 修复模块打包程序中上传安装程序生成为空白文件(by:华强)
- if(preg_match("#<{$ntype}>#i", $line)) $start = TRUE;
- }
- else
- {
- if(preg_match("#<\/{$ntype}#i", $line)) break;
- $okdata .= $line;
- unset($line);
- }
- }
- fclose($fp);
- $okdata = trim($okdata);
- if(!empty($okdata) && $enCode) $okdata = base64_decode($okdata);
- $okdata = $this->AppCode($okdata);
- return $okdata;
- }
- /**
- * 把某系统文件转换为文件
- *
- * @access public
- * @param string $hashcode hash码
- * @param string $ntype 文件类型
- * @return string 返回文件名
- */
- function WriteSystemFile($hashcode, $ntype)
- {
- $filename = $hashcode."-{$ntype}.php";
- $fname = $this->modulesPath.'/'.$filename;
- $filect = $this->GetSystemFile($hashcode,$ntype);
- $fp = fopen($fname,'w') or die('生成 {$ntype} 文件失败!');
- fwrite($fp,$filect);
- fclose($fp);
- return $filename;
- }
- /**
- * 删除系统文件
- *
- * @access public
- * @param string $hashcode hash码
- * @param string $ntype 文件类型
- * @return void
- */
- function DelSystemFile($hashcode,$ntype)
- {
- $filename = $this->modulesPath.'/'.$hashcode."-{$ntype}.php";
- unlink($filename);
- }
- /**
- * 检查是否已经存在指定的模块
- *
- * @access public
- * @param string $hashcode hash码
- * @return bool 如果存在则返回True,否则为False
- */
- function HasModule($hashcode)
- {
- $modulefile = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
- if(file_exists($modulefile) && !is_dir($modulefile)) return TRUE;
- else return FALSE;
- }
- /**
- * 读取文件,返回编码后的文件内容
- *
- * @access public
- * @param string $filename 文件名
- * @param string $isremove 是否删除
- * @return string
- */
- function GetEncodeFile($filename,$isremove=FALSE)
- {
- $fp = fopen($filename,'r') or die("文件 {$filename} 不存在或不可读!");
- $str = @fread($fp,filesize($filename));
- fclose($fp);
- if($isremove) @unlink($filename);
- if(!empty($str)) return base64_encode($str);
- else return '';
- }
- /**
- * 获取模块包里的文件名列表
- *
- * @access public
- * @param string $hashcode hash码
- * @return string 返回文件列表
- */
- function GetFileLists($hashcode)
- {
- $dap = new DedeAttParse();
- $filelists = array();
- $modulefile = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
- $fp = fopen($modulefile,'r') or die("文件 {$modulefile} 不存在或不可读!");
- $i = 0;
- while(!feof($fp))
- {
- $line = fgets($fp,1024);
- if(preg_match("/^[\s]{0,}<file/i",$line))
- {
- $i++;
- $line = trim(preg_replace("/[><]/","",$line));
- $dap->SetSource($line);
- $filelists[$i]['type'] = $dap->CAtt->GetAtt('type');
- $filelists[$i]['name'] = $dap->CAtt->GetAtt('name');
- }
- }
- fclose($fp);
- return $filelists;
- }
- /**
- * 删除已安装模块附带的文件
- *
- * @access public
- * @param string $hashcode hash码
- * @param string $isreplace 是否替换
- * @return string
- */
- function DeleteFiles($hashcode,$isreplace=0)
- {
- if($isreplace==0) return TRUE;
- else
- {
- $dap = new DedeAttParse();
- $modulefile = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
- $fp = fopen($modulefile,'r') or die("文件 {$modulefile} 不存在或不可读!");
- $i = 0;
- $dirs = '';
- while(!feof($fp))
- {
- $line = fgets($fp,1024);
- if(preg_match("/^[\s]{0,}<file/i",$line))
- {
- $i++;
- $line = trim(preg_replace("/[><]/","",$line));
- $dap->SetSource($line);
- $filetype = $dap->CAtt->GetAtt('type');
- $filename = $dap->CAtt->GetAtt('name');
- $filename = str_replace("\\","/",$filename);
- if($filetype=='dir'){ $dirs[] = $filename; }
- else{ @unlink($filename); }
- }
- }
- $okdirs = array();
- if(is_array($dirs)){
- $st = count($dirs) -1;
- for($i=$st;$i>=0;$i--){ @rmdir($dirs[$i]); }
- }
- fclose($fp);
- }
- return TRUE;
- }
- /**
- * 把模块包里的文件写入服务器
- *
- * @access public
- * @param string $hashcode hash码
- * @param string $isreplace 是否替换
- * @return string
- */
- function WriteFiles($hashcode, $isreplace=3)
- {
- global $AdminBaseDir;
- $dap = new DedeAttParse();
- $modulefile = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
- $fp = fopen($modulefile,'r') or die("文件 {$modulefile} 不存在或不可读!");
- $i = 0;
- while(!feof($fp))
- {
- $line = fgets($fp,1024);
- if( preg_match("/^[\s]{0,}<file/i",$line) )
- {
- $i++;
- $line = trim(preg_replace("/[><]/","",$line));
- $dap->SetSource($line);
- $filetype = $dap->CAtt->GetAtt('type');
- $filename = $dap->CAtt->GetAtt('name');
- $filename = str_replace("\\","/",$filename);
- if(!empty($AdminBaseDir)) $filename = $AdminBaseDir.$filename;
- if($filetype=='dir')
- {
- if(!is_dir($filename))
- {
- @mkdir($filename,$GLOBALS['cfg_dir_purview']);
- }
- @chmod($filename,$GLOBALS['cfg_dir_purview']);
- }
- else
- {
- $this->TestDir($filename);
- if($isreplace==0) continue;
- if($isreplace==3)
- {
- if(is_file($filename))
- {
- $copyname = @preg_replace("/([^\/]{1,}$)/","bak-$1",$filename);
- @copy($filename,$copyname);
- }
- }
- if(!empty($filename))
- {
- $fw = fopen($filename,'w') or die("写入文件 {$filename} 失败,请检查相关目录的权限!");
- $ct = '';
- while(!feof($fp))
- {
- $l = fgets($fp,1024);
- if(preg_match("/^[\s]{0,}<\/file/i",trim($l))){ break; }
- $ct .= $l;
- }
- $ct = base64_decode($ct);
- if($this->sysLang!=$this->moduleLang)
- {
- //转换内码
- if(preg_match('/\.(xml|php|inc|txt|htm|html|shtml|tpl|css)$/', $filename))
- {
- $ct = $this->AppCode($ct);
- }
- //转换HTML编码标识
- if(preg_match('/\.(php|htm|html|shtml|inc|tpl)$/i', $filename))
- {
- if($this->sysLang=='big5') $charset = 'charset=big5';
- else if($this->sysLang=='utf-8') $charset = 'charset=gb2312';
- else $charset = 'charset=gb2312';
- $ct = preg_match("/charset=([a-z0-9-]*)/i", $charset, $ct);
- }
- }
- fwrite($fw,$ct);
- fclose($fw);
- }
- }
- }
- }
- fclose($fp);
- return TRUE;
- }
- /**
- * 测试某文件的文件夹是否创建
- *
- * @access public
- * @param string $filename 文件名称
- * @return string
- */
- function TestDir($filename)
- {
- $fs = explode('/',$filename);
- $fn = count($fs) - 1 ;
- $ndir = '';
- for($i=0;$i < $fn;$i++)
- {
- if($ndir!='') $ndir = $ndir.'/'.$fs[$i];
- else $ndir = $fs[$i];
- $rs = @is_dir($ndir);
- if( !$rs ) {
- @mkdir($ndir,$GLOBALS['cfg_dir_purview']);
- @chmod($ndir,$GLOBALS['cfg_dir_purview']);
- }
- }
- return TRUE;
- }
- /**
- * 获取某个目录或文件的打包数据
- *
- * @access public
- * @param string $basedir 基本目录
- * @param string $f
- * @param string $fp 文件指针
- * @return bool
- */
- function MakeEncodeFile($basedir,$f,$fp)
- {
- $this->fileListNames = array();
- $this->MakeEncodeFileRun($basedir,$f,$fp);
- return TRUE;
- }
- /**
- * 测试目标文件
- *
- * @access public
- * @param string $basedir 基本目录
- * @param string $f
- * @return bool
- */
- function MakeEncodeFileTest($basedir,$f)
- {
- $this->fileListNames = array();
- $this->MakeEncodeFileRunTest($basedir,$f);
- return TRUE;
- }
- /**
- * 检测某个目录或文件的打包数据,递归
- *
- * @access public
- * @param string $basedir 基本目录
- * @param string $f
- * @return void
- */
- function MakeEncodeFileRunTest($basedir,$f)
- {
- $filename = $basedir.'/'.$f;
- if(isset($this->fileListNames[$f])) return;
- else if(preg_match("/Thumbs\.db/i",$f)) return;
- else $this->fileListNames[$f] = 1;
- $fileList = '';
- if(!file_exists($filename))
- {
- ShowMsg("文件或文件夹: {$filename} 不存在,无法进行编译!","-1");
- exit();
- }
- if(is_dir($filename))
- {
- $dh = dir($filename);
- while($filename = $dh->read())
- {
- if($filename[0]=='.' || strtolower($filename)=='cvs') continue;
- $nfilename = $f.'/'.$filename;
- $this->MakeEncodeFileRunTest($basedir,$nfilename);
- }
- }
- }
- /**
- * 获取个目录或文件的打包数据,递归
- *
- * @access public
- * @param string $basedir 基本目录
- * @param string $f
- * @param string $fp 文件指针
- * @return string
- */
- function MakeEncodeFileRun($basedir,$f,$fp)
- {
- $filename = $basedir.'/'.$f;
- if(isset($this->fileListNames[$f])) return;
- else if(preg_match("#Thumbs\.db#i", $f)) return;
- else $this->fileListNames[$f] = 1;
- $fileList = '';
- if(is_dir($filename))
- {
- $fileList .= "<file type='dir' name='$f'>\r\n";
- $fileList .= "</file>\r\n";
- fwrite($fp,$fileList);
- $dh = dir($filename);
- while($filename = $dh->read())
- {
- if($filename[0]=='.' || strtolower($filename)=='cvs') continue;
- $nfilename = $f.'/'.$filename;
- $this->MakeEncodeFileRun($basedir,$nfilename,$fp);
- }
- }
- else
- {
- $fileList .= "<file type='file' name='$f'>\r\n";
- $fileList .= $this->GetEncodeFile($filename);
- $fileList .= "\r\n</file>\r\n";
- fwrite($fp,$fileList);
- }
- }
- /**
- * 清理
- *
- * @access public
- * @return void
- */
- function Clear()
- {
- unset($this->modules);
- unset($this->fileList);
- unset($this->fileListNames);
- }
- }//End Class
|