国内流行的内容管理系统(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.

319 lines
10KB

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