国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
11KB

  1. <?php
  2. /**
  3. * 后台api接口
  4. *
  5. * @version $id:api.php 8:26 2022年11月20日 tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2022 DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. define('AJAXLOGIN', TRUE);
  12. define('IS_DEDEAPI', TRUE);
  13. define('DEDEADMIN', str_replace("\\", '/', dirname(__FILE__)));
  14. require_once(DEDEADMIN.'/../system/common.inc.php');
  15. require_once(DEDEINC.'/userlogin.class.php');
  16. AjaxHead();
  17. helper('cache');
  18. $action = isset($action) && in_array($action, array('is_need_check_code', 'has_new_version', 'get_changed_files', 'update_backup', 'get_update_versions', 'update')) ? $action : '';
  19. $curDir = dirname(GetCurUrl()); //当前目录
  20. /**
  21. * 登录鉴权
  22. *
  23. * @return void
  24. */
  25. function checkLogin()
  26. {
  27. $cuserLogin = new userLogin();
  28. if ($cuserLogin->getUserID() <= 0 || $cuserLogin->getUserType() != 10) {
  29. echo json_encode(array(
  30. "code" => -1,
  31. "msg" => "当前操作需要登录超级管理员账号",
  32. "data" => null,
  33. ));
  34. exit;
  35. }
  36. }
  37. if ($action === 'is_need_check_code') {
  38. $cuserLogin = new userLogin();
  39. $isNeed = $cuserLogin->isNeedCheckCode($userid);
  40. echo json_encode(array(
  41. "code" => 0,
  42. "msg" => "",
  43. "data" => array(
  44. "isNeed" => $isNeed,
  45. ),
  46. ));
  47. exit;
  48. } else if ($action === 'has_new_version') {
  49. //判断版本更新差异sql
  50. $unQueryVer = array();
  51. if (!TableHasField("#@__tagindex", "keywords")) {
  52. $unQueryVer[] = "6.0.2";
  53. }
  54. if (!TableHasField("#@__feedback", "replycount")) {
  55. $unQueryVer[] = "6.0.3";
  56. }
  57. if (!TableHasField("#@__arctype", "litimg")) {
  58. $unQueryVer[] = "6.1.0";
  59. }
  60. if (!$dsql->IsTable("#@__statistics")) {
  61. $unQueryVer[] = "6.1.7";
  62. }
  63. if (TableHasField("#@__tagindex", "tag_pinyin")) {
  64. $unQueryVer[] = "6.1.8";
  65. }
  66. if (!TableHasField("#@__admin", "pwd_new")) {
  67. $unQueryVer[] = "6.1.9";
  68. }
  69. if (!TableHasField("#@__arctype", "cnoverview")) {
  70. $unQueryVer[] = "6.1.10";
  71. }
  72. if (!TableHasField("#@__admin", "loginerr") || !TableHasField("#@__member", "loginerr")) {
  73. $unQueryVer[] = "6.2.0";
  74. }
  75. if (count($unQueryVer) > 0) {
  76. $upsqls = GetUpdateSQL();
  77. foreach ($unQueryVer as $vv) {
  78. $ss = $upsqls[$vv];
  79. foreach ($ss as $s) {
  80. if (trim($s) != '') {
  81. $dsql->safeCheck = false;
  82. $dsql->ExecuteNoneQuery(trim($s));
  83. $dsql->safeCheck = true;
  84. }
  85. }
  86. }
  87. }
  88. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  89. checkLogin();
  90. //是否存在更新版本
  91. $phpv = phpversion();
  92. $sp_os = PHP_OS;
  93. $mysql_ver = $dsql->GetVersion();
  94. $nurl = $_SERVER['HTTP_HOST'];
  95. if (preg_match("#[a-z\-]{1,}\.[a-z]{2,}#i", $nurl)) {
  96. $nurl = urlencode($nurl);
  97. } else {
  98. $nurl = "test";
  99. }
  100. $add_query = '';
  101. $query = "SELECT COUNT(*) AS dd FROM `#@__member` ";
  102. $row1 = $dsql->GetOne($query);
  103. if ($row1) $add_query .= "&mcount={$row1['dd']}";
  104. $query = "SELECT COUNT(*) AS dd FROM `#@__arctiny` ";
  105. $row2 = $dsql->GetOne($query);
  106. if ($row2) $add_query .= "&acount={$row2['dd']}";
  107. $offUrl = DEDEBIZURL."/version?version={$cfg_version_detail}&formurl={$nurl}&phpver={$phpv}&os={$sp_os}&mysqlver={$mysql_ver}{$add_query}&json=1";
  108. $dhd = new DedeHttpDown();
  109. $dhd->OpenUrl($offUrl);
  110. $data = $dhd->GetHtml();
  111. if (empty($data)) {
  112. echo json_encode(array(
  113. "code"=>-1,
  114. "msg"=>'获取版本信息失败',
  115. ));
  116. } else {
  117. echo $data;
  118. }
  119. } else if ($action === 'get_changed_files') {
  120. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  121. checkLogin();
  122. //获取本地更改过的文件
  123. $hashUrl = DEDEBIZCDN.'/release/'.$cfg_version_detail.'.json';
  124. $dhd = new DedeHttpDown();
  125. $dhd->OpenUrl($hashUrl);
  126. $data = $dhd->GetJSON();
  127. if (empty($data)) {
  128. echo json_encode(array(
  129. "code"=>-1,
  130. "msg"=>'获取版本信息失败',
  131. ));
  132. exit();
  133. }
  134. $changedFiles = array();
  135. foreach ($data as $file) {
  136. $realFile = DEDEROOT.str_replace("\\", '/', $file->filename);
  137. if (file_exists($realFile) && md5_file($realFile) !== $file->hash) {
  138. $changedFiles[] = $file;
  139. continue;
  140. }
  141. }
  142. echo json_encode(array(
  143. "code" => 0,
  144. "msg" => "",
  145. "data" => array(
  146. "files" => $changedFiles,
  147. ),
  148. ));
  149. exit;
  150. } else if ($action === 'update_backup') {
  151. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  152. checkLogin();
  153. //获取本地更改过的文件
  154. $hashUrl = DEDEBIZCDN.'/release/'.$cfg_version_detail.'.json';
  155. $dhd = new DedeHttpDown();
  156. $dhd->OpenUrl($hashUrl);
  157. $data = $dhd->GetJSON();
  158. if (empty($data)) {
  159. echo json_encode(array(
  160. "code"=>-1,
  161. "msg"=>'获取版本信息失败',
  162. ));
  163. exit;
  164. }
  165. $changedFiles = array();
  166. $enkey = substr(md5(substr($cfg_cookie_encode, 0, 5)), 0, 10);
  167. $backupPath = DEDEDATA."/backupfile_{$enkey}";
  168. RmRecurse($backupPath);
  169. mkdir($backupPath);
  170. foreach ($data as $file) {
  171. $realFile = DEDEROOT.str_replace("\\", '/', $file->filename);
  172. if (file_exists($realFile) && md5_file($realFile) !== $file->hash) {
  173. //备份文件
  174. $dstFile = $backupPath.'/'.str_replace("\\", '/', $file->filename);
  175. @mkdir(dirname($dstFile), 0777, true);
  176. copy($realFile, $dstFile);
  177. }
  178. }
  179. echo json_encode(array(
  180. "code" => 0,
  181. "msg" => "",
  182. "data" => array(
  183. "backupdir" => "data/backupfile_{$enkey}",
  184. ),
  185. ));
  186. exit;
  187. } else if ($action === 'get_update_versions') {
  188. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  189. checkLogin();
  190. //获取本地更改过的文件
  191. $offUrl = DEDEBIZURL."/versions?version={$cfg_version_detail}";
  192. $dhd = new DedeHttpDown();
  193. $dhd->OpenUrl($offUrl);
  194. $data = $dhd->GetHtml();
  195. if (empty($data)) {
  196. echo json_encode(array(
  197. "code"=>-1,
  198. "msg"=>'获取版本信息失败',
  199. ));
  200. exit;
  201. }
  202. $arr = json_decode($data);
  203. SetCache('update', 'vers', $arr->result->Versions);
  204. echo $data;
  205. exit;
  206. } else if ($action === 'update') {
  207. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  208. $row = GetCache('update', 'vers');
  209. if (count($row) === 0) {
  210. echo json_encode(array(
  211. "code" => -1,
  212. "msg" => "请先获取版本更新记录",
  213. "data" => null,
  214. ));
  215. exit;
  216. }
  217. $enkey = substr(md5(substr($cfg_cookie_encode, 0, 5)), 0, 10);
  218. $backupPath = DEDEDATA."/updatefile_{$enkey}";
  219. @mkdir($backupPath);
  220. foreach ($row as $k => $ver) {
  221. if ($ver->isdownload !== true) {
  222. $filesUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/files.txt';
  223. $dhd = new DedeHttpDown();
  224. $dhd->OpenUrl($filesUrl);
  225. $fileList = $dhd->GetJSON();
  226. $dhd->Close();
  227. $backupVerPath = $backupPath.'/'.$ver->ver;
  228. RmRecurse($backupVerPath);
  229. mkdir($backupVerPath);
  230. foreach ($fileList as $f) {
  231. if (!preg_match("/^\//", $f->filename)) {
  232. //忽略src之外的目录
  233. continue;
  234. }
  235. $fileUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/src'.$f->filename;
  236. $dhd = new DedeHttpDown();
  237. $dhd->OpenUrl($fileUrl);
  238. $fData = $dhd->GetHtml();
  239. $dhd->Close();
  240. $f->filename = preg_replace('/^\/admin/', $curDir, $f->filename);
  241. $realFile = $backupVerPath.$f->filename;
  242. @mkdir(dirname($realFile), 0777, true);
  243. file_put_contents($realFile, $fData);
  244. }
  245. $sqlUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/update.sql';
  246. $dhd = new DedeHttpDown();
  247. $dhd->OpenUrl($sqlUrl);
  248. $fData = $dhd->GetHtml();
  249. $dhd->Close();
  250. $realFile = $backupVerPath.'/update.sql';
  251. file_put_contents($realFile, $fData);
  252. $realFile = $backupVerPath.'/files.txt';
  253. file_put_contents($realFile, json_encode($fileList));
  254. $row[$k]->isdownload = true;
  255. SetCache('update', 'vers', $row);
  256. echo json_encode(array(
  257. "code" => 0,
  258. "msg" => "正在下载{$ver->ver}的版本更新文件",
  259. "data" => array(
  260. "finish" => false,
  261. ),
  262. ));
  263. exit;
  264. }
  265. }
  266. foreach ($row as $k => $ver) {
  267. if ($ver->ispatched !== true) {
  268. $backupVerPath = $backupPath.'/'.$ver->ver;
  269. //执行更新SQL文件
  270. $sql = file_get_contents($backupVerPath.'/update.sql');
  271. if (!empty($sql)) {
  272. $sql = preg_replace('#ENGINE=MyISAM#i', 'TYPE=MyISAM', $sql);
  273. $sql41tmp = 'ENGINE=MyISAM DEFAULT CHARSET='.$cfg_db_language;
  274. $sql = preg_replace('#TYPE=MyISAM#i', $sql41tmp, $sql);
  275. $sqls = explode(";\r\n", $sql);
  276. foreach ($sqls as $sql) {
  277. if (trim($sql) != '') {
  278. $dsql->safeCheck = false;
  279. $dsql->ExecuteNoneQuery(trim($sql));
  280. $dsql->safeCheck = true;
  281. }
  282. }
  283. }
  284. //复制文件
  285. $fileList = json_decode(file_get_contents($backupVerPath.'/files.txt'));
  286. foreach ($fileList as $f) {
  287. if (!preg_match("/^\//", $f->filename)) {
  288. //忽略src之外的目录
  289. continue;
  290. }
  291. $f->filename = preg_replace('/^\/admin/', $curDir, $f->filename);
  292. $srcFile = $backupVerPath.$f->filename;
  293. $dstFile = str_replace(array("\\", "//"), '/', DEDEROOT.$f->filename);
  294. $rs = @copy($srcFile, $dstFile);
  295. if ($rs) {
  296. unlink($srcFile);
  297. }
  298. }
  299. $row[$k]->ispatched = true;
  300. SetCache('update', 'vers', $row);
  301. RmRecurse($backupVerPath);
  302. echo json_encode(array(
  303. "code" => 0,
  304. "msg" => "正在应用{$ver->ver}的版本补丁文件",
  305. "data" => array(
  306. "finish" => false,
  307. ),
  308. ));
  309. exit;
  310. }
  311. }
  312. echo json_encode(array(
  313. "code" => 0,
  314. "msg" => "",
  315. "data" => array(
  316. "finish" => true,
  317. ),
  318. ));
  319. exit;
  320. }
  321. ?>