discuz_upgrade.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: discuz_upgrade.php 31992 2012-10-30 05:44:15Z zhangjie $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class discuz_upgrade {
  12. var $upgradeurl = 'http://upgrade.discuz.com/DiscuzX/';
  13. var $locale = 'SC';
  14. var $charset = 'GBK';
  15. public function fetch_updatefile_list($upgradeinfo) {
  16. $file = DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/updatelist.tmp';
  17. $upgradedataflag = true;
  18. $upgradedata = @file_get_contents($file);
  19. if(!$upgradedata) {
  20. $upgradedata = dfsockopen($this->upgradeurl.substr($upgradeinfo['upgradelist'], 0, -4).strtolower('_'.$this->locale.'_'.$this->charset).'.txt');
  21. $upgradedataflag = false;
  22. }
  23. $return = array();
  24. $upgradedataarr = explode("\r\n", $upgradedata);
  25. foreach($upgradedataarr as $k => $v) {
  26. if(!$v) {
  27. continue;
  28. }
  29. $return['file'][$k] = trim(substr($v, 34));
  30. $return['md5'][$k] = substr($v, 0, 32);
  31. if(trim(substr($v, 32, 2)) != '*') {
  32. @unlink($file);
  33. return array();
  34. }
  35. }
  36. if(!$upgradedataflag) {
  37. $this->mkdirs(dirname($file));
  38. $fp = fopen($file, 'w');
  39. if(!$fp) {
  40. return array();
  41. }
  42. fwrite($fp, $upgradedata);
  43. }
  44. return $return;
  45. }
  46. public function compare_basefile($upgradeinfo, $upgradefilelist) {
  47. if(!$discuzfiles = @file('./source/admincp/discuzfiles.md5')) {
  48. return array();
  49. }
  50. $newupgradefilelist = array();
  51. foreach($upgradefilelist as $v) {
  52. $newupgradefilelist[$v] = md5_file(DISCUZ_ROOT.'./'.$v);
  53. }
  54. $modifylist = $showlist = $searchlist = array();
  55. foreach($discuzfiles as $line) {
  56. $file = trim(substr($line, 34));
  57. $md5datanew[$file] = substr($line, 0, 32);
  58. if(isset($newupgradefilelist[$file])) {
  59. if($md5datanew[$file] != $newupgradefilelist[$file]) {
  60. if(!$upgradeinfo['isupdatetemplate'] && preg_match('/\.htm$/i', $file)) {
  61. $ignorelist[$file] = $file;
  62. $searchlist[] = "\r\n".$file;
  63. continue;
  64. }
  65. $modifylist[$file] = $file;
  66. } else {
  67. $showlist[$file] = $file;
  68. }
  69. }
  70. }
  71. if($searchlist) {
  72. $file = DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/updatelist.tmp';
  73. $upgradedata = file_get_contents($file);
  74. $upgradedata = str_replace($searchlist, '', $upgradedata);
  75. $fp = fopen($file, 'w');
  76. if($fp) {
  77. fwrite($fp, $upgradedata);
  78. }
  79. }
  80. return array($modifylist, $showlist, $ignorelist);
  81. }
  82. public function compare_file_content($file, $remotefile) {
  83. if(!preg_match('/\.php$|\.htm$/i', $file)) {
  84. return false;
  85. }
  86. $content = preg_replace('/\s/', '', file_get_contents($file));
  87. $ctx = stream_context_create(array('http' => array('timeout' => 60)));
  88. $remotecontent = preg_replace('/\s/', '', file_get_contents($remotefile, false, $ctx));
  89. if(strcmp($content, $remotecontent)) {
  90. return false;
  91. } else {
  92. return true;
  93. }
  94. }
  95. public function check_upgrade() {
  96. include_once libfile('class/xml');
  97. include_once libfile('function/cache');
  98. $return = false;
  99. $upgradefile = $this->upgradeurl.$this->versionpath().'/'.DISCUZ_RELEASE.'/upgrade.xml';
  100. $response = xml2array(dfsockopen($upgradefile));
  101. if(isset($response['cross']) || isset($response['patch'])) {
  102. C::t('common_setting')->update('upgrade', $response);
  103. $return = true;
  104. } else {
  105. C::t('common_setting')->update('upgrade', '');
  106. $return = false;
  107. }
  108. updatecache('setting');
  109. return $return;
  110. }
  111. public function check_folder_perm($updatefilelist) {
  112. foreach($updatefilelist as $file) {
  113. if(!file_exists(DISCUZ_ROOT.$file)) {
  114. if(!$this->test_writable(dirname(DISCUZ_ROOT.$file))) {
  115. return false;
  116. }
  117. } else {
  118. if(!is_writable(DISCUZ_ROOT.$file)) {
  119. return false;
  120. }
  121. }
  122. }
  123. return true;
  124. }
  125. public function test_writable($dir) {
  126. $writeable = 0;
  127. $this->mkdirs($dir);
  128. if(is_dir($dir)) {
  129. if($fp = @fopen("$dir/test.txt", 'w')) {
  130. @fclose($fp);
  131. @unlink("$dir/test.txt");
  132. $writeable = 1;
  133. } else {
  134. $writeable = 0;
  135. }
  136. }
  137. return $writeable;
  138. }
  139. public function download_file($upgradeinfo, $file, $folder = 'upload', $md5 = '', $position = 0, $offset = 0) {
  140. $dir = DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/';
  141. $this->mkdirs(dirname($dir.$file));
  142. $downloadfileflag = true;
  143. if(!$position) {
  144. $mode = 'wb';
  145. } else {
  146. $mode = 'ab';
  147. }
  148. $fp = fopen($dir.$file, $mode);
  149. if(!$fp) {
  150. return 0;
  151. }
  152. $response = dfsockopen($this->upgradeurl.$upgradeinfo['latestversion'].'/'.$upgradeinfo['latestrelease'].'/'.$this->locale.'_'.$this->charset.'/'.$folder.'/'.$file.'sc', $offset, '', '', FALSE, '', 120, TRUE, 'URLENCODE', FALSE, $position);
  153. if($response) {
  154. if($offset && strlen($response) == $offset) {
  155. $downloadfileflag = false;
  156. }
  157. fwrite($fp, $response);
  158. }
  159. fclose($fp);
  160. if($downloadfileflag) {
  161. if(md5_file($dir.$file) == $md5) {
  162. return 2;
  163. } else {
  164. return 0;
  165. }
  166. } else {
  167. return 1;
  168. }
  169. }
  170. public function mkdirs($dir) {
  171. if(!is_dir($dir)) {
  172. if(!self::mkdirs(dirname($dir))) {
  173. return false;
  174. }
  175. if(!@mkdir($dir, 0777)) {
  176. return false;
  177. }
  178. @touch($dir.'/index.htm'); @chmod($dir.'/index.htm', 0777);
  179. }
  180. return true;
  181. }
  182. public function copy_file($srcfile, $desfile, $type) {
  183. global $_G;
  184. if(!is_file($srcfile)) {
  185. return false;
  186. }
  187. if($type == 'file') {
  188. $this->mkdirs(dirname($desfile));
  189. copy($srcfile, $desfile);
  190. } elseif($type == 'ftp') {
  191. $siteftp = $_GET['siteftp'];
  192. $siteftp['on'] = 1;
  193. $siteftp['password'] = authcode($siteftp['password'], 'ENCODE', md5($_G['config']['security']['authkey']));
  194. $ftp = & discuz_ftp::instance($siteftp);
  195. $ftp->connect();
  196. $ftp->upload($srcfile, $desfile);
  197. if($ftp->error()) {
  198. return false;
  199. }
  200. }
  201. return true;
  202. }
  203. public function versionpath() {
  204. $versionpath = '';
  205. foreach(explode(' ', substr(DISCUZ_VERSION, 1)) as $unit) {
  206. $versionpath = $unit;
  207. break;
  208. }
  209. return $versionpath;
  210. }
  211. function copy_dir($srcdir, $destdir) {
  212. $dir = @opendir($srcdir);
  213. while($entry = @readdir($dir)) {
  214. $file = $srcdir.$entry;
  215. if($entry != '.' && $entry != '..') {
  216. if(is_dir($file)) {
  217. self::copy_dir($file.'/', $destdir.$entry.'/');
  218. } else {
  219. self::mkdirs(dirname($destdir.$entry));
  220. copy($file, $destdir.$entry);
  221. }
  222. }
  223. }
  224. closedir($dir);
  225. }
  226. function rmdirs($srcdir) {
  227. $dir = @opendir($srcdir);
  228. while($entry = @readdir($dir)) {
  229. $file = $srcdir.$entry;
  230. if($entry != '.' && $entry != '..') {
  231. if(is_dir($file)) {
  232. self::rmdirs($file.'/');
  233. } else {
  234. @unlink($file);
  235. }
  236. }
  237. }
  238. closedir($dir);
  239. rmdir($srcdir);
  240. }
  241. }
  242. ?>