PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/source/admincp/admincp_cloudaddons.php

https://github.com/jinbo51/DiscuzX
PHP | 209 lines | 194 code | 9 blank | 6 comment | 58 complexity | e2a3d817147df44e1cea5a2902dba439 MD5 | raw file
Possible License(s): BSD-3-Clause
  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: admincp_cloudaddons.php 33369 2013-06-03 05:00:29Z andyzheng $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9. exit('Access Denied');
  10. }
  11. require_once libfile('function/cloudaddons');
  12. cpheader();
  13. if(!$admincp->isfounder) {
  14. cpmsg('noaccess_isfounder', '', 'error');
  15. }
  16. if(!$operation) {
  17. cloudaddons_check();
  18. shownav('cloudaddons');
  19. $extra = '';
  20. if(!empty($_GET['id'])) {
  21. $extra .= '&mod=app&ac=item&id='.rawurlencode($_GET['id']);
  22. }
  23. if(!empty($_GET['extra'])) {
  24. $extra .= '&'.addslashes($_GET['extra']);
  25. }
  26. $url = cloudaddons_url($extra);
  27. echo '<script type="text/javascript">location.href=\''.$url.'\';</script>';
  28. } elseif($operation == 'download') {
  29. $step = intval($_GET['step']);
  30. $addoni = intval($_GET['i']);
  31. $uniqueid = $_G['setting']['siteuniqueid'] ? $_G['setting']['siteuniqueid'] : C::t('common_setting')->fetch('siteuniqueid');
  32. if(!$_GET['md5hash'] || md5($_GET['addonids'].md5($uniqueid.$_GET['timestamp'])) != $_GET['md5hash']) {
  33. cpmsg('cloudaddons_validator_error', '', 'error');
  34. }
  35. $addonids = explode(',', $_GET['addonids']);
  36. list($_GET['key'], $_GET['type'], $_GET['rid']) = explode('.', isset($addonids[$addoni]) ? $addonids[$addoni] : $addonids[0]);
  37. if($step == 0) {
  38. cpmsg('cloudaddons_downloading', "action=cloudaddons&operation=download&addonids=$_GET[addonids]&i=$addoni&step=1&md5hash=".$_GET['md5hash'].'&timestamp='.$_GET['timestamp'], 'loading', array('addonid' => $_GET['key'].'.'.$_GET['type']), '<div>0%</div>', FALSE);
  39. } elseif($step == 1) {
  40. $packnum = isset($_GET['num']) ? $_GET['num'] : 0;
  41. $tmpdir = DISCUZ_ROOT.'./data/download/'.$_GET['rid'];
  42. $end = '';
  43. $md5tmp = DISCUZ_ROOT.'./data/download/'.$_GET['rid'].'.md5';
  44. if($packnum) {
  45. list($md5total, $md5s) = unserialize(implode('', @file($md5tmp)));
  46. dmkdir($tmpdir, 0777, false);
  47. } else {
  48. dir_clear($tmpdir);
  49. @unlink($md5tmp);
  50. dmkdir($tmpdir, 0777, false);
  51. $md5total = '';
  52. $md5s = array();
  53. }
  54. $data = cloudaddons_open('&mod=app&ac=download&rid='.$_GET['rid'].'&packnum='.$packnum);
  55. $_GET['importtxt'] = $data;
  56. $array = getimportdata('Discuz! File Pack');
  57. if(!$array['Status']) {
  58. list($_cur, $_max) = explode('/', $array['part']);
  59. $percent = intval($_cur/$_max * 100);
  60. if($array['type'] != $_GET['type'] || $array['key'] != $_GET['key'] || !$array['files']) {
  61. dir_clear($tmpdir);
  62. @unlink($md5tmp);
  63. cloudaddons_faillog($_GET['rid'], 100);
  64. cpmsg('cloudaddons_download_error', '', 'error', array('ErrorCode' => 100));
  65. }
  66. foreach($array['files'] as $file => $data) {
  67. $filename = $tmpdir.'/'.$file.'._addons_';
  68. $dirname = dirname($filename);
  69. dmkdir($dirname, 0777, false);
  70. $fp = fopen($filename, !$data['Part'] ? 'w' : 'a');
  71. if(!$fp) {
  72. dir_clear($tmpdir);
  73. @unlink($md5tmp);
  74. cloudaddons_faillog($_GET['rid'], 101);
  75. cpmsg('cloudaddons_download_write_error', '', 'error');
  76. }
  77. fwrite($fp, gzuncompress(base64_decode($data['Data'])));
  78. fclose($fp);
  79. if($data['MD5']) {
  80. $md5total .= $data['MD5'];
  81. $md5s[$filename] = $data['MD5'];
  82. }
  83. }
  84. $fp = fopen($md5tmp, 'w');
  85. fwrite($fp, serialize(array($md5total, $md5s)));
  86. fclose($fp);
  87. } elseif($array['Status'] == 'Error') {
  88. dir_clear($tmpdir);
  89. @unlink($md5tmp);
  90. cloudaddons_faillog($_GET['rid'], $array['ErrorCode']);
  91. cpmsg('cloudaddons_install_error', '', 'error', array('ErrorCode' => $array['ErrorCode']));
  92. } else {
  93. foreach($md5s as $file => $md5) {
  94. if($md5 != md5_file($file)) {
  95. dir_clear($tmpdir);
  96. @unlink($md5tmp);
  97. cloudaddons_faillog($_GET['rid'], 102);
  98. cpmsg('cloudaddons_download_error', '', 'error', array('ErrorCode' => 102));
  99. }
  100. }
  101. @unlink($md5tmp);
  102. $end = rawurlencode(cloudaddons_http_build_query($array));
  103. }
  104. if(!$end) {
  105. $packnum++;
  106. cpmsg('cloudaddons_downloading', "action=cloudaddons&operation=download&addonids=$_GET[addonids]&i=$addoni&step=1&md5hash=".$_GET['md5hash'].'&timestamp='.$_GET['timestamp'].'&num='.$packnum, 'loading', array('addonid' => $_GET['key'].'.'.$_GET['type']), '<div>'.$percent.'%</div>', FALSE);
  107. } else {
  108. if($md5total !== '' && md5($md5total) !== cloudaddons_md5($_GET['key'].'_'.$_GET['rid'])) {
  109. dir_clear($tmpdir);
  110. @unlink($md5tmp);
  111. cloudaddons_faillog($_GET['rid'], 105);
  112. cpmsg('cloudaddons_download_error', '', 'error', array('ErrorCode' => 105));
  113. }
  114. cpmsg('cloudaddons_installing', "action=cloudaddons&operation=download&addonids=$_GET[addonids]&i=$addoni&end=$end&step=2&md5hash=".$_GET['md5hash'].'&timestamp='.$_GET['timestamp'], 'loading', array('addonid' => $_GET['key'].'.'.$_GET['type']), FALSE);
  115. }
  116. } elseif($step == 2) {
  117. $tmpdir = DISCUZ_ROOT.'./data/download/'.$_GET['rid'];
  118. if(!file_exists($tmpdir)) {
  119. dir_clear($tmpdir);
  120. cloudaddons_faillog($_GET['rid'], 103);
  121. cpmsg('cloudaddons_download_error', '', 'error', array('ErrorCode' => 103));
  122. }
  123. $typedir = array(
  124. 'plugin' => 'source/plugin',
  125. 'template' => 'template',
  126. 'pack' => '.',
  127. );
  128. if(!$typedir[$_GET['type']]) {
  129. dir_clear($tmpdir);
  130. cloudaddons_faillog($_GET['rid'], 104);
  131. cpmsg('cloudaddons_download_error', '', 'error', array('ErrorCode' => 104));
  132. }
  133. if($_GET['type'] != 'pack') {
  134. $descdir = DISCUZ_ROOT.$typedir[$_GET['type']].'/';
  135. $subdir = $_GET['key'];
  136. } else {
  137. $descdir = DISCUZ_ROOT;
  138. $subdir = '';
  139. }
  140. $unwriteabledirs = cloudaddons_dirwriteable($descdir, $subdir, $tmpdir);
  141. if($unwriteabledirs) {
  142. if(!submitcheck('settingsubmit')) {
  143. showtips(cplang('cloudaddons_unwriteabledirs', array('basedir' => $typedir[$_GET['type']] != '.' ? $typedir[$_GET['type']] : '/', 'unwriteabledirs' => implode(', ', $unwriteabledirs))));
  144. siteftp_form("cloudaddons&operation=download&addonids=$_GET[addonids]&i=$addoni&end=".rawurlencode($_GET['end'])."&step=2&md5hash=".$_GET['md5hash'].'&timestamp='.$_GET['timestamp']);
  145. exit;
  146. } else {
  147. siteftp_check($_GET['siteftp'], $typedir[$_GET['type']]);
  148. }
  149. }
  150. $descdir .= $subdir;
  151. cloudaddons_comparetree($tmpdir, $descdir, $tmpdir, $_GET['key'].'.'.$_GET['type'], 1);
  152. if(!empty($_G['treeop']['oldchange']) && empty($_GET['confirmed'])) {
  153. cpmsg('cloudaddons_install_files_changed', '', 'form', array('files' => implode('<br />', $_G['treeop']['oldchange'])));
  154. }
  155. cloudaddons_copytree($tmpdir, $descdir);
  156. cloudaddons_savemd5($_GET['key'].'.'.$_GET['type'], $_GET['end'], $_G['treeop']['md5']);
  157. cloudaddons_deltree($tmpdir);
  158. if(count($addonids) - 1 > $addoni) {
  159. $addoni++;
  160. cpmsg('cloudaddons_downloading', "action=cloudaddons&operation=download&addonids=$_GET[addonids]&i=$addoni&step=1&md5hash=".$_GET['md5hash'].'&timestamp='.$_GET['timestamp'], 'loading', array('addonid' => $_GET['key'].'.'.$_GET['type']), FALSE);
  161. }
  162. list($_GET['key'], $_GET['type'], $_GET['rid']) = explode('.', $addonids[0]);
  163. cloudaddons_downloadlog($_GET['key'].'.'.$_GET['type']);
  164. if($_GET['type'] == 'plugin') {
  165. $plugin = C::t('common_plugin')->fetch_by_identifier($_GET['key']);
  166. if(!$plugin['pluginid']) {
  167. dheader('location: '.ADMINSCRIPT.'?action=plugins&operation=import&dir='.$_GET['key']);
  168. } else {
  169. dheader('location: '.ADMINSCRIPT.'?action=plugins&operation=upgrade&pluginid='.$plugin['pluginid']);
  170. }
  171. } elseif($_GET['type'] == 'template') {
  172. dheader('location: '.ADMINSCRIPT.'?action=styles&operation=import&dir='.$_GET['key']);
  173. } else {
  174. cloudaddons_validator($_GET['key'].'.pack');
  175. cloudaddons_installlog($_GET['key'].'.pack');
  176. if(file_exists(DISCUZ_ROOT.'./data/addonpack/'.$_GET['key'].'.php')) {
  177. dheader('location: '.$_G['siteurl'].'data/addonpack/'.$_GET['key'].'.php');
  178. }
  179. cpmsg('cloudaddons_pack_installed', '', 'succeed');
  180. }
  181. }
  182. }
  183. function dir_clear($dir) {
  184. if($directory = @dir($dir)) {
  185. while($entry = $directory->read()) {
  186. if($entry == '.' || $entry == '..') {
  187. continue;
  188. }
  189. $filename = $dir.'/'.$entry;
  190. if(is_file($filename)) {
  191. @unlink($filename);
  192. } else {
  193. dir_clear($filename);
  194. }
  195. }
  196. $directory->close();
  197. @rmdir($dir);
  198. }
  199. }
  200. ?>