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

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