admincp_cloudaddons.php 8.0 KB

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