PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/source/function/function_cloud.php

https://github.com/jinbo51/DiscuzX
PHP | 495 lines | 391 code | 98 blank | 6 comment | 94 complexity | 9820d97701bb1c2e49aae2bac0b562ef 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: function_cloud.php 29038 2012-03-23 06:22:39Z songlixin $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. function openCloud() {
  12. global $_G;
  13. require_once libfile('function/cache');
  14. $result = DB::insert('common_setting', array('skey' => 'cloud_status', 'svalue' => '1'), false, true);
  15. updatecache('setting');
  16. if(!empty($_G['setting']['connectsiteid']) || !empty($_G['setting']['connectsitekey']) || !empty($_G['setting']['my_siteid_old']) || !empty($_G['setting']['my_sitekey_sign_old'])) {
  17. DB::delete('common_setting', "`skey` = 'connectsiteid' OR `skey` = 'connectsitekey' OR `skey` = 'my_siteid_old' OR `skey` = 'my_sitekey_sign_old'");
  18. }
  19. return $result;
  20. }
  21. function checkcloudstatus($showMessage = true) {
  22. global $_G;
  23. $res = false;
  24. $cloudStatus = $_G['setting']['cloud_status'];
  25. $site_id = $_G['setting']['my_siteid'];
  26. $site_key = $_G['setting']['my_sitekey'];
  27. if($site_id && $site_key) {
  28. switch($cloudStatus) {
  29. case 1:
  30. $res = 'cloud';
  31. break;
  32. case 2:
  33. $res = 'unconfirmed';
  34. break;
  35. default:
  36. $res = 'upgrade';
  37. }
  38. } elseif(!$cloudStatus && !$site_id && !$site_key) {
  39. $res = 'register';
  40. } elseif($showMessage) {
  41. if(defined('IN_ADMINCP')) {
  42. cpmsg_error('cloud_status_error');
  43. } else {
  44. showmessage('cloud_status_error');
  45. }
  46. }
  47. return $res;
  48. }
  49. function generateSiteSignUrl($params = array(), $isEncode = true, $isCamelCase = false) {
  50. global $_G;
  51. $ts = TIMESTAMP;
  52. $sId = $_G['setting']['my_siteid'];
  53. $sKey = $_G['setting']['my_sitekey'];
  54. $uid = $_G['uid'];
  55. if(!is_array($params)) {
  56. $params = array();
  57. }
  58. unset($params['sig'], $params['ts']);
  59. if ($isCamelCase) {
  60. $params['sId'] = $sId;
  61. $params['sSiteUid'] = $uid;
  62. } else {
  63. $params['s_id'] = $sId;
  64. $params['s_site_uid'] = $uid;
  65. }
  66. ksort($params);
  67. $str = buildArrayQuery($params, '', $isEncode);
  68. $sig = md5(sprintf('%s|%s|%s', $str, $sKey, $ts));
  69. $params['ts'] = $ts;
  70. $params['sig'] = $sig;
  71. $url = buildArrayQuery($params, '', $isEncode);
  72. return $url;
  73. }
  74. function registercloud($cloudApiIp = '') {
  75. global $_G;
  76. require_once DISCUZ_ROOT.'/api/manyou/Manyou.php';
  77. $cloudClient = new Discuz_Cloud_Client();
  78. $returnData = $cloudClient->register();
  79. if($cloudClient->errno == 1 && $cloudApiIp) {
  80. $cloudClient->setCloudIp($cloudApiIp);
  81. $returnData = $cloudClient->register();
  82. if (!$cloudClient->errno) {
  83. DB::query("REPLACE INTO ".DB::table('common_setting')." (`skey`, `svalue`)
  84. VALUES ('cloud_api_ip', '$cloudApiIp')");
  85. }
  86. }
  87. if($cloudClient->errno) {
  88. $result = array('errCode' => $cloudClient->errno, 'errMessage' => $cloudClient->errmsg);
  89. } else {
  90. $sId = intval($returnData['sId']);
  91. $sKey = $returnData['sKey'];
  92. if ($sId && $sKey) {
  93. DB::query("REPLACE INTO ".DB::table('common_setting')." (`skey`, `svalue`)
  94. VALUES ('my_siteid', '$sId'), ('my_sitekey', '$sKey'), ('cloud_status', '2')");
  95. updatecache('setting');
  96. $result = array('errCode' => 0);
  97. } else {
  98. $result = array('errCode' => 2);
  99. }
  100. }
  101. return $result;
  102. }
  103. function upgrademanyou($cloudApiIp = '') {
  104. global $_G;
  105. require_once DISCUZ_ROOT.'/api/manyou/Manyou.php';
  106. $cloudClient = new Discuz_Cloud_Client();
  107. $returnData = $cloudClient->sync();
  108. if($cloudClient->errno == 1 && $cloudApiIp) {
  109. $cloudClient->setCloudIp($cloudApiIp);
  110. $returnData = $cloudClient->sync();
  111. if (!$cloudClient->errno) {
  112. DB::query("REPLACE INTO ".DB::table('common_setting')." (`skey`, `svalue`)
  113. VALUES ('cloud_api_ip', '$cloudApiIp')");
  114. }
  115. }
  116. if($cloudClient->errno) {
  117. $result = array('errCode' => $cloudClient->errno, 'errMessage' => $cloudClient->errmsg);
  118. } else {
  119. $result = array('errCode' => 0);
  120. }
  121. return $result;
  122. }
  123. function getcloudapps($usecache = true) {
  124. global $_G;
  125. $apps = array();
  126. if($usecache) {
  127. $apps = $_G['setting']['cloud_apps'];
  128. } else {
  129. $apps = DB::result_first("SELECT svalue FROM ".DB::table('common_setting')." WHERE skey='cloud_apps'");
  130. }
  131. if($apps && !is_array($apps)) {
  132. $apps = unserialize($apps);
  133. }
  134. if(!$apps) {
  135. $apps = array();
  136. }
  137. return $apps;
  138. }
  139. function getcloudappstatus($appName, $usecache = true) {
  140. $res = false;
  141. $apps = getcloudapps($usecache);
  142. if($apps && $apps[$appName]) {
  143. $res = ($apps[$appName]['status'] == 'normal');
  144. }
  145. return $res;
  146. }
  147. function setcloudappstatus($appName, $status, $usecache = true, $updatecache = true) {
  148. $method = 'setcloudappstatus_'.$appName;
  149. if(!function_exists($method)) {
  150. return false;
  151. }
  152. if(!@call_user_func($method, $appName, $status)) {
  153. return false;
  154. }
  155. $apps = getcloudapps($usecache);
  156. $app = array('name' => $appName, 'status' => $status);
  157. $apps[$appName] = $app;
  158. $apps = addslashes(serialize($apps));
  159. $res = DB::insert('common_setting', array('skey' => 'cloud_apps', 'svalue' => $apps), false, true);
  160. if(!empty($updatecache)) {
  161. require_once libfile('function/cache');
  162. updatecache(array('plugin', 'setting', 'styles'));
  163. }
  164. return $res;
  165. }
  166. function setcloudappstatus_manyou($appName, $status) {
  167. $available = 0;
  168. if($status == 'normal') {
  169. $available = 1;
  170. }
  171. $res = DB::insert('common_setting', array('skey' => 'my_app_status', 'svalue' => $available), false, true);
  172. return $res;
  173. }
  174. function setcloudappstatus_connect($appName, $status) {
  175. $available = 0;
  176. if($status == 'normal') {
  177. $available = 1;
  178. }
  179. $connect_setting = DB::result_first("SELECT svalue FROM ".DB::table('common_setting')." WHERE skey='connect'");
  180. if($connect_setting && !is_array($connect_setting)) {
  181. $connect_setting = unserialize($connect_setting);
  182. }
  183. if(!$connect_setting) {
  184. $connect_setting = array();
  185. }
  186. $connect_setting['allow'] = $available;
  187. $connectnew = addslashes(serialize($connect_setting));
  188. $res = DB::insert('common_setting', array('skey' => 'connect', 'svalue' => $connectnew), false, true);
  189. if(!updatecloudpluginavailable('qqconnect', $available)) {
  190. return false;
  191. }
  192. return $res;
  193. }
  194. function setcloudappstatus_security($appName, $status) {
  195. $available = 0;
  196. if($status == 'normal') {
  197. $available = 1;
  198. }
  199. if(!updatecloudpluginavailable('security', $available)) {
  200. return false;
  201. }
  202. return true;
  203. }
  204. function setcloudappstatus_stats($appName, $status) {
  205. $available = 0;
  206. if($status == 'normal') {
  207. $available = 1;
  208. }
  209. if(!updatecloudpluginavailable('cloudstat', $available)) {
  210. return false;
  211. }
  212. return true;
  213. }
  214. function setcloudappstatus_search($appName, $status) {
  215. global $_G;
  216. $searchData = unserialize($_G['setting']['my_search_data']);
  217. if (!is_array($searchData)) {
  218. $searchData = array();
  219. }
  220. $searchData['isnew'] = 0;
  221. $searchData = addslashes(serialize(dstripslashes($searchData)));
  222. $available = 0;
  223. if($status == 'normal') {
  224. $available = 1;
  225. }
  226. $res = DB::insert('common_setting', array('skey' => 'my_search_data', 'svalue' => $searchData), false, true);
  227. if($available) {
  228. require_once DISCUZ_ROOT.'./api/manyou/Manyou.php';
  229. SearchHelper::allowSearchForum();
  230. }
  231. updatecloudpluginavailable('cloudsearch', $available);
  232. return true;
  233. }
  234. function setcloudappstatus_smilies($appName, $status) {
  235. $available = 0;
  236. if($status == 'normal') {
  237. $available = 1;
  238. }
  239. if(!updatecloudpluginavailable('soso_smilies', $available)) {
  240. return false;
  241. }
  242. return true;
  243. }
  244. function setcloudappstatus_storage($appName, $status) {
  245. $available = 0;
  246. if ($status == 'normal') {
  247. $available = 1;
  248. }
  249. if (!updatecloudpluginavailable('xf_storage', $available)) {
  250. return false;
  251. }
  252. return true;
  253. }
  254. function setcloudappstatus_qqgroup($appName, $status) {
  255. return true;
  256. }
  257. function setcloudappstatus_union($appName, $status) {
  258. return true;
  259. }
  260. function updatecloudpluginavailable($identifier, $available) {
  261. $available = intval($available);
  262. $identifier = addslashes(strval($identifier));
  263. $pluginId = DB::result_first("SELECT pluginid FROM ".DB::table('common_plugin')." WHERE identifier='$identifier'");
  264. if($pluginId) {
  265. DB::update('common_plugin', array('available' => $available), array('pluginid' => $pluginId));
  266. } else {
  267. return false;
  268. }
  269. return true;
  270. }
  271. function headerLocation($url) {
  272. ob_end_clean();
  273. ob_start();
  274. @header('location: '.$url);
  275. exit;
  276. }
  277. function buildArrayQuery($data, $key = '', $isEncode = false) {
  278. if ($key) {
  279. $query = array($key => $data);
  280. } else {
  281. $query = $data;
  282. }
  283. if ($isEncode) {
  284. return cloud_http_build_query($query, '', '&');
  285. } else {
  286. return cloud_http_build_query($query);
  287. }
  288. }
  289. function cloud_http_build_query($data, $numeric_prefix='', $arg_separator='', $prefix='') {
  290. $render = array();
  291. if (empty($arg_separator)) {
  292. $arg_separator = @ini_get('arg_separator.output');
  293. empty($arg_separator) && $arg_separator = '&';
  294. }
  295. foreach ((array) $data as $key => $val) {
  296. if (is_array($val) || is_object($val)) {
  297. $_key = empty($prefix) ? "{$key}[%s]" : sprintf($prefix, $key) . "[%s]";
  298. $_render = cloud_http_build_query($val, '', $arg_separator, $_key);
  299. if (!empty($_render)) {
  300. $render[] = $_render;
  301. }
  302. } else {
  303. if (is_numeric($key) && empty($prefix)) {
  304. $render[] = urlencode("{$numeric_prefix}{$key}") . "=" . urlencode($val);
  305. } else {
  306. if (!empty($prefix)) {
  307. $_key = sprintf($prefix, $key);
  308. $render[] = urlencode($_key) . "=" . urlencode($val);
  309. } else {
  310. $render[] = urlencode($key) . "=" . urlencode($val);
  311. }
  312. }
  313. }
  314. }
  315. $render = implode($arg_separator, $render);
  316. if (empty($render)) {
  317. $render = '';
  318. }
  319. return $render;
  320. }
  321. function cloud_get_api_version() {
  322. return '0.4';
  323. }
  324. function cloud_init_uniqueid() {
  325. $siteuniqueid = DB::result_first("SELECT svalue FROM ".DB::table('common_setting')." WHERE skey='siteuniqueid'");
  326. if(empty($siteuniqueid) || strlen($siteuniqueid) < 16) {
  327. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
  328. $siteuniqueid = 'DX'.$chars[date('y')%60].$chars[date('n')].$chars[date('j')].$chars[date('G')].$chars[date('i')].$chars[date('s')].substr(md5($_G['clientip'].$_G['username'].TIMESTAMP), 0, 4).random(4);
  329. $unique = array(
  330. 'skey' => 'siteuniqueid',
  331. 'svalue' => $siteuniqueid
  332. );
  333. DB::insert('common_setting', $unique, false, true);
  334. }
  335. }
  336. function show() {
  337. global $_G;
  338. if ($_G['adminid'] != 1) {
  339. return false;
  340. }
  341. include_once DISCUZ_ROOT . '/source/discuz_version.php';
  342. $release = DISCUZ_RELEASE;
  343. $fix = defined(DISCUZ_FIXBUG) ? DISCUZ_FIXBUG : '';
  344. $cloudApi = cloud_get_api_version();
  345. include_once libfile('function/admincp');
  346. $isfounder = checkfounder($_G['member']);
  347. $sId = $_G['setting']['my_siteid'];
  348. $version = $_G['setting']['version'];
  349. $ts = TIMESTAMP;
  350. $sig = '';
  351. if ($sId) {
  352. $params = array(
  353. 's_id' => $sId,
  354. 'product_version' => $version,
  355. 'product_release' => $release,
  356. 'fix_bug' => $fix,
  357. 'is_founder' => $isfounder,
  358. 's_url' => $_G[siteurl],
  359. 'last_send_time' => $_COOKIE['dctips'],
  360. );
  361. ksort($params);
  362. $str = buildArrayQuery($params, '', '&');
  363. $sig = md5(sprintf('%s|%s|%s', $str, $_G['setting']['my_sitekey'], $ts));
  364. }
  365. $jsCode = <<< EOF
  366. <div id="discuz_tips" style="display:none;"></div>
  367. <script type="text/javascript">
  368. var discuzSId = '$sId';
  369. var discuzVersion = '$version';
  370. var discuzRelease = '$release';
  371. var discuzApi = '$cloudApi';
  372. var discuzIsFounder = '$isfounder';
  373. var discuzFixbug = '$fix';
  374. var ts = '$ts';
  375. var sig = '$sig';
  376. </script>
  377. <script src="http://discuz.gtimg.cn/cloud/scripts/discuz_tips.js?v=1" type="text/javascript" charset="UTF-8"></script>
  378. EOF;
  379. echo $jsCode;
  380. }
  381. function checkfounder($user = '') {
  382. global $_G;
  383. $user = empty($user) ? getglobal('member') : $user;
  384. $founders = str_replace(' ', '', $_G['config']['admincp']['founder']);
  385. if(!$user['uid'] || $user['groupid'] != 1 || $user['adminid'] != 1) {
  386. return false;
  387. } elseif(empty($founders)) {
  388. return true;
  389. } elseif(strexists(",$founders,", ",$user[uid],")) {
  390. return true;
  391. } elseif(!is_numeric($user['username']) && strexists(",$founders,", ",$user[username],")) {
  392. return true;
  393. } else {
  394. return FALSE;
  395. }
  396. }
  397. ?>