国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

348 linhas
11KB

  1. <?php
  2. /**
  3. * 生成模块
  4. *
  5. * @version $Id: module_make.php 1 14:17 2010年7月20日Z tianya $
  6. * @package DedeCMS.Administrator
  7. * @copyright Copyright (c) 2020, DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. @set_time_limit(0);
  12. require_once(dirname(__FILE__) . "/config.php");
  13. require_once(dirname(__FILE__) . "/../include/dedemodule.class.php");
  14. CheckPurview('sys_module');
  15. if (empty($action)) $action = '';
  16. if ($action == '') {
  17. $modules = array();
  18. require_once(dirname(__FILE__) . "/templets/module_make.htm");
  19. exit();
  20. }
  21. /*-------------
  22. //生成项目
  23. function Makemodule()
  24. --------------*/ else if ($action == 'make') {
  25. require_once(DEDEINC . '/dedehttpdown.class.php');
  26. // 校验私钥,确定开发者身份
  27. $devURL = DEDECDNURL . "/developers/$dev_id.json";
  28. $dhd = new DedeHttpDown();
  29. $dhd->OpenUrl($devURL);
  30. $devContent = $dhd->GetHtml();
  31. $devInfo = (array)json_decode($devContent);
  32. if (($devInfo['auth_at'] + 60 * 60 * 24 * 365) < time()) {
  33. ShowMsg("您的开发者账号已经过期,请登录www.dedebiz.com重新申请!", "-1");
  34. exit();
  35. }
  36. $filelist = str_replace("\r", "\n", trim($filelist));
  37. $filelist = trim(preg_replace("#[\n]{1,}#", "\n", $filelist));
  38. if ($filelist == '') {
  39. ShowMsg("对不起,你没有指定模块的文件列表,因此不能创建项目!", "-1");
  40. exit();
  41. }
  42. if (empty($dev_id)) {
  43. ShowMsg("开发者ID不能为空!", "-1");
  44. exit();
  45. }
  46. if (empty($priv)) {
  47. ShowMsg("请填写开发者私钥信息", "-1");
  48. exit();
  49. }
  50. if (strlen($modulname) > 150) {
  51. ShowMsg("模块名称过长", "-1");
  52. exit();
  53. }
  54. // 校验私钥合法性
  55. $enstr = json_encode(array(
  56. "module_name" => $modulname,
  57. "dev_id" => $devInfo['dev_id'],
  58. ));
  59. // 私钥加密模块信息
  60. openssl_private_encrypt($enstr, $encotent, $priv);
  61. $moduleInfo = base64url_encode($encotent);
  62. openssl_public_decrypt($encotent, $decontent, $devInfo['pub_key']);
  63. $minfo = (array)json_decode($decontent);
  64. if ($minfo['module_name'] != $modulname || $minfo['dev_id'] != $devInfo['dev_id']) {
  65. ShowMsg("开发者私钥校验失败,请确保填写正确的开发者私钥", "-1");
  66. exit();
  67. }
  68. //去除转义
  69. foreach ($_POST as $k => $v) $$k = stripslashes($v);
  70. if (!isset($autosetup)) $autosetup = 0;
  71. if (!isset($autodel)) $autodel = 0;
  72. $mdir = DEDEDATA . '/module';
  73. $hashcode = md5($modulname . $devInfo['dev_id']);
  74. $moduleFilename = $mdir . '/' . $hashcode . '.xml';
  75. $menustring = base64_encode($menustring);
  76. $indexurl = str_replace('=', '**', $indexurl);
  77. $dm = new DedeModule($mdir);
  78. if ($dm->HasModule($hashcode)) {
  79. $dm->Clear();
  80. ShowMsg("对不起,你指定同名模块已经存在,因此不能创建项目!<br>如果你要更新这个模块,请先删除:module/{$hashcode}.xml", "-1");
  81. exit();
  82. }
  83. $readmef = $setupf = $uninstallf = '';
  84. if (empty($readmetxt)) {
  85. move_uploaded_file($readme, $mdir . "/{$hashcode}-r.html") or die("你没填写说明或上传说明文件!");
  86. $readmef = $dm->GetEncodeFile($mdir . "/{$hashcode}-r.html", TRUE);
  87. } else {
  88. $readmetxt = "<p style='line-height:150%'>" . $readmetxt;
  89. $readmetxt = preg_replace("#[\r\n]{1,}#", "<br />\r\n", $readmetxt);
  90. $readmetxt .= "</p>";
  91. $readmef = base64_encode(trim($readmetxt));
  92. }
  93. if ($autosetup == 0) {
  94. move_uploaded_file($setup, $mdir . "/{$hashcode}-s.php") or die("你没上传,或系统无法把setup文件移动到 module 目录!");
  95. $setupf = $dm->GetEncodeFile($mdir . "/{$hashcode}-s.php", TRUE);
  96. }
  97. if ($autodel == 0) {
  98. move_uploaded_file($uninstall, $mdir . "/{$hashcode}-u.php") or die("你没上传,或系统无法把uninstall文件移动到 module 目录!");
  99. $uninstallf = $dm->GetEncodeFile($mdir . "/{$hashcode}-u.php", TRUE);
  100. }
  101. if (trim($setupsql40) == '') $setupsql40 = '';
  102. else $setupsql40 = base64_encode(trim($setupsql40));
  103. //if(trim($setupsql41)=='') $setupsql41 = '';
  104. //else $setupsql41 = base64_encode(trim($setupsql41));
  105. if (trim($delsql) == '') $delsql = '';
  106. else $delsql = base64_encode(trim($delsql));
  107. $pub_key = base64url_encode($devInfo['pub_key']);
  108. $modulinfo = "<module>
  109. <baseinfo>
  110. name={$modulname}
  111. dev_id={$devInfo['dev_id']}
  112. pubkey={$pub_key}
  113. info={$moduleInfo}
  114. time={$mtime}
  115. hash={$hashcode}
  116. indexname={$indexname}
  117. indexurl={$indexurl}
  118. ismember={$ismember}
  119. autosetup={$autosetup}
  120. autodel={$autodel}
  121. lang=utf-8
  122. moduletype={$moduletype}
  123. </baseinfo>
  124. <systemfile>
  125. <menustring>
  126. $menustring
  127. </menustring>
  128. <readme>
  129. {$readmef}
  130. </readme>
  131. <setupsql40>
  132. $setupsql40
  133. </setupsql40>
  134. <delsql>
  135. $delsql
  136. </delsql>
  137. <setup>
  138. {$setupf}
  139. </setup>
  140. <uninstall>
  141. {$uninstallf}
  142. </uninstall>
  143. <oldfilelist>
  144. $filelist
  145. </oldfilelist>
  146. </systemfile>
  147. ";
  148. $filelists = explode("\n", $filelist);
  149. foreach ($filelists as $v) {
  150. $v = trim($v);
  151. if (!empty($v)) $dm->MakeEncodeFileTest(dirname(__FILE__), $v);
  152. }
  153. //测试无误后编译安装包
  154. $fp = fopen($moduleFilename, 'w');
  155. fwrite($fp, $modulinfo);
  156. fwrite($fp, "<modulefiles>\r\n");
  157. foreach ($filelists as $v) {
  158. $v = trim($v);
  159. if (!empty($v)) $dm->MakeEncodeFile(dirname(__FILE__), $v, $fp);
  160. }
  161. fwrite($fp, "</modulefiles>\r\n");
  162. fwrite($fp, "</module>\r\n");
  163. fclose($fp);
  164. ShowMsg("成功对一个新模块进行编译!", "module_main.php");
  165. exit();
  166. }
  167. /*-------------
  168. //修改项目
  169. function editModule()
  170. --------------*/ else if ($action == 'edit') {
  171. $filelist = str_replace("\r", "\n", trim($filelist));
  172. $filelist = trim(preg_replace("#[\n]{1,}#", "\n", $filelist));
  173. if ($filelist == "") {
  174. ShowMsg("对不起,你没有指定模块的文件列表,因此不能创建项目!", "-1");
  175. exit();
  176. }
  177. if (empty($dev_id)) {
  178. ShowMsg("开发者ID不能为空!", "-1");
  179. exit();
  180. }
  181. if (empty($priv)) {
  182. ShowMsg("请填写开发者私钥信息", "-1");
  183. exit();
  184. }
  185. // 校验私钥,确定开发者身份
  186. $devURL = DEDECDNURL . "/developers/$dev_id.json";
  187. $dhd = new DedeHttpDown();
  188. $dhd->OpenUrl($devURL);
  189. $devContent = $dhd->GetHtml();
  190. $devInfo = (array)json_decode($devContent);
  191. if (($devInfo['auth_at'] + 60 * 60 * 24 * 365) < time()) {
  192. ShowMsg("您的开发者账号已经过期,请登录www.dedebiz.com重新申请!", "-1");
  193. exit();
  194. }
  195. if (strlen($modulname) > 150) {
  196. ShowMsg("模块名称过长", "-1");
  197. exit();
  198. }
  199. // 校验私钥合法性
  200. $enstr = json_encode(array(
  201. "module_name" => $modulname,
  202. "dev_id" => $devInfo['dev_id'],
  203. ));
  204. // 私钥加密模块信息
  205. openssl_private_encrypt($enstr, $encotent, $priv);
  206. $moduleInfo = base64url_encode($encotent);
  207. openssl_public_decrypt($encotent, $decontent, $devInfo['pub_key']);
  208. $minfo = (array)json_decode($decontent);
  209. if ($minfo['module_name'] != $modulname || $minfo['dev_id'] != $devInfo['dev_id']) {
  210. ShowMsg("开发者私钥校验失败,请确保填写正确的开发者私钥", "-1");
  211. exit();
  212. }
  213. //已经去除转义
  214. foreach ($_POST as $k => $v) $$k = stripslashes($v);
  215. if (!isset($autosetup)) $autosetup = 0;
  216. if (!isset($autodel)) $autodel = 0;
  217. $mdir = DEDEDATA . '/module';
  218. $hashcode = $hash;
  219. $moduleFilename = $mdir . '/' . $hashcode . '.xml';
  220. $modulname = str_replace('=', '', $modulname);
  221. $indexurl = str_replace('=', '**', $indexurl);
  222. $menustring = base64_encode($menustring);
  223. $dm = new DedeModule($mdir);
  224. $readmef = base64_encode($readmetxt);
  225. $setupf = $uninstallf = '';
  226. //编译setup文件
  227. if (is_uploaded_file($setup)) {
  228. move_uploaded_file($setup, $mdir . "/{$hashcode}-s.php") or die("你没上传,或系统无法把setup文件移动到 module 目录!");
  229. $setupf = $dm->GetEncodeFile($mdir . "/{$hashcode}-s.php", TRUE);
  230. } else {
  231. if ($autosetup == 0) $setupf = base64_encode($dm->GetSystemFile($hashcode, 'setup'));
  232. }
  233. //编译uninstall文件
  234. if (is_uploaded_file($uninstall)) {
  235. move_uploaded_file($uninstall, $mdir . "/{$hashcode}-u.php") or die("你没上传,或系统无法把uninstall文件移动到 module 目录!");
  236. $uninstallf = $dm->GetEncodeFile($mdir . "/{$hashcode}-u.php", true);
  237. } else {
  238. if ($autodel == 0) $uninstallf = base64_encode($dm->GetSystemFile($hashcode, 'uninstall'));
  239. }
  240. if (trim($setupsql40) == '') $setupsql40 = '';
  241. else $setupsql40 = base64_encode(htmlspecialchars_decode(trim($setupsql40)));
  242. //if(trim($setupsql41)=='') $setupsql41 = '';
  243. //else $setupsql41 = base64_encode(trim($setupsql41));
  244. if (trim($delsql) == '') $delsql = '';
  245. else $delsql = base64_encode(strip_tags(trim($delsql)));
  246. $modulinfo = "<module>
  247. <baseinfo>
  248. name={$modulname}
  249. dev_id={$devInfo['dev_id']}
  250. pubkey={$devInfo['pub_key']}
  251. info={$moduleInfo}
  252. time={$mtime}
  253. hash={$hashcode}
  254. indexname={$indexname}
  255. indexurl={$indexurl}
  256. ismember={$ismember}
  257. autosetup={$autosetup}
  258. autodel={$autodel}
  259. lang=utf-8
  260. moduletype={$moduletype}
  261. </baseinfo>
  262. <systemfile>
  263. <menustring>
  264. $menustring
  265. </menustring>
  266. <readme>
  267. {$readmef}
  268. </readme>
  269. <setupsql40>
  270. $setupsql40
  271. </setupsql40>
  272. <delsql>
  273. $delsql
  274. </delsql>
  275. <setup>
  276. {$setupf}
  277. </setup>
  278. <uninstall>
  279. {$uninstallf}
  280. </uninstall>
  281. <oldfilelist>
  282. $filelist
  283. </oldfilelist>
  284. </systemfile>
  285. ";
  286. if ($rebuild == 'yes') {
  287. $filelists = explode("\n", $filelist);
  288. foreach ($filelists as $v) {
  289. $v = trim($v);
  290. if (!empty($v)) $dm->MakeEncodeFileTest(dirname(__FILE__), $v);
  291. }
  292. //测试无误后编译安装包
  293. $fp = fopen($moduleFilename, 'w');
  294. fwrite($fp, $modulinfo . "\r\n");
  295. fwrite($fp, "<modulefiles>\r\n");
  296. foreach ($filelists as $v) {
  297. $v = trim($v);
  298. if (!empty($v)) $dm->MakeEncodeFile(dirname(__FILE__), $v, $fp);
  299. }
  300. fwrite($fp, "</modulefiles>\r\n");
  301. fwrite($fp, "</module>\r\n");
  302. fclose($fp);
  303. } else {
  304. $fxml = $dm->GetFileXml($hashcode);
  305. $fp = fopen($moduleFilename, 'w');
  306. fwrite($fp, $modulinfo . "\r\n");
  307. fwrite($fp, $fxml);
  308. fclose($fp);
  309. }
  310. ShowMsg("成功对模块重新编译!", "module_main.php");
  311. exit();
  312. }
  313. //ClearAllLink();